<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Felipe Adeildo</title><link>https://felipeadeildo.com/</link><description>Co-Founder @ RanqIA · Fellow Estudar '25 · Behring Scholar '25 · CS @ Insper '25</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>contato@felipeadeildo.com (Felipe Adeildo)</managingEditor><webMaster>contato@felipeadeildo.com (Felipe Adeildo)</webMaster><lastBuildDate>Tue, 22 Apr 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://felipeadeildo.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Building a WhatsApp MCP Server: LLM Agents That Can Text</title><link>https://felipeadeildo.com/mcp-whatsapp/</link><pubDate>Tue, 22 Apr 2025 00:00:00 +0000</pubDate><author>contato@felipeadeildo.com (Felipe Adeildo)</author><guid>https://felipeadeildo.com/mcp-whatsapp/</guid><description><![CDATA[<p><a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreffer ">Model Context Protocol</a> (MCP) is Anthropic&rsquo;s open standard for connecting LLMs to external tools and data sources. Instead of building a custom tool-calling integration for every model, you build one MCP server and any compatible client — Claude, Cursor, Zed, your own agent — can use it.</p>
<p>I built <a href="https://github.com/felipeadeildo/whatsapp-mcp" target="_blank" rel="noopener noreffer "><code>whatsapp-mcp</code></a>: an MCP server that gives LLM agents full access to WhatsApp. This post covers the architecture and the interesting problems I hit.</p>]]></description></item><item><title>Web Scraping in 2025: Getting Past Anti-Bot Systems</title><link>https://felipeadeildo.com/web-scraping-anti-bot/</link><pubDate>Mon, 10 Mar 2025 00:00:00 +0000</pubDate><author>contato@felipeadeildo.com (Felipe Adeildo)</author><guid>https://felipeadeildo.com/web-scraping-anti-bot/</guid><description><![CDATA[<p>Web scraping in 2025 is a constant arms race. The easy targets are gone — any site worth scraping has Cloudflare, DataDome, or something custom standing between you and the data. This post is about what actually works.</p>
<h2 id="the-landscape">The Landscape</h2>
<p>Three years ago, a rotating proxy pool and a randomized user-agent were enough to get through most defenses. Today:</p>
<ul>
<li><strong>Cloudflare Turnstile / Bot Management</strong> runs JavaScript challenges and fingerprints your TLS handshake</li>
<li><strong>DataDome</strong> does real-time behavioral analysis — mouse movement, scroll patterns, timing</li>
<li><strong>PerimeterX</strong> (now HUMAN) watches your request graph across sessions</li>
</ul>
<p>The fundamental shift is that detection moved from <em>request-level</em> to <em>session-level</em>. A single suspicious signal used to flag a request. Now, systems build a behavioral profile across hundreds of interactions before deciding whether you&rsquo;re a bot.</p>]]></description></item><item><title>Hello, World — New Site with Hugo &amp; LoveIt</title><link>https://felipeadeildo.com/hello-world/</link><pubDate>Wed, 15 Jan 2025 00:00:00 +0000</pubDate><author>contato@felipeadeildo.com (Felipe Adeildo)</author><guid>https://felipeadeildo.com/hello-world/</guid><description><![CDATA[<p>Welcome to the new <code>felipeadeildo.com</code> — rebuilt from scratch with <a href="https://gohugo.io/" target="_blank" rel="noopener noreffer ">Hugo</a> and the <a href="https://hugoloveit.com/" target="_blank" rel="noopener noreffer ">LoveIt theme</a>.</p>
<p>The old site was a single HTML file with Tailwind and GSAP animations — fun to build, but hard to maintain and impossible to blog on. This new setup gives me:</p>
<ul>
<li>A proper <strong>blog</strong> with tags, categories, and RSS</li>
<li>A <strong>projects</strong> showcase page</li>
<li><strong>Dark/light mode</strong> auto-detection</li>
<li><strong>Math rendering</strong> via KaTeX</li>
<li><strong>Code highlighting</strong> with line numbers</li>
<li><strong>Comments</strong> via giscus (GitHub Discussions)</li>
<li><strong>Search</strong> via Lunr.js</li>
</ul>
<hr>
<h2 id="feature-tour">Feature Tour</h2>
<h3 id="code-blocks">Code Blocks</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Generate Fibonacci sequence up to n terms.&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">    <span class="n">seq</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">seq</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">seq</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">seq</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">seq</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">seq</span><span class="p">[:</span><span class="n">n</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">fibonacci</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="c1"># [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]</span></span></span></code></pre></div></div>
<h3 id="math-katex">Math (KaTeX)</h3>
<p>Inline math: $E = mc^2$</p>]]></description></item></channel></rss>