<?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: aileen vl</title>
    <description>The latest articles on Forem by aileen vl (@aileenvl).</description>
    <link>https://forem.com/aileenvl</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%2F7463%2Fd405223f-d109-4475-aef9-81f41cf004e5.JPEG</url>
      <title>Forem: aileen vl</title>
      <link>https://forem.com/aileenvl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aileenvl"/>
    <language>en</language>
    <item>
      <title>Stop Burning Tokens on Redundant Context: Why your AGENTS.md is failing</title>
      <dc:creator>aileen vl</dc:creator>
      <pubDate>Wed, 25 Feb 2026 01:28:04 +0000</pubDate>
      <link>https://forem.com/aileenvl/stop-burning-tokens-on-redundant-context-why-your-agentsmd-is-failing-3cpn</link>
      <guid>https://forem.com/aileenvl/stop-burning-tokens-on-redundant-context-why-your-agentsmd-is-failing-3cpn</guid>
      <description>&lt;p&gt;&lt;strong&gt;Choose your language / Elige tu idioma:&lt;/strong&gt;&lt;br&gt;
🇺🇸 English Version | 🇲🇽 Versión en Español&lt;/p&gt;




&lt;h2&gt;
  
  
  Stop Burning Tokens on Redundant Context &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;There is a ritual that has become almost universal among developers adopting AI coding agents: You set up a new project, run a command like &lt;code&gt;/init&lt;/code&gt;, and watch an agent generate a shiny &lt;code&gt;AGENTS.md&lt;/code&gt; (or &lt;code&gt;CLAUDE.md&lt;/code&gt;). It feels responsible. You feel like you’ve given your agent a "map" of the codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But here is the reality check: you might be making your agent slower, more expensive, and less accurate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inspired by &lt;a href="https://addyosmani.com/blog/agents-md/" rel="noopener noreferrer"&gt;Addy Osmani’s recent deep-dive&lt;/a&gt;, I started looking into the data behind this "context ritual." Recent research from 2026 reveals a counter reality: auto generated context files can actually &lt;strong&gt;reduce task success by 2-3%&lt;/strong&gt; while &lt;strong&gt;inflating costs by over 20%&lt;/strong&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Redundancy Loop
&lt;/h2&gt;

&lt;p&gt;Why does this happen? According to research from &lt;strong&gt;ETH Zurich&lt;/strong&gt; (&lt;a href="https://arxiv.org/abs/2601.20404" rel="noopener noreferrer"&gt;Kocetkov et al., 2026&lt;/a&gt;), we are often giving agents a map of a room they are already standing in. If an agent can already see your &lt;code&gt;package.json&lt;/code&gt;, your directory structure, and your docstrings, telling it "this is a React project" is just noise. &lt;/p&gt;

&lt;p&gt;When you hand an LLM the same information twice, you aren't "reinforcing" it you are diluting its attention. Every redundant token in your context file competes with the actual task you want the agent to perform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Focus on "Invisible Logic"
&lt;/h2&gt;

&lt;p&gt;In my view, a &lt;code&gt;README.md&lt;/code&gt; is for humans to understand the &lt;em&gt;story&lt;/em&gt; of the project. An &lt;code&gt;AGENTS.md&lt;/code&gt; should only contain the &lt;strong&gt;Invisible Logic&lt;/strong&gt; the stuff that isn't obvious from reading the code itself.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Don't:&lt;/strong&gt; Describe the tech stack or folder names (The agent can discover this via &lt;code&gt;ls&lt;/code&gt; or &lt;code&gt;grep&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Do:&lt;/strong&gt; Document the &lt;strong&gt;Silent Constraints&lt;/strong&gt;. For example: "The &lt;code&gt;/legacy&lt;/code&gt; module is deprecated but required for the CI/CD pipeline—do not refactor." &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sharding Context: Why BMAD and Spec Kit are the future
&lt;/h2&gt;

&lt;p&gt;One massive, monolithic file at the root of your repo is a structural failure for complex projects. A study by &lt;strong&gt;Lulla et al.&lt;/strong&gt; (&lt;a href="https://arxiv.org/abs/2602.11988" rel="noopener noreferrer"&gt;2026&lt;/a&gt;) showed that well maintained context files can improve efficiency, but only if they are relevant to the task.&lt;/p&gt;

&lt;p&gt;This is where my recent experience with &lt;strong&gt;BMAD&lt;/strong&gt; and &lt;strong&gt;Spec Kit&lt;/strong&gt; comes in. These frameworks move away from "one file to rule them all" and toward &lt;strong&gt;Context Sharding&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;BMAD:&lt;/strong&gt; It allows you to shard context into roles (Analyst, Architect, Coder), ensuring each agent only gets the context relevant to their specific job.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Spec Kit:&lt;/strong&gt; It focuses on &lt;strong&gt;Intent-Driven Development&lt;/strong&gt;, using a &lt;code&gt;/specify&lt;/code&gt; workflow that provides context only for the &lt;em&gt;current task&lt;/em&gt;, keeping the token count lean.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Mindset: Fix the Architecture, Not the Prompt
&lt;/h2&gt;

&lt;p&gt;Think of your agent’s confusion as a signal of architectural friction. If an agent keeps putting utilities in the wrong folder, don't just add a rule to your context file. Fix the folder structure. Once the code is clear, you can &lt;strong&gt;delete&lt;/strong&gt; the instruction from your context file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal is a lean context layer that only tells the agent what it cannot possibly find on its own.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;Stop using /init for AGENTS.md&lt;/em&gt; - &lt;a href="https://addyosmani.com/blog/agents-md/" rel="noopener noreferrer"&gt;Addy Osmani&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;The "Pink Elephant" Problem in Agentic Context&lt;/em&gt; - &lt;a href="https://arxiv.org/abs/2601.20404" rel="noopener noreferrer"&gt;Kocetkov et al. (ETH Zurich, 2026)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;Efficiency Metrics for Human-Authored Context&lt;/em&gt; - &lt;a href="https://arxiv.org/abs/2602.11988" rel="noopener noreferrer"&gt;Lulla et al. (2026)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Deja de quemar tokens en contexto redundante &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Existe un ritual que se ha vuelto casi universal entre los desarrolladores que adoptan agentes de IA: creas un nuevo proyecto, corres un comando como &lt;code&gt;/init&lt;/code&gt;, y observas cómo el agente genera un flamante archivo &lt;code&gt;AGENTS.md&lt;/code&gt;. Se siente como lo correcto; sientes que le has dado a tu agente un "mapa" del código.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pero la realidad es otra: podrías estar haciendo que tu agente sea más lento, más caro y menos preciso.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inspirado por el &lt;a href="https://addyosmani.com/blog/agents-md/" rel="noopener noreferrer"&gt;análisis de Addy Osmani&lt;/a&gt;, investigué los datos detrás de este "ritual de contexto". Investigaciones de 2026 revelan que los archivos de contexto auto generados pueden &lt;strong&gt;reducir el éxito de las tareas en un 2-3%&lt;/strong&gt;, mientras &lt;strong&gt;inflan los costos en más de un 20%&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  El Bucle de Redundancia
&lt;/h2&gt;

&lt;p&gt;¿Por qué sucede esto? Según el estudio de &lt;strong&gt;ETH Zurich&lt;/strong&gt; (&lt;a href="https://arxiv.org/abs/2601.20404" rel="noopener noreferrer"&gt;Kocetkov et al., 2026&lt;/a&gt;), a menudo le damos a los agentes el mapa de una habitación en la que ya están parados. Si un agente ya puede leer tu &lt;code&gt;package.json&lt;/code&gt; y tu estructura de directorios, decirle "este es un proyecto de React" es solo ruido.&lt;/p&gt;

&lt;p&gt;Cuando le das a un LLM la misma información dos veces, no lo estás "reforzando", estás diluyendo su atención. Cada token redundante compite con la tarea real que quieres que realice el agente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enfócate en la "Lógica Invisible"
&lt;/h2&gt;

&lt;p&gt;Desde mi punto de vista, un &lt;code&gt;README.md&lt;/code&gt; es para que los humanos entiendan la &lt;em&gt;historia&lt;/em&gt; del proyecto. Un &lt;code&gt;AGENTS.md&lt;/code&gt; solo debería contener la &lt;strong&gt;Lógica Invisible&lt;/strong&gt;: aquello que no es obvio al leer el código.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;No:&lt;/strong&gt; Describas el stack tecnológico o los nombres de las carpetas (el agente puede descubrir esto solo).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Sí:&lt;/strong&gt; Documenta las &lt;strong&gt;Restricciones Silenciosas&lt;/strong&gt;. Por ejemplo: "El módulo &lt;code&gt;/legacy&lt;/code&gt; es necesario para el pipeline de CI/CD; no lo borres aunque parezca sin uso".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sharding de Contexto: Por qué BMAD y Spec Kit son el futuro
&lt;/h2&gt;

&lt;p&gt;Un solo archivo masivo en la raíz de tu repositorio es un fallo estructural. Un estudio de &lt;strong&gt;Lulla et al.&lt;/strong&gt; (&lt;a href="https://arxiv.org/abs/2602.11988" rel="noopener noreferrer"&gt;2026&lt;/a&gt;) demostró que los archivos de contexto mantenidos por humanos mejoran la eficiencia, pero solo cuando son específicos para la tarea.&lt;/p&gt;

&lt;p&gt;Aquí entra mi experiencia con &lt;strong&gt;BMAD&lt;/strong&gt; y &lt;strong&gt;Spec Kit&lt;/strong&gt;. Estos frameworks se alejan del "archivo único" y se acercan al &lt;strong&gt;Sharding (fragmentación) de Contexto&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;BMAD:&lt;/strong&gt; Permite dividir el contexto por roles (Analista, Arquitecto, Programador), asegurando que cada agente solo reciba lo que necesita para su trabajo específico.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Spec Kit:&lt;/strong&gt; Se enfoca en el &lt;strong&gt;Desarrollo Basado en Intenciones&lt;/strong&gt;, usando un flujo de &lt;code&gt;/specify&lt;/code&gt; que da contexto solo para la &lt;em&gt;tarea actual&lt;/em&gt;, manteniendo bajo el consumo de tokens.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Mentalidad: Arregla la Arquitectura, no el Prompt
&lt;/h2&gt;

&lt;p&gt;Piensa en la confusión de tu agente como una señal de fricción arquitectónica. Si un agente no entiende dónde va una utilidad, es probable que tu estructura de carpetas sea confusa. Arregla el código, y una vez que esté claro, podrás &lt;strong&gt;borrar&lt;/strong&gt; la instrucción de tu archivo de contexto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El objetivo es una capa de contexto ligera que solo le diga al agente lo que es imposible que encuentre por sí mismo.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Referencias
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;Stop using /init for AGENTS.md&lt;/em&gt; - &lt;a href="https://addyosmani.com/blog/agents-md/" rel="noopener noreferrer"&gt;Addy Osmani&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;The "Pink Elephant" Problem in Agentic Context&lt;/em&gt; - &lt;a href="https://arxiv.org/abs/2601.20404" rel="noopener noreferrer"&gt;Kocetkov et al. (ETH Zurich, 2026)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;Efficiency Metrics for Human-Authored Context&lt;/em&gt; - &lt;a href="https://arxiv.org/abs/2602.11988" rel="noopener noreferrer"&gt;Lulla et al. (2026)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>productivity</category>
      <category>agents</category>
    </item>
    <item>
      <title>My Search to Become a DevRel: How Community, Teaching, WebAI and Vibe Coding Became My Path</title>
      <dc:creator>aileen vl</dc:creator>
      <pubDate>Sun, 23 Nov 2025 23:49:17 +0000</pubDate>
      <link>https://forem.com/aileenvl/my-search-to-become-a-devrel-how-community-teaching-webai-and-vibe-coding-became-my-path-3n69</link>
      <guid>https://forem.com/aileenvl/my-search-to-become-a-devrel-how-community-teaching-webai-and-vibe-coding-became-my-path-3n69</guid>
      <description>&lt;p&gt;For years I have been doing the work of a Developer Advocate without ever holding the title.&lt;/p&gt;

&lt;p&gt;Not because I was trying to check a career box, but because I genuinely love teaching, building, speaking, and helping people unlock what is possible with the Web. My journey into DevRel did not start with a job description. It started with curiosity, community, and an obsession with sharing what I learn.&lt;/p&gt;

&lt;p&gt;This is the story I want to tell.&lt;/p&gt;

&lt;h3&gt;
  
  
  From Teaching English to Teaching Tech
&lt;/h3&gt;

&lt;p&gt;Long before I ever touched WebGPU, AI APIs, or agentic patterns, I was a teacher.&lt;/p&gt;

&lt;p&gt;I taught English to pay for college, and I did not know it at the time, but that experience shaped everything. I learned how to explain complex ideas simply. How to read a room. How to make someone feel capable, even if they are just starting.&lt;/p&gt;

&lt;p&gt;When I eventually transitioned into software engineering, I did not stop teaching.&lt;br&gt;
I taught through local meetups, study groups, DMs, and later through tech communities I organized myself. Teaching has always been the throughline of my career.&lt;/p&gt;

&lt;h3&gt;
  
  
  Falling in Love With the Web Again Because of AI
&lt;/h3&gt;

&lt;p&gt;I have always loved the Web. The openness, the flexibility, the creativity. The Web is the most accessible platform ever created.&lt;/p&gt;

&lt;p&gt;But WebAI changed everything for me.&lt;/p&gt;

&lt;p&gt;The idea that I could use my existing web knowledge, the same JavaScript and browser APIs I had been mastering for years, to create AI powered experiences was mind blowing. It made AI feel native, natural, and ours as web developers.&lt;/p&gt;

&lt;p&gt;WebAI gave me a way in.&lt;br&gt;
Vibe coding made the possibilities feel infinite.&lt;br&gt;
And suddenly, I could not stop building.&lt;/p&gt;

&lt;p&gt;But I also could not stop sharing.&lt;/p&gt;

&lt;p&gt;I started recording videos.&lt;br&gt;
I started writing.&lt;br&gt;
I started speaking, first locally, then nationally, and then internationally.&lt;/p&gt;

&lt;p&gt;My first international talk was in Romania, and it changed everything. I realized something important:&lt;br&gt;
This is the work I want to do. This is the work I am already doing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Becoming a Developer Advocate Before Becoming a Developer Advocate
&lt;/h3&gt;

&lt;p&gt;DevRel is not about clout, stages, or airport lounges.&lt;/p&gt;

&lt;p&gt;At its core it is about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Teaching&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Empowering people&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sharing knowledge&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Building community&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connecting ideas with the people who need them&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exploring new tools and showing what is possible&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I have been doing all of that for three years, not because it was my job, but because I could not avoid doing it.&lt;/p&gt;

&lt;p&gt;I have organized meetups in my city out of passion.&lt;br&gt;
I have brought new technologies to local communities.&lt;br&gt;
I have created videos and tutorials so people can learn faster than I did.&lt;br&gt;
I have spoken at events on my own budget, sometimes using my vacation days to do it.&lt;/p&gt;

&lt;p&gt;I did not realize it then, but I was doing DevRel the slow and difficult way.&lt;br&gt;
Out of pure love, not sustainability.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Burnout: When Passion Is Not Enough
&lt;/h3&gt;

&lt;p&gt;At first it was fine.&lt;/p&gt;

&lt;p&gt;But as more invitations came in, as communities grew, as more people asked for help, something shifted. I was doing the work full time without the support or resources of an actual DevRel role.&lt;/p&gt;

&lt;p&gt;I was using my free time, weekends, vacation days, and often my own money to show up for communities. Eventually it created a type of burnout that hurts because it comes from something you love.&lt;/p&gt;

&lt;p&gt;That is when I realized something important:&lt;/p&gt;

&lt;p&gt;If I want to keep teaching, speaking, and enabling builders, I need to do it in a sustainable way. I need to do it as my actual job.&lt;/p&gt;

&lt;p&gt;Not as a side passion.&lt;br&gt;
Not as extra work squeezed into the edges of my life.&lt;br&gt;
But as my career.&lt;/p&gt;

&lt;p&gt;Because DevRel is not only something I am good at.&lt;br&gt;
It is the way I naturally move through the world.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why DevRel Is the Path I Want to Commit To
&lt;/h3&gt;

&lt;p&gt;I believe that DevRel is not a performance. It is a service.&lt;/p&gt;

&lt;p&gt;I want to serve developer communities by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Teaching&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Helping developers use the Web as a platform for AI experiences&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sharing how I build and experiment in public&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bringing powerful tools to places that rarely see them&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Showing beginners and non engineers that they can build too&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating content that teaches and inspires&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Growing communities locally and globally&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have already done all of this. I simply need the chance to do it full time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I Am Sharing This
&lt;/h3&gt;

&lt;p&gt;This blog post is not only a reflection. It is a declaration.&lt;/p&gt;

&lt;p&gt;I want to be a Developer Advocate.&lt;/p&gt;

&lt;p&gt;Not someday. Not in an abstract way.&lt;br&gt;
I am ready now.&lt;/p&gt;

&lt;p&gt;I have built the habits, the skills, the community, and the love for the craft. I simply want the opportunity to keep growing, to keep teaching, to keep building bridges between technology and people.&lt;/p&gt;

&lt;p&gt;DevRel is not a title I am chasing.&lt;br&gt;
It is the role that finally matches the work I have been doing and the person I have become.&lt;/p&gt;

&lt;h3&gt;
  
  
  If You Are Reading This
&lt;/h3&gt;

&lt;p&gt;If you are a DevRel professional, a manager, a founder, or someone who works in community or advocacy, or if you simply know me:&lt;/p&gt;

&lt;p&gt;I am open to opportunities.&lt;br&gt;
I am ready to create.&lt;br&gt;
I am ready to contribute.&lt;br&gt;
And more than anything, I am ready to help people build the future of the Web.&lt;/p&gt;

&lt;p&gt;The Web taught me everything.&lt;br&gt;
Community carried me forward.&lt;br&gt;
Teaching is how I give back.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>webai</category>
      <category>career</category>
    </item>
    <item>
      <title>Bringing Cursor Café to Guadalajara ☕💻</title>
      <dc:creator>aileen vl</dc:creator>
      <pubDate>Mon, 10 Nov 2025 00:04:45 +0000</pubDate>
      <link>https://forem.com/aileenvl/bringing-cursor-cafe-to-guadalajara-1m8h</link>
      <guid>https://forem.com/aileenvl/bringing-cursor-cafe-to-guadalajara-1m8h</guid>
      <description>&lt;p&gt;It all started when I saw Cursor Café San Francisco. I’ve been a  Cursor user and a coffee lover, so the idea of combining both worlds sounded like the perfect event to network. Many of us already work from coffee shops: creating, coding, shipping, and meeting people. The concept instantly clicked.&lt;/p&gt;

&lt;p&gt;I remember &lt;a href="https://x.com/benln" rel="noopener noreferrer"&gt;Ben Lang&lt;/a&gt; &lt;a href="https://x.com/benln/status/1961123602696196126?s=20" rel="noopener noreferrer"&gt;posting&lt;/a&gt; about it on X (Twitter), and I fell in love with the idea, especially the collab with &lt;a href="https://x.com/terminaldotshop" rel="noopener noreferrer"&gt;Terminal&lt;/a&gt;, a brand I personally enjoy. (Can’t wait to see a &lt;a href="https://x.com/ReactMiamiConf" rel="noopener noreferrer"&gt;React Miami&lt;/a&gt; collab one day 👀☕). When Ben asked where Cursor Café should go next, I didn’t hesitate: it had to come to my city.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bringing it to Mexico🇲🇽
&lt;/h3&gt;

&lt;p&gt;Around that time, I was already hosting several tech events and looking for ways to collaborate with more people. I told &lt;a href="https://x.com/helenismo" rel="noopener noreferrer"&gt;Ximena&lt;/a&gt;, an amazing community builder known across all Mexican tech circles for her work and her recent efforts with &lt;a href="https://x.com/torcdotdev" rel="noopener noreferrer"&gt;Torc&lt;/a&gt;, which have helped her connect and grow the local ecosystem even more.&lt;/p&gt;

&lt;p&gt;After talking, we realized Guadalajara was the perfect spot, especially because &lt;a href="https://x.com/jsconfmx" rel="noopener noreferrer"&gt;JSConf MX&lt;/a&gt; was happening there, bringing together developers and creators from all over the country.&lt;/p&gt;

&lt;p&gt;So we proposed the idea to Ben, and he loved it. From there, things started moving quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Making it real
&lt;/h3&gt;

&lt;p&gt;Ben introduced us to &lt;a href="https://x.com/ftnabeelah" rel="noopener noreferrer"&gt;Fawziyah&lt;/a&gt;, who guided us through everything needed to make a successful Cursor Café. She shared insights, checklists, and best practices from previous events.&lt;/p&gt;

&lt;p&gt;Meanwhile, Ximena worked her local magic and secured a beautiful coffee shop in Guadalajara, while I focused on spreading the word and opening registrations. Soon, we had a full house, a stack of Cursor coffee bags, and backup plans for anything that might go wrong.&lt;/p&gt;

&lt;p&gt;It was incredible to collaborate with Ximena; her experience running community events truly elevated the project.&lt;/p&gt;

&lt;h3&gt;
  
  
  The day of the event 🌤️
&lt;/h3&gt;

&lt;p&gt;On October 29th, I arrived from Monterrey a bit late, but by the time I got there, Ximena and several local communities were already helping with check-ins, welcoming attendees, and making sure everything ran smoothly.&lt;/p&gt;

&lt;p&gt;The best part was how natural it felt. People connected instantly, sharing projects, chatting, and meeting new friends. We hosted a demo time so builders could show what they were creating and gave out Cursor-branded coffee bags as a token of appreciation.&lt;/p&gt;

&lt;p&gt;The coffee shop was buzzing with energy. The owner was thrilled to host, and attendees were already asking when the next one would be. Even some JSConf speakers joined, inviting everyone to stay involved in the community. Because truly, nothing beats learning together.&lt;/p&gt;


&lt;blockquote&gt;&lt;a href="//imgur.com/a/ROWKh1B"&gt;&lt;/a&gt;&lt;/blockquote&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%2Ffh7h5waf5aog9yitaiql.jpeg" 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%2Ffh7h5waf5aog9yitaiql.jpeg" alt="cafe cursor1 " width="800" height="999"&gt;&lt;/a&gt;&lt;br&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%2F3dyi55m6ggkzpfymq1xt.jpeg" 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%2F3dyi55m6ggkzpfymq1xt.jpeg" alt="cafe cursor2 " width="800" height="1200"&gt;&lt;/a&gt;&lt;br&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%2Fylhsbgw6xm7fintd7675.jpeg" 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%2Fylhsbgw6xm7fintd7675.jpeg" alt="cafe cursor3 " width="800" height="1045"&gt;&lt;/a&gt;&lt;br&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%2Fcywri91bf0rh92i9or0t.jpeg" 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%2Fcywri91bf0rh92i9or0t.jpeg" alt="cafe cursor4 " width="800" height="999"&gt;&lt;/a&gt;&lt;br&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%2Ftly57zvzqs34843004qu.jpeg" 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%2Ftly57zvzqs34843004qu.jpeg" alt="cafe cursor5 " width="800" height="999"&gt;&lt;/a&gt;&lt;br&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%2Fu9ckvnkxp61vqdn8xsgi.jpeg" 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%2Fu9ckvnkxp61vqdn8xsgi.jpeg" alt="cafe cursor6 " width="800" height="999"&gt;&lt;/a&gt;&lt;br&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%2Fb21kqaon2xdn283zscg6.jpeg" 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%2Fb21kqaon2xdn283zscg6.jpeg" alt="cafe cursor7 " width="800" height="999"&gt;&lt;/a&gt;&lt;br&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%2Flwnpdmhokjli7ef15m0v.jpeg" 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%2Flwnpdmhokjli7ef15m0v.jpeg" alt="cafe cursor8 " width="800" height="999"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Perfect timing ☕ + 💡
&lt;/h3&gt;

&lt;p&gt;Coincidentally, the same day we hosted Cursor Café Guadalajara, Cursor 2.0 launched, bringing tons of exciting updates. The atmosphere was electric, with people exploring new features, sharing projects, and showing how Cursor helps them code faster and more creatively.&lt;/p&gt;

&lt;h3&gt;
  
  
  A growing movement 💜
&lt;/h3&gt;

&lt;p&gt;What made this event special was how supported we felt. Ben and Fawziyah were there every step of the way, encouraging and helping us make it happen.&lt;/p&gt;

&lt;p&gt;And the best part? Cursor Café is expanding around the world.&lt;br&gt;
The next one in &lt;a href="https://luma.com/2ye0p31y" rel="noopener noreferrer"&gt;Mexico city&lt;/a&gt; will be on November 15th, and you can &lt;a href="https://luma.com/cursorcommunity?k=c" rel="noopener noreferrer"&gt;check out&lt;/a&gt; the full list of upcoming events on the Cursor Café calendar to find one close to your city.&lt;/p&gt;

&lt;p&gt;If you’re thinking about hosting, go for it. There’s already a strong, global community of creators sharing tips, ideas, and experiences.&lt;/p&gt;

&lt;p&gt;So here’s my invitation to you:&lt;br&gt;
Attend one. Host one. Be part of it.&lt;/p&gt;

&lt;p&gt;You never know what kind of connections or collaborations can start over a cup of coffee ☕✨&lt;/p&gt;

&lt;p&gt;📸 &lt;strong&gt;Photo credits&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All the amazing photos from Cursor Café Guadalajara were captured by &lt;a href="https://www.linkedin.com/in/vichyvaleria/" rel="noopener noreferrer"&gt;Vichy Valeria&lt;/a&gt;.&lt;br&gt;
Her eye for community and detail made every shot feel alive, thank you for beautifully documenting the energy of the day!&lt;/p&gt;

</description>
      <category>cursorcafe</category>
      <category>community</category>
      <category>techmexico</category>
    </item>
    <item>
      <title>on device models and how they work in the browser thanks to web assembly and webgpu</title>
      <dc:creator>aileen vl</dc:creator>
      <pubDate>Fri, 17 Oct 2025 19:17:51 +0000</pubDate>
      <link>https://forem.com/aileenvl/on-device-models-and-how-they-work-in-the-browser-thanks-to-web-assembly-and-webgpu-5bo6</link>
      <guid>https://forem.com/aileenvl/on-device-models-and-how-they-work-in-the-browser-thanks-to-web-assembly-and-webgpu-5bo6</guid>
      <description>&lt;p&gt;I’ve been a fan of WebAI for a while now, and the more I learn and work on this, the more convinced I am that on-device is the way forward.&lt;/p&gt;

&lt;p&gt;If we want AI that feels fast, private, and easy to access, it should run right where people already are: in the browser. No installs, no waiting on a server, no cloud bills. Just you, your device, and a tab open.&lt;/p&gt;

&lt;p&gt;This is possible thanks to two big breakthroughs: WebAssembly (Wasm) and WebGPU.&lt;/p&gt;

&lt;h3&gt;
  
  
  WebAssembly
&lt;/h3&gt;

&lt;p&gt;WebAssembly changed everything. By compiling runtimes to Wasm, code could run almost as fast as native apps, but safely inside the browser. That opened up a whole new opportunity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ONNX Runtime Web lets you take models trained elsewhere (in PyTorch or TensorFlow, for example) and run them directly in a tab. It compiles the CPU engine into Wasm, so it works everywhere without needing a GPU.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transformers.js (from Hugging Face) builds on this by giving developers a one-line JS API for common NLP and vision tasks—things like embeddings, question answering, image classification, or even running Whisper for speech-to-text. Instead of wiring up a complex runtime yourself, you can just call pipeline('sentiment-analysis') in JavaScript and it works.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was enough to get small and medium models running in the browser. Embeddings, sentiment analysis, and simple image classification suddenly became possible without a backend. And it worked everywhere—from laptops to mid-range phones.&lt;/p&gt;

&lt;p&gt;Another important player here is TensorFlow.js. This library has been around for a few years and was one of the first to make ML in the browser feel approachable. It offers multiple backends (CPU, WebGL, Wasm, and now WebGPU), and it comes with lots of ready to use models like PoseNet (for body pose detection) or MobileNet (for image recognition). For many developers and myself, TensorFlow.js was the entry point to experimenting with browser ML before newer frameworks arrived.&lt;/p&gt;

&lt;h3&gt;
  
  
  WebGPU
&lt;/h3&gt;

&lt;p&gt;Then came WebGPU. For the first time, the browser got a proper GPU compute API. Not just graphics tricks, but compute shaders, parallel math, and control over buffers.&lt;/p&gt;

&lt;p&gt;This unlocked new possibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Stable Diffusion generating images in a tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Segment Anything producing realtime masks on client images.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LLMs streaming tokens locally, without touching a server.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The performance gains are real too. Chrome added FP16 shaders (half-precision floating point) and packed 8-bit dot products (DP4a), both of which make models faster and lighter. Benchmarks show 2–3× speedups on text embedding and LLM decoding just by enabling these features.&lt;/p&gt;

&lt;p&gt;And the ecosystem is catching up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ONNX Runtime Web now ships with a WebGPU backend, meaning models that were too heavy for Wasm execution suddenly become practical.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;WebLLM, built by the MLC team, brings large language models into the browser. It uses WebGPU under the hood and exposes a familiar API similar to OpenAI’s. Developers can call it as if they were talking to an API in the cloud, but everything runs locally in the user’s browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now with Firefox shipping WebGPU on Windows and Safari preparing support, 2025 is shaping up to be the first year you can target GPU compute across all major browsers. That’s huge.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  In summary
&lt;/h3&gt;

&lt;p&gt;Here’s how I like to frame it:&lt;/p&gt;

&lt;p&gt;Wasm is the backbone. It runs the runtime, keeps things portable, and gives a CPU fallback for older devices.&lt;/p&gt;

&lt;p&gt;WebGPU is the muscle. It handles the heavy math—matrix multiplications, attention, convolutions.&lt;/p&gt;

&lt;p&gt;Runtimes tie it together. ONNX Runtime Web handles general-purpose models, Transformers.js makes pipelines easy, TensorFlow.js covers a wide range of prebuilt models, and WebLLM brings LLMs to the browser with an already familiar API.&lt;/p&gt;

&lt;p&gt;Together, these tools let you ship apps that are both accessible and powerful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why on-device matters to me
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Latency feels human. When building in the browser, every second counts. Time-to-first-token under a second makes users relax and explore.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Privacy by default. Inputs never leave the device unless the user chooses. For health, finance, or education apps, this is the best way forward.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Costs. Inference runs on the user’s hardware, not your server bill. That makes scaling more predictable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reach. The browser is the largest runtime in the world. A single link is all you need.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What’s next?
&lt;/h3&gt;

&lt;p&gt;With WebGPU in Chrome, Edge, Firefox, and soon Safari, the baseline is stronger than ever. Mobile support is also improving fast.&lt;/p&gt;

&lt;p&gt;I hope 5–10B parameter models to become normal soon on consumer devices with quantization and smart caching.&lt;/p&gt;

&lt;p&gt;Developers don’t need to reinvent the wheel. The frameworks are here, the APIs are stabilizing, and the performance is finally good enough to make real apps.&lt;/p&gt;

&lt;h4&gt;
  
  
  Resources to explore
&lt;/h4&gt;

&lt;p&gt;ONNX Runtime Web&lt;br&gt;
 – run ONNX models in the browser with Wasm and WebGPU backends.&lt;/p&gt;

&lt;p&gt;Transformers.js&lt;br&gt;
 – Hugging Face’s library for running models directly in JavaScript.&lt;/p&gt;

&lt;p&gt;TensorFlow.js&lt;br&gt;
 – prebuilt models and training/inference support in the browser.&lt;/p&gt;

&lt;p&gt;WebLLM&lt;br&gt;
 – large language models running fully client-side with WebGPU acceleration.&lt;/p&gt;

&lt;p&gt;MDN WebGPU Docs&lt;br&gt;
 – a good overview of the WebGPU API itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final thoughts
&lt;/h3&gt;

&lt;p&gt;The browser is the runtime. Users already have it. Let’s build there.&lt;/p&gt;

&lt;p&gt;With Wasm as the backbone and WebGPU as the muscle, we can deliver fast, private, and accessible AI experiences that were impossible just a couple of years ago.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Book Review — The Creative Act: A Way of Being by Rick Rubin</title>
      <dc:creator>aileen vl</dc:creator>
      <pubDate>Fri, 10 Oct 2025 18:55:39 +0000</pubDate>
      <link>https://forem.com/aileenvl/book-review-the-creative-act-a-way-of-being-by-rick-rubin-5eeb</link>
      <guid>https://forem.com/aileenvl/book-review-the-creative-act-a-way-of-being-by-rick-rubin-5eeb</guid>
      <description>&lt;p&gt;I picked up this book during a moment when I felt like I had lost touch with my creativity. I wasn’t feeling inspired in what I do, and something inside me felt hollow, like a quiet emptiness in my soul. Reading The Creative Act reminded me of who I used to be: a child who danced ballet, played the piano, performed on stage, someone who created, expressed, and moved through the world artistically.&lt;/p&gt;

&lt;p&gt;Somewhere along the way, I lost that part of myself. I focused on sports, on productivity, on work. I started writing sometimes, but not consistently. I didn’t realize how much I missed the act of creating, how vital it was to my sense of aliveness.&lt;/p&gt;

&lt;p&gt;When I entered the tech world, I believed it was possible to be creative there, but I couldn’t quite find how. I built, I coded, I solved problems, yet something in me still longed for expression. It wasn’t until I began speaking at events, sharing knowledge, and standing on stages that I recognized this too was a form of performance. The nervous energy before going on stage, the preparation, the act of expressing ideas in front of others, it wasn’t dancing, but it was something. My body and my soul had found another way to move.&lt;/p&gt;

&lt;p&gt;Rick Rubin’s book gave me a framework to see creativity not as a discipline, but as a way of being. It reminded me that every act, whether building an app, telling a story, or writing a line of code, can be a creative expression if it’s done with awareness and presence. It’s not about what we produce; it’s about the state we inhabit while we create.&lt;/p&gt;

&lt;p&gt;As a technologist, I found new meaning and purpose in my work through Rubin’s words. I started to see how creativity and art aren’t separate from innovation; they are its foundation. Without art, there’s no soul in what we build. Without creativity, technology becomes hollow.&lt;/p&gt;

&lt;p&gt;I also kept thinking about how education today often leaves art behind, emphasizing engineering and technology instead. Yet art has always been how we remember ourselves, how we tell the story of who we were. From cave paintings to music to sculpture, art has been humanity’s record of feeling. In this digital era, as everything becomes more automated and optimized, I wonder: what stories will we leave behind?&lt;br&gt;
Will museums one day display TikToks as cultural relics? Will AI-generated art replace human expression, or simply expand it?&lt;/p&gt;

&lt;p&gt;The Creative Act doesn’t give answers; it gives space. It invites you to remember that creativity is not a profession, but a practice of being alive. It’s a reminder to listen deeply, to observe, to stay open, and to never stop creating, no matter the medium.&lt;/p&gt;

</description>
      <category>creative</category>
      <category>technology</category>
      <category>art</category>
    </item>
    <item>
      <title>How to Connect Your Bolt.new Creation to a Custom Domain from Cloudflare</title>
      <dc:creator>aileen vl</dc:creator>
      <pubDate>Sun, 24 Aug 2025 02:31:28 +0000</pubDate>
      <link>https://forem.com/aileenvl/how-to-connect-your-boltnew-creation-to-a-custom-domain-from-cloudflare-4ep4</link>
      <guid>https://forem.com/aileenvl/how-to-connect-your-boltnew-creation-to-a-custom-domain-from-cloudflare-4ep4</guid>
      <description>&lt;p&gt;If you’ve created a portfolio, project, or personal site with Bolt.new, you’ll probably want to make it available on your own custom domain instead of the default Bolt link. In this guide, I’ll walk you through the exact steps I followed to connect my Bolt creation to a domain I registered with Cloudflare.&lt;br&gt;
By the end, you’ll have your site live on your own domain in just a few minutes.&lt;/p&gt;

&lt;p&gt;To make this work, we need to understand something called &lt;strong&gt;DNS&lt;/strong&gt;. Don’t worry—it sounds technical, but it’s just the system that makes the internet usable.  &lt;/p&gt;


&lt;h2&gt;
  
  
  🌐 What is DNS and Why Do We Need It?
&lt;/h2&gt;

&lt;p&gt;Think of DNS (&lt;strong&gt;Domain Name System&lt;/strong&gt;) as the &lt;strong&gt;phonebook of the internet&lt;/strong&gt;.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every website lives on a server with an &lt;strong&gt;IP address&lt;/strong&gt; (a string of numbers, like &lt;code&gt;192.0.2.1&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Since no one wants to remember numbers, DNS translates easy names like &lt;code&gt;paulinaave.com&lt;/code&gt; into the right server address.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you type a website into your browser, DNS makes sure your request is sent to the right place.  &lt;/p&gt;

&lt;p&gt;That’s why, after buying a domain, you need to set up &lt;strong&gt;DNS records&lt;/strong&gt;. These records are instructions that tell the internet:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A record&lt;/strong&gt; → Points your domain to a specific server (like Bolt’s servers).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CNAME record&lt;/strong&gt; → Creates an alias so subdomains (like &lt;code&gt;www.myportfolio.com&lt;/code&gt;) also know where to go.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without DNS configured, your domain won’t know which website to show—hence the common &lt;em&gt;“site can’t be reached”&lt;/em&gt; error.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠 Step 1: Publish Your Bolt Creation to a Custom Domain
&lt;/h2&gt;

&lt;p&gt;Inside your &lt;strong&gt;Bolt project&lt;/strong&gt;:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;Publish&lt;/strong&gt; button.
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Custom domain&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Enter the domain name you already own (for example, &lt;code&gt;myportfolio.com&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;Bolt will verify the domain is registered.
&lt;/li&gt;
&lt;li&gt;Once verified, click &lt;strong&gt;Add Domain&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At this point, the domain is linked to Bolt, but won’t yet load your site until we fix the DNS records.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔧 Step 2: Configure DNS in Cloudflare
&lt;/h2&gt;

&lt;p&gt;Now we’ll fix the DNS issues Bolt reports. In my case, it asked me to add two records:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;A record&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;CNAME record&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s how to add them in &lt;strong&gt;Cloudflare&lt;/strong&gt;:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in to your &lt;strong&gt;Cloudflare dashboard&lt;/strong&gt; and open the domain.
&lt;/li&gt;
&lt;li&gt;Go to the &lt;strong&gt;DNS settings&lt;/strong&gt; tab.
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Record&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  ➤ Add the A Record
&lt;/h3&gt;

&lt;p&gt;Type: A&lt;br&gt;
Name: (copy from Bolt’s instructions)&lt;br&gt;
Value: (the IP address Bolt provides)&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt;.  &lt;/p&gt;
&lt;h3&gt;
  
  
  ➤ Add the CNAME Record
&lt;/h3&gt;

&lt;p&gt;Type: CNAME&lt;br&gt;
Name: (provided by Bolt)&lt;br&gt;
Target: (the Bolt target value)&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt;.  &lt;/p&gt;


&lt;h2&gt;
  
  
  ⏳ Step 3: Verify and Wait for Propagation
&lt;/h2&gt;

&lt;p&gt;After saving, Bolt should detect the updates.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You may see a status like &lt;strong&gt;“Waiting for updates”&lt;/strong&gt; for a few minutes.
&lt;/li&gt;
&lt;li&gt;DNS propagation can take some time (anywhere from a few minutes to 24 hours).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refresh your browser or check your domain in a new tab. Once the records are live, your Bolt site will load on your domain.  &lt;/p&gt;


&lt;h2&gt;
  
  
  🎉 Final Result
&lt;/h2&gt;

&lt;p&gt;That’s it! Your &lt;strong&gt;portfolio or project built on Bolt&lt;/strong&gt; is now available at your &lt;strong&gt;custom domain&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;If it doesn’t work right away:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Double-check your DNS records.
&lt;/li&gt;
&lt;li&gt;✅ Make sure Cloudflare’s proxy (orange cloud) is &lt;strong&gt;disabled&lt;/strong&gt; if Bolt requires direct DNS.
&lt;/li&gt;
&lt;li&gt;✅ Be patient—DNS can take a little while to update globally.
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ✨ Wrap-Up
&lt;/h2&gt;

&lt;p&gt;DNS may sound intimidating, but it’s simply the system that connects &lt;strong&gt;domain names to websites&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Once you understand that adding DNS records is just filling in a form with the right “address,” connecting Bolt.new to your domain is straightforward:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add your domain in Bolt.new.
&lt;/li&gt;
&lt;li&gt;Copy the DNS records.
&lt;/li&gt;
&lt;li&gt;Paste them into Cloudflare.
&lt;/li&gt;
&lt;li&gt;Wait for it to update.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now your site looks polished and professional with a &lt;strong&gt;custom domain&lt;/strong&gt; 🚀.  &lt;/p&gt;


&lt;h2&gt;
  
  
  🎥 Watch the Tutorial Video
&lt;/h2&gt;

&lt;p&gt;If you’d rather follow along with a video, here’s the full walkthrough I recorded:  &lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/s62HZYaBbGU"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>bolt</category>
      <category>cloudfare</category>
      <category>domain</category>
    </item>
    <item>
      <title>I Don’t Fear Vibecoding, Because It Reminds Me of How I Got Here</title>
      <dc:creator>aileen vl</dc:creator>
      <pubDate>Mon, 18 Aug 2025 23:03:21 +0000</pubDate>
      <link>https://forem.com/aileenvl/i-dont-fear-vibecoding-because-it-reminds-me-of-how-i-got-here-pin</link>
      <guid>https://forem.com/aileenvl/i-dont-fear-vibecoding-because-it-reminds-me-of-how-i-got-here-pin</guid>
      <description>&lt;h2&gt;
  
  
  From Industrial Engineer to Coder
&lt;/h2&gt;

&lt;p&gt;I started out as an industrial engineer, but I quickly realized manufacturing wasn’t for me. I didn’t feel inspired by the work, and deep down I knew I was searching for something else. When I discovered coding, it felt like an entirely new world had opened up in front of me.  &lt;/p&gt;

&lt;p&gt;The beauty of programming is that you can build almost anything: an ecommerce store, a finance app, a game, or just a simple website. That variety was intoxicating. Every project was a doorway into a different domain, and every bug I solved taught me how things worked behind the curtain and loved the small wins.   &lt;/p&gt;




&lt;h2&gt;
  
  
  Falling in Love with JavaScript
&lt;/h2&gt;

&lt;p&gt;Back then, I was preparing for my first software job by practicing Java. But at the same time, modern JavaScript frameworks like &lt;strong&gt;Angular&lt;/strong&gt;, &lt;strong&gt;Knockout&lt;/strong&gt;, and &lt;strong&gt;Backbone&lt;/strong&gt; were emerging. Suddenly companies were hungry for people who could use them.  &lt;/p&gt;

&lt;p&gt;My employer prepared an academy with &lt;strong&gt;CodeSchool&lt;/strong&gt; courses for new graduates and trained them to work with clients. I was lucky enough to be part of one of those early cohorts.  &lt;/p&gt;

&lt;p&gt;That’s where I fell in love with &lt;strong&gt;JavaScript&lt;/strong&gt;. It wasn’t just another language. With JavaScript I didn’t need heavy configuration, complex environments, or endless setup. I could simply open a browser, write some code, and see the results instantly. Tools like &lt;strong&gt;Grunt&lt;/strong&gt;, &lt;strong&gt;Gulp&lt;/strong&gt;, and &lt;strong&gt;Yeoman&lt;/strong&gt; were the building blocks of that era, and they gave me a foundation I still carry today.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Learning Without a CS Degree
&lt;/h2&gt;

&lt;p&gt;I didn’t have a computer science degree, and I often felt underqualified compared to my peers. But what I did have was curiosity and persistence. I poured effort into learning every day, always picking up new tools, patterns, and frameworks.  &lt;/p&gt;

&lt;p&gt;Luckily, that was also the era when coding initiatives were exploding. Platforms like &lt;strong&gt;code.org&lt;/strong&gt;, &lt;strong&gt;freeCodeCamp&lt;/strong&gt;, and dozens of bootcamps emerged, all fueled by the statistic that by the 2020s we would face a huge shortage of developers.  &lt;/p&gt;

&lt;p&gt;Developers were in demand, and the community was buzzing. Meetups became a way to learn directly from incredibly talented people. Entrepreneurship was booming. Everyone seemed to want their own startup. It was a thrilling time to be in tech, even if I sometimes felt like I was running to keep up.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Discovering AI Through JavaScript
&lt;/h2&gt;

&lt;p&gt;A few years later, I began to notice AI creeping into the mainstream. Self-driving cars caught my attention first. They felt like science fiction come to life, and I was completely captivated by the potential of AI.  &lt;/p&gt;

&lt;p&gt;I wanted to dive in, but it seemed like the world of AI belonged primarily to &lt;strong&gt;Python&lt;/strong&gt;. My whole career had been built in JavaScript, and starting over in another language would have meant sacrificing years of experience and beginning again as a junior.  &lt;/p&gt;

&lt;p&gt;Then I discovered something that reignited my excitement: &lt;strong&gt;AI in JavaScript&lt;/strong&gt;. Libraries like &lt;strong&gt;TensorFlow.js&lt;/strong&gt; and &lt;strong&gt;brain.js&lt;/strong&gt;, along with the efforts of countless people in the community, showed that AI could also live on the web. Once again, JavaScript proved to be the gateway for accessibility. Just like when I first discovered the browser, I felt that same surge of possibility.  &lt;/p&gt;

&lt;p&gt;That excitement pushed me to start speaking at events. I wanted others to feel the same spark I had felt — that AI wasn’t locked away, but something we could all experiment with.  &lt;/p&gt;




&lt;h2&gt;
  
  
  The Crazy Thought That Became Reality
&lt;/h2&gt;

&lt;p&gt;Two years ago, I was serving on the advisory board of a large tech company at a time when AI was booming. &lt;strong&gt;ChatGPT&lt;/strong&gt; had been released, and the energy in the room was electric.  &lt;/p&gt;

&lt;p&gt;I remember sharing an idea that felt wild at the time: programming languages are how we tell machines what to do, but what if we could just use human language instead?  &lt;/p&gt;

&lt;p&gt;It sounded like a thought experiment, not a near-future reality. Yet here we are. Today, with &lt;strong&gt;vibecoding&lt;/strong&gt; and tools like &lt;strong&gt;&lt;a href="https://replit.com/" rel="noopener noreferrer"&gt;Replit&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://lovable.dev/" rel="noopener noreferrer"&gt;Lovable&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://v0.app/" rel="noopener noreferrer"&gt;V0&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://bolt.new/" rel="noopener noreferrer"&gt;Bolt&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://vibes.diy/" rel="noopener noreferrer"&gt;vibesDYI&lt;/a&gt;&lt;/strong&gt; and  &lt;strong&gt;&lt;a href="https://firebase.studio/" rel="noopener noreferrer"&gt;Firebase studio&lt;/a&gt;&lt;/strong&gt;, you really can turn an idea into an app with plain English. The “crazy thought” has arrived, and it’s transforming who gets to build software.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Why Vibecoding Matters
&lt;/h2&gt;

&lt;p&gt;Of course, vibecoding comes with concerns. People worry about security, about what happens when creators don’t fully understand the code behind their app. These concerns are valid, but I believe curiosity will push people to learn more just as it did for me years ago.  &lt;/p&gt;

&lt;p&gt;And beyond curiosity, there’s a practical reality: there simply aren’t enough developers in the world to meet the demand for solutions. Opening up creation to everyone means more businesses, more experiments, and more problems solved that developers might never see. Vibecoding is not about replacing engineers. It is about expanding the circle of creation.  &lt;/p&gt;




&lt;h2&gt;
  
  
  The Role of Developers in the Future
&lt;/h2&gt;

&lt;p&gt;Developers will always be essential. There will always be a need for engineers to design infrastructure, ensure security, and push technical boundaries. The apps people create with vibecoding will still need innovation, scalability, and reliability all of which require strong engineering.  &lt;/p&gt;

&lt;p&gt;But vibecoding gives anyone the power to start. It hands the keys to people who have ideas but no technical background. Some of those ideas will be silly, some will be experimental, and some will be revolutionary. Just like the early days of the web, that mix is what creates progress.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Looking Ahead
&lt;/h2&gt;

&lt;p&gt;For me, vibecoding feels like coming full circle. I remember being that non-CS graduate, feeling underqualified, wondering how I would ever get started. Today, I can see how much easier that first step could be for someone starting now.  &lt;/p&gt;

&lt;p&gt;AI is not just another tool; it is a source of endless possibilities. The future of innovation depends on bringing more people in, not keeping them out. &lt;strong&gt;Vibecoding is the open door.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;And I am more excited than ever to see what happens when anyone, anywhere, can turn an idea into something real.  &lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>ai</category>
      <category>javascript</category>
    </item>
    <item>
      <title>WebAI - Using Google Built-in AI APIs</title>
      <dc:creator>aileen vl</dc:creator>
      <pubDate>Thu, 22 May 2025 23:09:37 +0000</pubDate>
      <link>https://forem.com/aileenvl/webai-using-google-built-in-ai-apis-59g1</link>
      <guid>https://forem.com/aileenvl/webai-using-google-built-in-ai-apis-59g1</guid>
      <description>&lt;p&gt;With the many advancements in artificial intelligence, it's common to experience certain challenges.&lt;br&gt;&lt;br&gt;
Among them are the feelings of being left behind at work or falling short if you're not actively building or creating AI-powered apps.  &lt;/p&gt;

&lt;p&gt;But what if I told you that you can now use language models and machine learning directly from your browser?&lt;/p&gt;

&lt;p&gt;This is possible regardless of whether you're a web developer or not — even if you have no prior experience working with AI.&lt;/p&gt;

&lt;p&gt;This new opportunity comes in the form of &lt;strong&gt;Web AI&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
An initiative that allows you to run AI models locally in the browser without sending data to the cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Web AI?
&lt;/h3&gt;

&lt;p&gt;Web AI is a way to use language models directly from the Chrome browser, thanks to Google’s &lt;strong&gt;Gemini Nano&lt;/strong&gt; model.&lt;br&gt;&lt;br&gt;
This model is designed to run on your own computer (desktop or laptop), which offers two big advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Greater privacy&lt;/strong&gt;, since data doesn’t get sent to external servers
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less dependence on internet connectivity&lt;/strong&gt;, as everything is processed on your device&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best part? You can start experimenting with these tools &lt;strong&gt;without having to install anything complex&lt;/strong&gt; or waste valuable resources like your time.&lt;/p&gt;




&lt;h3&gt;
  
  
  Chrome’s New Built-In AI APIs
&lt;/h3&gt;

&lt;p&gt;Google is testing a set of AI APIs built directly into Chrome.&lt;br&gt;&lt;br&gt;
They are part of an experimental feature (&lt;strong&gt;origin trial&lt;/strong&gt;) available from &lt;strong&gt;Chrome versions 131 to 137&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8647ahx5i99ucamwzy0.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%2Fv8647ahx5i99ucamwzy0.png" alt="Image description" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Here’s what each API does:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Translator API&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dynamically translates user-generated or changing content.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Language Detector API&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Automatically detects the language of a given text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Summarizer API&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Summarizes long texts — perfect for lengthy articles, emails, or dense content.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Writer &amp;amp; Rewriter API&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Writer&lt;/strong&gt;: generates new text based on a specific task (e.g., product descriptions or emails)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rewriter&lt;/strong&gt;: restructures and improves an existing piece of text.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt API&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Allows you to directly interact with the language model, unlocking more advanced features (though it requires some understanding of &lt;a href="https://www.kaggle.com/whitepaper-prompt-engineering" rel="noopener noreferrer"&gt;prompt engineering&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  How to Try Them
&lt;/h3&gt;

&lt;p&gt;Google has enabled limited &lt;strong&gt;origin trials&lt;/strong&gt; for each API. To participate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Choose the API you want to try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Translator API
&lt;/li&gt;
&lt;li&gt;Language Detector API
&lt;/li&gt;
&lt;li&gt;Summarizer API
&lt;/li&gt;
&lt;li&gt;Prompt API&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Register&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter your site’s origin or extension ID (e.g., &lt;code&gt;chrome-extension://YOUR_EXTENSION_ID&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Submit the form and copy the provided token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add that token to the pages where you want the API to be enabled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you're building a Chrome extension, follow the specific instructions for extensions&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Technical Requirements
&lt;/h3&gt;

&lt;p&gt;To use these APIs in your browser, you’ll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chrome version 131 to 137&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows 10/11&lt;/strong&gt; or &lt;strong&gt;macOS 13 or higher&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At least 22 GB&lt;/strong&gt; free on the drive where your Chrome profile is stored
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU with more than 4 GB of VRAM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unmetered internet connection&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Note: These APIs &lt;strong&gt;do not work on mobile devices (yet)&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  How to Enable in Chrome
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open Chrome and go to:&lt;br&gt;&lt;br&gt;
&lt;code&gt;chrome://flags/#prompt-api-for-gemini-nano&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable the corresponding flag&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restart Chrome&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to use them
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Translator API&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const translator = await Translator.create({
  sourceLanguage: "en",
  targetLanguage: "ja"
});

const text = await translator.translate("Hello, world!");
const readableStreamOfText = await translator.translateStreaming(`
  Four score and seven years ago our fathers brought forth, upon this...
`);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language Detector API&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const detector = await LanguageDetector.create();

const results = await detector.detect(someUserText);
for (const result of results) {
  console.log(result.detectedLanguage, result.confidence);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Summarizer API&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const summarizer = await Summarizer.create({
  sharedContext: "An article from the Daily Economic News magazine",
  type: "headline",
  length: "short"
});

const summary = await summarizer.summarize(articleEl.textContent, {
  context: "This article was written 2024-08-07 and it's in the World Markets section."
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Writer &amp;amp; Rewriter API&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const writer = await Writer.create({
  tone: "formal"
});

const result = await writer.write(
  "A draft for an inquiry to my bank about how to enable wire transfers on my account"
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const rewriter = await Rewriter.create({
  sharedContext: "A review for the Flux Capacitor 3000 from TimeMachines Inc."
});

const result = await rewriter.rewrite(reviewEl.textContent, {
  context: "Avoid any toxic language and be as constructive as possible."
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt API&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const session = await LanguageModel.create();

// Prompt the model and wait for the whole result to come back.
const result = await session.prompt("Write me a poem.");
console.log(result);

// Prompt the model and stream the result:
const stream = await session.promptStreaming("Write me an extra-long poem.");
for await (const chunk of stream) {
  console.log(chunk);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  My experience
&lt;/h3&gt;

&lt;p&gt;I had the incredible opportunity to collaborate in a project to use this API's to help write with a Chrome extension, I thought right away how valuable that was, having so many things to read, write and share about, we are in the time where GenAI is being used to create content, but how can we keep it personal, valuable and human? I'm truly amazed by the power of AI, I myself am a web Developer and this type of APIs definitely helps you get acquainted to the use and benefits of AI while in the same space you have experience. We web developers shape a lot of what users consume day to day on the web, so it only makes sense for us to have the ability to create solutions using AI, to enhance the users experience, to help improve a product, to reinvent how the users use the web today and also how they are growing to learn how to interact with it.&lt;/p&gt;

&lt;p&gt;Not only to mention, the close interaction web developers have to browsers, our daily tool to work with most of our projects, having the API's available just the same way we interact with other browser API's is an incredible approach by Google, also browsers have evolved so much with the power of resources available to run this models. The Chrome team continues to help evolve the WebAssembly and WebGPU standards to improve the web platform for machine learning.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Good
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The ability to run in the browser&lt;/li&gt;
&lt;li&gt;Provide any user a way to run models without worrying about how to run them if not enough compute in cloud or locally&lt;/li&gt;
&lt;li&gt;The API's to help write content one of the most useful task in GenAI today&lt;/li&gt;
&lt;li&gt;The support and documentation provided by the team and forums to get help on building with these API's&lt;/li&gt;
&lt;li&gt;Gemini Nano is a neat model to tackle these task &lt;/li&gt;
&lt;li&gt;The focus and power given to web developers to open new possibilities to build the next frontier of web apps&lt;/li&gt;
&lt;li&gt;Familiar syntax of the API's if you are already used to using other llms from the cloud&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  What can be improved?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Since it's still experimental, it can definitely fail at times—especially in the Prompt API. In several cases, the model didn’t return any response at all, not even a low-quality one. It would silently fail or hang, particularly on longer or more structured prompts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Memory usage would sometimes skyrocket, causing the browser to slow down or freeze temporarily. I was testing on a MacBook Pro M1 with 16GB RAM. Generation tasks typically took around 20 seconds, and summarization tasks around 12 seconds. Running multiple tasks in sequence or on larger content made the slowdown much more noticeable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Context window limitations often meant that RAG (retrieval-augmented generation) was necessary. Depending on the content size, this could lead to needing a cloud-hosted vector database, which defeats the purpose of a purely client-side setup. This was especially noticeable when summarizing larger documents—while there are workarounds, it still introduces friction and limits flexibility.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I'd love to see more use cases in Google products. Nothing validates a feature better than seeing it applied in real-world tools. Google has many powerful products (like Gmail, Docs, Sheets, etc.) that could benefit from this technology, but we’re not yet seeing it showcased or integrated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consider enabling support for more LLM models in-browser, or improving the current nano model's capabilities (e.g., quantization, progressive loading, caching strategies). More flexibility here would allow broader experimentation and more robust client-side apps.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*Lastly, standardization across browsers would be ideal. I really admire the Chrome team's work on these APIs and hope that similar efforts will extend to other browsers. A cross-browser standard would help make the ecosystem more open, accessible, and developer-friendly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Last words
&lt;/h3&gt;

&lt;p&gt;WebAI represents a pivotal moment in how we interact with artificial intelligence. It brings the power of machine learning models closer to the people who use the web every day and even closer to those of us who build it.&lt;/p&gt;

&lt;p&gt;By lowering the barriers to entry, it empowers developers, educators, creators, and learners to explore what AI can do without feeling overwhelmed. It invites us to reimagine the browser not just as a tool for accessing content, but as a platform for creativity, intelligence, and innovation.&lt;/p&gt;

&lt;p&gt;We’re just scratching the surface of what’s possible. But if this is the beginning, I’m incredibly excited to see where it leads.&lt;/p&gt;

</description>
      <category>webai</category>
      <category>ai</category>
      <category>googleio</category>
    </item>
    <item>
      <title>Building a Multi-Agent Blog Publishing System with CrewAI</title>
      <dc:creator>aileen vl</dc:creator>
      <pubDate>Wed, 09 Apr 2025 13:52:47 +0000</pubDate>
      <link>https://forem.com/aileenvl/building-a-multi-agent-blog-publishing-system-with-crewai-efn</link>
      <guid>https://forem.com/aileenvl/building-a-multi-agent-blog-publishing-system-with-crewai-efn</guid>
      <description>&lt;h2&gt;
  
  
  Introduction: The Power of AI Agent Collaboration
&lt;/h2&gt;

&lt;p&gt;CrewAI is revolutionizing how we build AI systems by enabling multiple specialized agents to collaborate on complex tasks. Unlike single-agent approaches, CrewAI creates a coordinated "crew" of AI agents that work together, each handling different aspects of a workflow. This approach mirrors human team collaboration, where specialists combine their expertise to achieve outcomes greater than what any individual could accomplish alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Multi-Agent Publishing System
&lt;/h2&gt;

&lt;p&gt;For AI Agent Week MTY, I adapted an example from the DeepLearning.AI Multi-Agent Systems course and extended it to create a complete content production pipeline using CrewAI. Starting with the course's foundation of collaborative agents, I enhanced the system to not only generate content but also publish it directly to Dev.to. The system consists of four specialized agents:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Content Planner&lt;/strong&gt;: Analyzes the topic, identifies trends, determines target audience, and creates a structured outline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Writer&lt;/strong&gt;: Transforms the plan into engaging, SEO-optimized content with proper structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editor&lt;/strong&gt;: Reviews the draft for accuracy, clarity, and alignment with best practices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publisher&lt;/strong&gt;: Formats the post for Dev.to, adds appropriate tags, and handles the API integration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What makes this implementation unique is that I adapted it to use Gemini instead of OpenAI, and added a custom publishing agent that can directly post content to Dev.to through their API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation: A Beginner's Guide to CrewAI
&lt;/h2&gt;

&lt;p&gt;If you're new to CrewAI but familiar with Python, here's a complete walkthrough of how to build this system:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Setting Up Your Environment
&lt;/h3&gt;

&lt;p&gt;First, create a new Google Colab notebook (or use Jupyter) and install the necessary packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Install CrewAI and supporting libraries
&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;crewai&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.28&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="n"&gt;crewai_tools&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="n"&gt;langchain_community&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;
&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;crewai[tools]&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;langchain&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="c1"&gt;# Suppress warnings for cleaner output
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;
&lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filterwarnings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ignore&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Setting Up Your API Keys
&lt;/h3&gt;

&lt;p&gt;CrewAI needs access to an LLM. I used Gemini instead of OpenAI, so we need to set up the Gemini API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;crewai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Crew&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LLM&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain.tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Tool&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="c1"&gt;# Set your API keys as environment variables
# Replace these with your actual API keys
&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-gemini-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEVTO_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-devto-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Configure Gemini as our LLM
&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini/gemini-2.0-flash-exp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Note the "gemini/" prefix
&lt;/span&gt;    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="sh"&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;h3&gt;
  
  
  Step 3: Creating Your Agents
&lt;/h3&gt;

&lt;p&gt;In CrewAI, each agent has a specific role, goal, and backstory that shapes how they approach tasks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Content Planner Agent
&lt;/span&gt;&lt;span class="n"&gt;planner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content Planner&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Plan engaging and factually accurate content on {topic}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;re working on planning a blog article &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;about the topic: {topic}.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You collect information that helps the &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audience learn something &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;and make informed decisions. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Your work is the basis for &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;the Content Writer to write an article on this topic.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_delegation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# This agent works independently
&lt;/span&gt;    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;# Uses our configured Gemini LLM
&lt;/span&gt;    &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;             &lt;span class="c1"&gt;# Shows detailed output during execution
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Content Writer Agent
&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content Writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write insightful and factually accurate &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
         &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;opinion piece about the topic: {topic}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;re working on a writing &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a new opinion piece about the topic: {topic}. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You base your writing on the work of &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;the Content Planner, who provides an outline &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;and relevant context about the topic. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You follow the main objectives and &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;direction of the outline, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;as provide by the Content Planner.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_delegation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Editor Agent
&lt;/span&gt;&lt;span class="n"&gt;editor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Editor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Edit a given blog post to align with &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
         &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;the writing style of the organization. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are an editor who receives a blog post &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;from the Content Writer. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Your goal is to review the blog post &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;to ensure that it follows journalistic best practices,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;provides balanced viewpoints &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;when providing opinions or assertions.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_delegation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Creating a Custom Publishing Tool
&lt;/h3&gt;

&lt;p&gt;The key innovation in my implementation is adding a custom tool that allows the Publisher agent to interact with the Dev.to API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;crewai.tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;

&lt;span class="c1"&gt;# Define the input schema for our tool
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DevtoPublishInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Input schema for publishing to Dev.to.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(...,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Article title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(...,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content in Markdown format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;List of tags (max 4)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;series&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Series name if part of one&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;published&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;True to publish, False for draft&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create the custom publishing tool
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DevtoPublishTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseTool&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;publish_to_devto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Publishes an article to Dev.to using its API&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;args_schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DevtoPublishInput&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;series&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;published&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Publishes an article to Dev.to.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEVTO_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error: Dev.to API key not configured. Set DEVTO_API_KEY.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

        &lt;span class="c1"&gt;# Prepare the article data
&lt;/span&gt;        &lt;span class="n"&gt;article_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;article&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body_markdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;published&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;published&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;# Add tags if provided (max 4 allowed)
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Dev.to allows max 4 tags
&lt;/span&gt;            &lt;span class="n"&gt;article_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;article&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tags&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;

        &lt;span class="c1"&gt;# Add series if provided
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;series&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;article_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;article&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;series&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;series&lt;/span&gt;

        &lt;span class="c1"&gt;# Send request to Dev.to API
&lt;/span&gt;        &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/api/articles&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;article_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;article_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Not available&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Article &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;published&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;published&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;saved as draft&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;article_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error connecting to Dev.to API: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize our tool
&lt;/span&gt;&lt;span class="n"&gt;devto_tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DevtoPublishTool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Creating the Publisher Agent with Our Custom Tool
&lt;/h3&gt;

&lt;p&gt;Now we can create a Publisher agent that uses our custom tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Publisher Agent with Dev.to Publishing Tool
&lt;/span&gt;&lt;span class="n"&gt;publisher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dev.to Publisher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Format and publish technical articles on Dev.to&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;backstory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;re a technical content strategist specializing in &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;developer-focused content. You know how to format and &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;optimize articles for the Dev.to platform to maximize &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engagement and visibility in the developer community.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;devto_tool&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Attach our custom tool to this agent
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Creating Tasks for Each Agent
&lt;/h3&gt;

&lt;p&gt;Each agent needs a specific task that defines what they should do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Task for the Content Planner
&lt;/span&gt;&lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1. Prioritize the latest trends, key players, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;and noteworthy news on {topic}.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2. Identify the target audience, considering &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;their interests and pain points.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3. Develop a detailed content outline including &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;an introduction, key points, and a call to action.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4. Include SEO keywords and relevant data or sources.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;expected_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A comprehensive content plan document &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;with an outline, audience analysis, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SEO keywords, and resources.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;planner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Task for the Content Writer
&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1. Use the content plan to craft a compelling &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blog post on {topic}.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2. Incorporate SEO keywords naturally.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3. Sections/Subtitles are properly named &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;in an engaging manner.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4. Ensure the post is structured with an &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engaging introduction, insightful body, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;and a summarizing conclusion.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5. Proofread for grammatical errors and &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alignment with the brand&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s voice.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;expected_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A well-written blog post &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;in markdown format, ready for publication, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;each section should have 2 or 3 paragraphs.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Task for the Editor
&lt;/span&gt;&lt;span class="n"&gt;edit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Proofread the given blog post for &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grammatical errors and &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alignment with the brand&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s voice.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;expected_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A well-written blog post in markdown format, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ready for publication, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;each section should have 2 or 3 paragraphs.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;editor&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Task for the Publisher
&lt;/span&gt;&lt;span class="n"&gt;publish&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Prepare and publish the edited article on Dev.to. You must:
    1. Optimize the title for the developer audience
    2. Format the content properly in Markdown
    3. Select up to 4 relevant tags
    4. Decide if the article should be part of a series
    5. Save as a draft (published=False) initially

    Use the publish_to_devto tool to submit the article to Dev.to.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;expected_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    A confirmation message that the article has been successfully published to Dev.to as a draft,
    including the title, tags selected, and URL of the article if available.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;publisher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;edit&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# This provides the edited content as context
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7: Assembling and Running Your Crew
&lt;/h3&gt;

&lt;p&gt;Finally, we create a crew with all our agents and tasks, then start the process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Create our crew with all agents and tasks
&lt;/span&gt;&lt;span class="n"&gt;crew&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Crew&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;planner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;publisher&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;  &lt;span class="c1"&gt;# Show detailed logs during execution
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Start the process with our chosen topic
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;crew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;kickoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;topic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI agents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# Display the results
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;IPython.display&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Markdown&lt;/span&gt;
&lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! This complete workflow will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate a content plan for your topic&lt;/li&gt;
&lt;li&gt;Write a blog post based on that plan&lt;/li&gt;
&lt;li&gt;Edit the post for clarity and style&lt;/li&gt;
&lt;li&gt;Publish it to Dev.to as a draft&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Challenges &amp;amp; Solutions
&lt;/h2&gt;

&lt;p&gt;The main challenge I faced was adapting the system from OpenAI to Gemini. This required:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configuring the LLM differently: &lt;code&gt;llm = LLM(model="gemini/gemini-2.0-flash-exp", temperature=0.7)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Handling different response formats between AI providers&lt;/li&gt;
&lt;li&gt;Building a custom Dev.to publishing tool that could process the output format from Gemini&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Results &amp;amp; Demo
&lt;/h2&gt;

&lt;p&gt;This project successfully generated and published a comprehensive article on AI agents to Dev.to (&lt;a href="https://dev.to/aileenvl/ai-agents-a-developers-guide-to-autonomous-assistants-and-intelligent-automation-2p48"&gt;view the published article&lt;/a&gt;) which is my previous blog post. The system demonstrates how CrewAI can automate complex workflows while maintaining high-quality output through specialized agent collaboration.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Q--rusmdeAI"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This approach has wide-ranging applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Content teams can accelerate production while maintaining editorial standards&lt;/li&gt;
&lt;li&gt;Developers can build workflow automation systems that handle complex, multi-stage processes&lt;/li&gt;
&lt;li&gt;Organizations can create scalable content strategies with consistent quality and messaging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When I showcased this project at AI Agent Week MTY, the audience was incredibly engaged. Developers were excited to see the system in action, asking thoughtful questions about agent collaboration and API integration. These discussions enriched the learning experience for everyone involved, as we explored different approaches and shared insights together. The collective enthusiasm demonstrated how multi-agent systems are capturing the imagination of the developer community and opening new possibilities for AI applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acknowledgments
&lt;/h2&gt;

&lt;p&gt;This code is based on the Multi-Agent Systems course from DeepLearning.AI platform, with additional custom functionality for publishing to Dev.to. If you're interested in learning more about CrewAI and multi-agent systems, check out their excellent course: &lt;a href="https://www.deeplearning.ai/short-courses/multi-ai-agent-systems-with-crewai/" rel="noopener noreferrer"&gt;Multi-AI Agent Systems with CrewAI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can find the complete implementation of this project in my GitHub repository: &lt;a href="https://github.com/aileenvl/aiagentweekmty" rel="noopener noreferrer"&gt;AI Agent Week MTY&lt;/a&gt;. Feel free to fork it, experiment with it, or contribute improvements!&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>crewai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>AI Agents: A Developer's Guide to Autonomous Assistants and Intelligent Automation</title>
      <dc:creator>aileen vl</dc:creator>
      <pubDate>Fri, 04 Apr 2025 04:18:37 +0000</pubDate>
      <link>https://forem.com/aileenvl/ai-agents-a-developers-guide-to-autonomous-assistants-and-intelligent-automation-2p48</link>
      <guid>https://forem.com/aileenvl/ai-agents-a-developers-guide-to-autonomous-assistants-and-intelligent-automation-2p48</guid>
      <description>&lt;h1&gt;
  
  
  AI Agents: Your Guide to Autonomous Assistants and Intelligent Automation
&lt;/h1&gt;

&lt;p&gt;The rise of artificial intelligence is no longer a futuristic fantasy but a present-day reality transforming industries across the globe. In fact, a recent study by Gartner projects that AI augmentation will generate $2.9 trillion in business value by 2024. At the forefront of this revolution are &lt;strong&gt;AI agents&lt;/strong&gt;, sophisticated systems designed to perform tasks autonomously and intelligently. This article provides a comprehensive overview of &lt;strong&gt;AI agents&lt;/strong&gt;, their applications, and how businesses can leverage them to unlock unprecedented levels of efficiency and innovation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are AI Agents? (Defining the Basics)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AI agents&lt;/strong&gt;, also known as &lt;strong&gt;artificial intelligence agents&lt;/strong&gt; or &lt;strong&gt;autonomous agents&lt;/strong&gt;, are computational entities that can perceive their environment, reason, learn, and act autonomously to achieve specific goals. They possess key properties that set them apart from traditional software programs. These include &lt;strong&gt;autonomy&lt;/strong&gt;, the ability to operate independently without constant human intervention; &lt;strong&gt;intelligence&lt;/strong&gt;, the capacity to learn, reason, and solve problems; a &lt;strong&gt;goal-oriented&lt;/strong&gt; design, focused on achieving specific objectives; and &lt;strong&gt;interactivity&lt;/strong&gt;, the capability to perceive and interact with their environment.&lt;/p&gt;

&lt;p&gt;There are several types of &lt;strong&gt;intelligent agents&lt;/strong&gt;, each with varying levels of complexity and capabilities. Simple reflex agents react to immediate stimuli based on predefined rules. Model-based reflex agents maintain an internal model of the world to make decisions. Goal-based agents strive to achieve specific goals by planning and taking actions. Utility-based agents optimize their actions to maximize a utility function, a measure of satisfaction. Finally, learning agents improve their performance over time through experience. Each type plays a unique role in different applications, allowing for tailored solutions to specific problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rise of AI Agents: Trends and Key Developments
&lt;/h2&gt;

&lt;p&gt;Several key trends are driving the rapid adoption of &lt;strong&gt;AI agents&lt;/strong&gt;. Advancements in &lt;strong&gt;AI&lt;/strong&gt; and &lt;strong&gt;machine learning&lt;/strong&gt; algorithms provide the foundation for more sophisticated and capable agents. The increasing availability of data fuels the training and improvement of these agents. Growing demand for &lt;strong&gt;AI automation&lt;/strong&gt; in various industries is pushing businesses to explore and implement &lt;strong&gt;AI solutions&lt;/strong&gt;. The need for personalized experiences is also a major driver, as &lt;strong&gt;AI agents&lt;/strong&gt; can tailor interactions and services to individual user preferences.&lt;/p&gt;

&lt;p&gt;The integration of generative AI is significantly enhancing &lt;strong&gt;AI agent&lt;/strong&gt; capabilities. Generative AI models enable &lt;strong&gt;AI agents&lt;/strong&gt; to create content, automate creative tasks, and personalize user experiences in unprecedented ways. Furthermore, the seamless integration of &lt;strong&gt;AI agents&lt;/strong&gt; with other technologies like cloud computing and the Internet of Things (IoT) expands their reach and potential applications. For example, edge AI agents are being deployed on edge devices for real-time processing and reduced latency.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Agent Applications Across Industries: Real-World Examples
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AI agents&lt;/strong&gt; are transforming industries by streamlining processes, improving decision-making, and enhancing customer experiences. In customer service, &lt;strong&gt;AI assistants&lt;/strong&gt; like chatbots provide instant support and resolve common issues, freeing up human agents to handle more complex inquiries. In healthcare, &lt;strong&gt;AI agents&lt;/strong&gt; assist with diagnosis, drug discovery, and personalized treatment plans, improving patient outcomes. The &lt;strong&gt;benefits of using AI agents for customer service&lt;/strong&gt; are particularly noticeable in reduced wait times and 24/7 availability.&lt;/p&gt;

&lt;p&gt;The financial sector utilizes &lt;strong&gt;AI agents&lt;/strong&gt; for fraud detection, algorithmic trading, and risk management, safeguarding assets and optimizing investment strategies. Manufacturing leverages &lt;strong&gt;autonomous systems&lt;/strong&gt; for process optimization, predictive maintenance, and quality control, increasing efficiency and reducing downtime. Retailers use &lt;strong&gt;AI agents&lt;/strong&gt; for personalized recommendations, inventory management, and supply chain optimization, enhancing customer satisfaction and streamlining operations. These are just a few examples of how &lt;strong&gt;AI agent examples&lt;/strong&gt; are making a real-world impact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building and Implementing AI Agents: A Practical Guide
&lt;/h2&gt;

&lt;p&gt;Building and implementing &lt;strong&gt;AI agents&lt;/strong&gt; involves several key steps. First, it's crucial to define clear goals and objectives for the agent. Next, you need to select the right &lt;strong&gt;AI agent platform&lt;/strong&gt; or framework, considering factors like scalability, ease of use, and integration capabilities. Gathering and preparing high-quality data is essential for training the &lt;strong&gt;AI agent&lt;/strong&gt; model. The model then needs to be trained and evaluated rigorously to ensure accuracy and reliability. Finally, the &lt;strong&gt;AI agent&lt;/strong&gt; is deployed and continuously monitored to optimize its performance.&lt;/p&gt;

&lt;p&gt;Data quality and security are paramount throughout the entire process. It's crucial to implement robust data governance policies and security measures to protect sensitive information. Ethical considerations and responsible &lt;strong&gt;AI&lt;/strong&gt; development are also vital, ensuring that the &lt;strong&gt;AI agent&lt;/strong&gt; operates fairly and without bias. Building and managing &lt;strong&gt;AI agents&lt;/strong&gt; requires a diverse set of skills and expertise, including data science, software engineering, and domain knowledge. Platforms like AutoGen, CrewAI, and LangChain are emerging as popular choices for building custom &lt;strong&gt;AI agents&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and Considerations
&lt;/h2&gt;

&lt;p&gt;While the potential of &lt;strong&gt;AI agents&lt;/strong&gt; is immense, there are also challenges and considerations to address. Data privacy and security concerns are paramount, requiring robust measures to protect sensitive information. Ethical considerations and potential biases in &lt;strong&gt;AI&lt;/strong&gt; algorithms must be carefully addressed to ensure fairness and prevent discrimination. The lack of transparency and explainability in some &lt;strong&gt;AI&lt;/strong&gt; models can make it difficult to understand their decision-making processes.&lt;/p&gt;

&lt;p&gt;Integration complexities can also pose challenges, requiring careful planning and execution. The cost of development and deployment can be significant, particularly for complex &lt;strong&gt;AI agent&lt;/strong&gt; systems. Responsible &lt;strong&gt;AI&lt;/strong&gt; development and deployment are crucial, requiring adherence to ethical guidelines and best practices. Regulations and guidelines may be necessary to govern the use of &lt;strong&gt;AI agents&lt;/strong&gt; and ensure their responsible application.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of AI Agents: What to Expect
&lt;/h2&gt;

&lt;p&gt;The future of &lt;strong&gt;AI agents&lt;/strong&gt; is bright, with ongoing advancements promising even more sophisticated and capable systems. We can expect to see more &lt;strong&gt;autonomous agents&lt;/strong&gt; that can operate independently and adapt to changing environments. Increased integration with other technologies like robotics, IoT, and cloud computing will further expand the capabilities and applications of &lt;strong&gt;AI agents&lt;/strong&gt;. Wider adoption across industries will drive innovation and transform business processes.&lt;/p&gt;

&lt;p&gt;New &lt;strong&gt;AI agent applications&lt;/strong&gt; will emerge, addressing a wider range of challenges and opportunities. The potential impact of &lt;strong&gt;AI agents&lt;/strong&gt; on society and the workforce is significant, requiring careful consideration and proactive planning. As &lt;strong&gt;AI agents&lt;/strong&gt; become more prevalent, it's crucial to address ethical considerations, ensure responsible development, and mitigate potential risks.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;AI agents&lt;/strong&gt; are revolutionizing industries by providing &lt;strong&gt;AI automation&lt;/strong&gt; and intelligent solutions to complex problems. From enhancing customer service to optimizing manufacturing processes, &lt;strong&gt;AI agents&lt;/strong&gt; are driving efficiency, reducing costs, and improving decision-making. While challenges remain, the potential &lt;strong&gt;benefits of AI agents&lt;/strong&gt; are undeniable. As the technology continues to evolve, businesses that embrace &lt;strong&gt;AI agents&lt;/strong&gt; will be well-positioned to thrive in the future.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>agents</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>What is DevRel? or at least what is to me</title>
      <dc:creator>aileen vl</dc:creator>
      <pubDate>Wed, 12 Mar 2025 19:40:42 +0000</pubDate>
      <link>https://forem.com/aileenvl/what-is-devrel-or-at-least-what-is-to-me-4mf3</link>
      <guid>https://forem.com/aileenvl/what-is-devrel-or-at-least-what-is-to-me-4mf3</guid>
      <description>&lt;p&gt;I was recently accepted into the 4th cohort of &lt;a href="https://t.co/WINMYuOlCj" rel="noopener noreferrer"&gt;DxMentorship&lt;/a&gt; program to kickstart my DevRel career. This blog post is one of the tasks from the program - to share my understanding of what DevRel (Developer Relations) is. As I begin this journey, I wanted to share my thoughts on this position that bridges technology and community.&lt;/p&gt;

&lt;p&gt;Having excellent technology isn't enough. Based on what I've seen, successful products need both technical excellence and human connection. This is exactly why Developer Relations (DevRel) plays such an important role.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is DevRel and What Do They Actually Do?
&lt;/h3&gt;

&lt;p&gt;At its core, Developer Relations is about building relationships between a company and the developers who use (or might use) its products. But what does this look like in practice?&lt;/p&gt;

&lt;p&gt;DevRel position typically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create educational content (tutorials, blog posts, sample projects)&lt;/li&gt;
&lt;li&gt;Speak at conferences and meetups&lt;/li&gt;
&lt;li&gt;Build and nurture developer communities&lt;/li&gt;
&lt;li&gt;Collect and relay developer feedback to product teams or internal developer teams&lt;/li&gt;
&lt;li&gt;Provide developer support beyond standard documentation&lt;/li&gt;
&lt;li&gt;Advocate for developers' needs within the company and for developers using the tools&lt;/li&gt;
&lt;li&gt;Host workshops, hackathons, and other hands-on events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think of it as the human face of technical products, that translates complex capabilities into tangible value and practical applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why DevRel Matters
&lt;/h3&gt;

&lt;p&gt;It's easy to assume that well-documented APIs, chatbots and self-service products eliminate the need for human connections. My experience suggests otherwise. Here's why I believe DevRel is not just helpful but essential:&lt;/p&gt;

&lt;h4&gt;
  
  
  Documentation Is Never Enough
&lt;/h4&gt;

&lt;p&gt;Even the most comprehensive documentation cannot answer every question or address every use case. Having actual people who understand both the product and developers' challenges creates a layer of support that documentation alone cannot provide.&lt;/p&gt;

&lt;p&gt;When developers hit roadblocks, they don't want to search through pages of documentation—they want to ask someone who gets it. Even friction with the simplest documentation can drive developers away from your product permanently. DevRel teams provide that critical human touchpoint that can mean the difference between rejection and adoption, especially when documentation alone isn't cutting it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Community Creates Momentum
&lt;/h4&gt;

&lt;p&gt;Individual developers or companies using a product in isolation don't create momentum. What drives adoption is a thriving community where developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Share their experiences and solutions&lt;/li&gt;
&lt;li&gt;Contribute improvements and extensions&lt;/li&gt;
&lt;li&gt;Help each other overcome challenges&lt;/li&gt;
&lt;li&gt;Create content that expands the product's reach&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DevRel teams cultivate these communities, turning isolated users into connected advocates. They facilitate the knowledge sharing that transforms occasional users into dedicated champions 🏆 .&lt;/p&gt;

&lt;h4&gt;
  
  
  Visibility in The Market
&lt;/h4&gt;

&lt;p&gt;The internet is vast, and developers have countless tools and products competing for their attention. Having dedicated people who actively engage with developer communities helps products stand out in this crowded space.&lt;/p&gt;

&lt;p&gt;DevRel professionals attend events, participate in relevant online communities, and create content that reaches developers who are most likely to benefit from the product.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Feedback Loop That Drives Improvement
&lt;/h4&gt;

&lt;p&gt;Perhaps one of the most valuable functions of DevRel is establishing a clear feedback channel between developers and product teams. This two-way communication ensures that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers feel heard when they encounter issues&lt;/li&gt;
&lt;li&gt;Product teams understand real-world usage patterns&lt;/li&gt;
&lt;li&gt;Improvements align with actual developer needs&lt;/li&gt;
&lt;li&gt;Future roadmaps consider developer priorities&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Challenges of Measuring DevRel Impact
&lt;/h3&gt;

&lt;p&gt;Despite these clear benefits, DevRel teams often face challenges in demonstrating their value. Traditional metrics don't always capture the full impact of relationship-building work. Some important considerations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Long-term investments&lt;/strong&gt;: Community building takes time, and the payoff isn't always immediate or directly attributable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indirect contributions&lt;/strong&gt;: DevRel influences adoption, retention, and product direction in ways that can be difficult to isolate in analytics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global reach&lt;/strong&gt;: The 24/7 nature of global developer communities means DevRel work often spans multiple time zones, creating both challenges and opportunities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  My Perspective: DevRel as Education, Empathy, and Evangelism
&lt;/h3&gt;

&lt;p&gt;Based on my experience, effective DevRel combines three critical elements:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Education&lt;/strong&gt;: Beyond explaining how to use a product, DevRel professionals teach the underlying concepts, best practices, and problem-solving approaches. Translating complex technical details into plain, accessible language is incredibly challenging—yet it's often exactly what developers need. Whether creating comprehensive tutorials, simple how-tos, or conceptual overviews, DevRel professionals are great at transforming technical documentation into meaningful learning experiences that anyone can understand, regardless of their expertise level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Empathy&lt;/strong&gt;: Great DevRel professionals genuinely understand developers' challenges, whether from their own technical experience or through deep listening and engagement. This empathy enables them to &lt;em&gt;communicate&lt;/em&gt; and &lt;em&gt;advocate&lt;/em&gt; effectively for their needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evangelism&lt;/strong&gt;: Not in a sales way, but through authentic enthusiasm for solutions that truly help developers. When DevRel professionals believe in the value of what they're representing, that conviction is contagious.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building Bridges That Last
&lt;/h3&gt;

&lt;p&gt;The most valuable DevRel work happens in the seemingly small interactions—answering questions in community forums, troubleshooting issues on calls, gathering feedback after demos, or connecting developers with similar challenges. These interactions might not always yield immediate results, but they build relationships that create lasting value.&lt;/p&gt;

&lt;p&gt;I believe the human connections that DevRel teams foster remain irreplaceable. They transform products from tools into communities, users into advocates, and feedback into improvement.&lt;/p&gt;

&lt;p&gt;For any company creating products for developers, investing in DevRel isn't just nice to have—it's beneficial for building products that truly meet developer needs and achieve their full potential in the market.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;I'm grateful for the opportunity to write this blog post as part of my DevRel mentorship journey. These thoughts reflect my current understanding, but I recognize I still have so much to learn. I'm excited to hear different perspectives and expand my knowledge of this dynamic field as I continue on this path.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>advocacy</category>
      <category>community</category>
      <category>dxmentorship</category>
    </item>
  </channel>
</rss>
