<?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>DEV Community: Antonio </title>
    <description>The latest articles on DEV Community by Antonio  (@antonioprosperi2svg).</description>
    <link>https://dev.to/antonioprosperi2svg</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092373%2F0b0c9e85-4b67-40f5-a250-9e94df0a8f93.png</url>
      <title>DEV Community: Antonio </title>
      <link>https://dev.to/antonioprosperi2svg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/antonioprosperi2svg"/>
    <language>en</language>
    <item>
      <title>I built a lightweight 2D Web Game Engine in Pure Vanilla JS (BeeEngine v2.8.4)</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Wed, 30 Sep 2026 20:42:52 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/i-built-a-lightweight-2d-web-game-engine-in-pure-vanilla-js-beeengine-v284-4n9</link>
      <guid>https://dev.to/antonioprosperi2svg/i-built-a-lightweight-2d-web-game-engine-in-pure-vanilla-js-beeengine-v284-4n9</guid>
      <description>&lt;p&gt;Hi DEV community! 👋&lt;/p&gt;

&lt;p&gt;Over the past few months, I've been working on &lt;strong&gt;BeeEngine&lt;/strong&gt;, a lightweight 2D game engine built with pure &lt;strong&gt;Vanilla JavaScript&lt;/strong&gt; and &lt;strong&gt;HTML5 Canvas&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;My main goal was to create a clean, modular engine without relying on heavy external frameworks or complex build setups. It features a custom built-in visual inspector (&lt;strong&gt;BeeLadybug&lt;/strong&gt;), a State-Graph Animator, and a robust Audio Mixer.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Project Structure
&lt;/h2&gt;

&lt;p&gt;Here is how BeeEngine is structured under the hood:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BeeEngine-V2.8/
├── index.html                 # Entry point &amp;amp; Canvas config
├── index.js                   # ESM Barrel (re-exporting BeeEngine.js)
├── main.js                    # Visual Demo (BeeUI: anchor, stack, focus, HUD)
├── BeeEngine.js               # CORE (Core Loop &amp;amp; System Coordinator)
├── index.d.ts                 # Global TypeScript definitions &amp;amp; IntelliSense
└── src/
    ├── audio/                 # BeeAudioMixer (bus, fade, duck, pan 2D)
    ├── core/                  # Entities, Prefabs, Tweens, Timelines, Pooling, Scene Manager
    ├── gameplay/              # Player, Enemy, Platform, Collectibles, Menus
    ├── graphics/              # Layers, Animator, Camera, Tilemaps, Particles
    ├── input/                 # Keyboard, Mouse, Touch &amp;amp; Virtual Joysticks
    ├── ui/                    # BeeUI (Panels, Stacks, Labels, Buttons, Nine-slice)
    ├── physics/               # Spatial Hashing, RigidBody &amp;amp; AABB Collisions
    └── debug/                 # BeeLadybug (Visual Inspector &amp;amp; Hitbox Overlay)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✨ Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero External Dependencies:&lt;/strong&gt; Built with 100% pure Vanilla JS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Physics &amp;amp; Collision:&lt;/strong&gt; Integrated Spatial Hash grid for efficient AABB collision detection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Input System:&lt;/strong&gt; Built-in support for Keyboard, Mouse, Touch, and Virtual Joysticks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Engine (BeeUI):&lt;/strong&gt; Flex-like layouts, anchors, focus management, and nine-slice UI rendering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Debugger (BeeLadybug):&lt;/strong&gt; Built-in tool for real-time inspection, data tracking, and hitbox rendering.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎬 Deep Dive: BeeAnimator (State Graph, Not Just Clips)
&lt;/h2&gt;

&lt;p&gt;Most simple engines just play an animation clip. &lt;strong&gt;BeeAnimator&lt;/strong&gt; is a proper State Graph Coordinator. While &lt;code&gt;BeeAnimatedSprite&lt;/code&gt; renders the frames, the Animator decides &lt;em&gt;which&lt;/em&gt; clip to play and &lt;em&gt;when&lt;/em&gt;, handling priorities, hit-locks, and automatic transitions. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;entity.animator&lt;/code&gt; ticks inside the entity loop using the simulation's delta time (&lt;code&gt;dt&lt;/code&gt;), meaning if the game pauses, the animation lifecycle freezes correctly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1. Create the base animated sprite (The Renderer)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sprite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gioco&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createAnimatedSprite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;animations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;idle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="na"&gt;fps&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="na"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="na"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;attack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="na"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Wrap it in the State Graph Animator&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;animator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gioco&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createAnimator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sprite&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;animator&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;initial&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;run&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;run&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;attack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;attack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;exitTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="c1"&gt;// State Transitions via Predicates&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;run&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actor&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;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vx&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;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;run&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actor&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;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;attack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wantsAttack&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sprite&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;animator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;animator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Core Concepts:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Mechanics&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;lock&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;As long as the clip isn't finished, states with &lt;code&gt;priority&lt;/code&gt; (\le) current cannot interrupt it (they get queued).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;exitTo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Defines where to transition automatically once a one-shot/locked clip finishes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;when('*', to, pred)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Defines a global transition predicate checkable from any active state.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;play(name, { force })&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual override request; &lt;code&gt;force: true&lt;/code&gt; breaks active animation locks.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: &lt;code&gt;BeeAnimatedSprite.play(name, { restart: true })&lt;/code&gt; and &lt;code&gt;sprite.finished&lt;/code&gt; are exposed so the animator knows precisely when an action (like an attack) ends.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔊 Deep Dive: BeeAudioMixer (Audio Nodes &amp;amp; Bus Hierarchy)
&lt;/h2&gt;

&lt;p&gt;Instead of poorly cloning HTML5 audio nodes (&lt;code&gt;cloneNode&lt;/code&gt;), BeeEngine uses a proper audio graph node system via &lt;strong&gt;BeeAudioMixer&lt;/strong&gt;. It handles a full hierarchy: &lt;code&gt;master&lt;/code&gt; (\rightarrow) &lt;code&gt;music&lt;/code&gt; / &lt;code&gt;sfx&lt;/code&gt; / &lt;code&gt;ui&lt;/code&gt; / &lt;code&gt;voice&lt;/code&gt;. It supports volume control, muting per channel, smooth fading, 2D panning relative to the camera listener, and automatic &lt;strong&gt;audio ducking&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;The mixer ticks every frame using real-time execution independent of the game simulation pause state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Unlock Audio Graph (requires user gesture interaction)&lt;/span&gt;
&lt;span class="nx"&gt;gioco&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unlock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Play background music with crossfade and custom volume&lt;/span&gt;
&lt;span class="nx"&gt;gioco&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;music&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;track&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;fade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Play a 2D localized sound effect spatialized vs the camera listener&lt;/span&gt;
&lt;span class="nx"&gt;gioco&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;bus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sfx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Procedural beep generation (perfect for web demos without downloading MP3s)&lt;/span&gt;
&lt;span class="c1"&gt;// Triggers automatic music ducking because it runs on the 'voice' bus&lt;/span&gt;
&lt;span class="nx"&gt;gioco&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;frequency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;bus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;voice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; 

&lt;span class="c1"&gt;// Global Bus Controls&lt;/span&gt;
&lt;span class="nx"&gt;gioco&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVolume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sfx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;gioco&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;music&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Core Concepts:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Mechanics&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;bus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hierarchy chain controller. Muting a parent bus automatically silences all child streams.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;duck&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Default behavior: Active signals on the &lt;code&gt;voice&lt;/code&gt; bus automatically duck the &lt;code&gt;music&lt;/code&gt; bus volume down to &lt;code&gt;0.35&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;x, y&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatic distance attenuation and left/right stereo panning relative to the listener position.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;tone()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low-overhead procedural beep generator for quick sound design prototyping.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📦 Try It Out
&lt;/h2&gt;

&lt;p&gt;You can include BeeEngine directly in your project via npm or CDN:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;jsDelivr CDN:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://jsdelivr.net"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;npm:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;beeengine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📊 &lt;strong&gt;CDN Stats &amp;amp; Package:&lt;/strong&gt; &lt;a href="https://jsdelivr.com" rel="noopener noreferrer"&gt;BeeEngine on jsDelivr&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I'd love to hear your thoughts, feedback, or suggestions from fellow web developers and gamedevs! What features would you like to see next?&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>gamedev</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>BeeLadybug — un overlay per il debug DOM in tempo reale</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Sat, 26 Sep 2026 16:08:34 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/beeladybug-un-overlay-per-il-debug-dom-in-tempo-reale-3go0</link>
      <guid>https://dev.to/antonioprosperi2svg/beeladybug-un-overlay-per-il-debug-dom-in-tempo-reale-3go0</guid>
      <description>&lt;p&gt;Un piccolo overlay in azione per il debug in tempo reale.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fshs6c0krvdvpoepyyrww.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fshs6c0krvdvpoepyyrww.jpg" alt="controllo" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8fcwiafgm2uhn1et8q50.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8fcwiafgm2uhn1et8q50.gif" alt="demo" width="720" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Invece di riempire il codice di console.log o stare sempre a smanettare con gli DevTools, ho creato questa piccola utility per tracciare e illuminare gli elementi del DOM e i nodi in tempo reale mentre ci si passa sopra.&lt;/p&gt;

&lt;p&gt;Molto comoda per fare controlli al volo mentre si sviluppa, senza appesantire nulla.&lt;/p&gt;

&lt;p&gt;Che ne pensate? Vi capita mai di impazzire per tracciare gli elementi a schermo? &lt;br&gt;
Provatelo e fatemi sapere se puo' essere utile."(testato su Chrome/Edge)"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://cdn.jsdelivr.net/npm/bee-ladybug@0.4.0/src/index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;BeeLadybugCore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;WebDOMAdapter&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BeeLadybugCore&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebDOMAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🔗 &lt;a href="https://www.npmjs.com/package/bee-ladybug" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/bee-ladybug&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>debugging</category>
    </item>
    <item>
      <title>BeeLadybug Ironic: Code Inspection meets Self-Inspection</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Mon, 21 Sep 2026 18:49:39 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/beeladybug-ironic-debugging-the-code-vs-debugging-the-mind-mhh</link>
      <guid>https://dev.to/antonioprosperi2svg/beeladybug-ironic-debugging-the-code-vs-debugging-the-mind-mhh</guid>
      <description>&lt;p&gt;🐞 BeeLadybug Ironic: A Small End-of-Day Ritual for Devs&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What if we applied the rubber-duck debugging concept to our end-of-day workflow?&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Idea
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzmh08j1fr5ynwqol2qdt.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzmh08j1fr5ynwqol2qdt.jpg" alt="realta" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you close your code editor after hours of problem-solving, refactoring, or hunting down subtle layout bugs, you don't always need another complex dashboard or analytical tool.&lt;/p&gt;

&lt;p&gt;Sometimes, a simple circuit breaker helps you transition out of "dev mode" and step away from the desk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BeeLadybug Ironic&lt;/strong&gt; is an experimental project separate from the main &lt;code&gt;bee-ladybug&lt;/code&gt; debug tool, combining two main concepts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Visual Debugging:&lt;/strong&gt; Inspecting Canvas elements and DOM boundaries under the hood.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Inspection &amp;amp; Irony:&lt;/strong&gt; A lightweight interactive canvas where you can write down thoughts, log simple notes, or reflect on a session before shutting down the system.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mascot Interface:&lt;/strong&gt; A small 2D bee-ladybug mascot welcomes you to the canvas session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflection Prompts:&lt;/strong&gt; Quick interaction nodes to evaluate where you stand:

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"Is this a logic issue or just time for a break?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"What's the main blocker left for tomorrow?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Ready to call it a day?"&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas Transition:&lt;/strong&gt; Selecting an option transitions the interface into a clean workspace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Dissolve Effect:&lt;/strong&gt; You type your temporary notes, hit the action button, and watch the text dissolve into a pixel field on screen. Once cleared, it's gone.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Technical Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runs Locally:&lt;/strong&gt; Everything executes inside the browser's RAM during the session. No backend API calls, no databases, no tracking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript &amp;amp; Canvas:&lt;/strong&gt; Built on a minimal 2D rendering loop to keep performance fast and dependency-free.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Feedback &amp;amp; Ideas
&lt;/h2&gt;

&lt;p&gt;This prototype is evolving, and I'd love to hear your thoughts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do you use any specific routine or visual break when wrapping up a long coding session?&lt;/li&gt;
&lt;li&gt;What kind of canvas particle effect would feel best for clearing text (e.g., pixel dissolve, 8-bit blast, or terminal sweep)?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Feel free to leave a comment below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>javascript</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>"Today I spent 4-5 hours chasing a bug that looked like three different problems. They were all connected: a caching plugin hiding images from Googlebot, a forgotten script blocking the thread, and a wild-goose chase involving PageSpeed warnings about CORS</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Sun, 20 Sep 2026 09:41:44 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/today-i-spent-4-5-hours-chasing-a-bug-that-looked-like-three-different-problems-they-were-all-36ei</link>
      <guid>https://dev.to/antonioprosperi2svg/today-i-spent-4-5-hours-chasing-a-bug-that-looked-like-three-different-problems-they-were-all-36ei</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/antonioprosperi2svg/how-a-caching-plugin-and-an-analytics-script-silently-destroyed-my-seo-and-page-speed-2pfj" class="crayons-story__hidden-navigation-link"&gt;How a Caching Plugin and an Analytics Script Silently Destroyed My SEO and Page Speed&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/antonioprosperi2svg" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092373%2F0b0c9e85-4b67-40f5-a250-9e94df0a8f93.png" alt="antonioprosperi2svg profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antonioprosperi2svg" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio 
                
                
              
              &lt;div id="story-author-preview-content-4698852" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/antonioprosperi2svg" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092373%2F0b0c9e85-4b67-40f5-a250-9e94df0a8f93.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/antonioprosperi2svg/how-a-caching-plugin-and-an-analytics-script-silently-destroyed-my-seo-and-page-speed-2pfj" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 20&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/antonioprosperi2svg/how-a-caching-plugin-and-an-analytics-script-silently-destroyed-my-seo-and-page-speed-2pfj" id="article-link-4698852"&gt;
          How a Caching Plugin and an Analytics Script Silently Destroyed My SEO and Page Speed
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/wordpress"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;wordpress&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/performance"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;performance&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/seo"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;seo&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/antonioprosperi2svg/how-a-caching-plugin-and-an-analytics-script-silently-destroyed-my-seo-and-page-speed-2pfj" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/antonioprosperi2svg/how-a-caching-plugin-and-an-analytics-script-silently-destroyed-my-seo-and-page-speed-2pfj#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>debugging</category>
      <category>performance</category>
      <category>seo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How a Caching Plugin and an Analytics Script Silently Destroyed My SEO and Page Speed</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Sun, 20 Sep 2026 09:18:49 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/how-a-caching-plugin-and-an-analytics-script-silently-destroyed-my-seo-and-page-speed-2pfj</link>
      <guid>https://dev.to/antonioprosperi2svg/how-a-caching-plugin-and-an-analytics-script-silently-destroyed-my-seo-and-page-speed-2pfj</guid>
      <description>&lt;p&gt;When running a dynamic WordPress site powered by external iframe feeds (like HTML5 game networks), performance optimization can quickly turn into a maze of contradictory metrics and subtle bugs.&lt;/p&gt;

&lt;p&gt;Recently, while auditing PlayCombo, I faced a chain of issues ranging from Googlebot indexing failures to endless PageSpeed warning loops. Here is the breakdown of what went wrong, how each issue was resolved, and — in one case — the trade-off I'm still living with.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The "Guest Mode" Trap: Googlebot Couldn't See Images
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Symptom:&lt;/strong&gt; Google Search Console was failing to index media and rich HTML tags on newly published pages, even though everything looked completely fine when browsing as a logged-in administrator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Cause:&lt;/strong&gt; LiteSpeed Cache was running with Guest Mode enabled. Guest Mode attempts to serve an extremely lightweight, bare-bones HTML page on the very first request from a new IP (including Googlebot). Instead of speeding up indexing, it stripped out essential media elements before JavaScript could hydrate the page for crawler bots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix (and the trade-off):&lt;/strong&gt; Disabling Guest Mode restored full HTML — including images — to Googlebot on first contact, and Search Console's live URL test confirmed it: previously hidden images were now visible. But this comes at a cost: every first-time visitor (crawlers included) now receives the full, image-heavy page. On a catalog of 3,000+ games sourced from external feeds, that trade-off is still an open problem I'm actively working to offset — starting with removing unnecessary tracking plugins (see point 2) to claw back some of the lost performance budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Ghost Script: Invisible Analytics Bloat
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Symptom:&lt;/strong&gt; Despite heavy caching, initial execution times and Total Blocking Time (TBT) remained abnormally high.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Cause:&lt;/strong&gt; A legacy integration tag for Microsoft Clarity (session recording) was injected directly into the theme header. On a media-heavy site with multiple external embeds, tracking every micro-interaction created massive JS main-thread execution overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt; Removing the redundant tracking script instantly cleared the main thread, lowering execution delay for third-party media assets. Alongside this, a couple of Site Kit plugin components that weren't actually being used were removed too, trimming a bit more dead weight off every page load.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The PageSpeed Loop: preconnect vs crossorigin
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Symptom:&lt;/strong&gt; PageSpeed Insights gave conflicting advice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Add preconnect hints for game image origins (img.gamemonetize.com)"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once added via basic DNS prefetch inputs, it threw:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Preconnect link was not used. Check crossorigin attribute."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The Cause:&lt;/strong&gt; Image requests initiated by &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags or CSS require CORS handling if requested across origins. Standard DNS prefetch fields in WordPress cache plugins only output &lt;code&gt;&amp;lt;link rel="dns-prefetch"&amp;gt;&lt;/code&gt; or a plain &lt;code&gt;&amp;lt;link rel="preconnect"&amp;gt;&lt;/code&gt;, without the &lt;code&gt;crossorigin&lt;/code&gt; attribute. Because the browser prepared a non-CORS connection, it couldn't reuse it for a CORS image fetch — the early connection got discarded entirely, and the "optimization" did nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt; Instead of relying on basic input fields, explicit header tags were injected directly into the document &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preconnect"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://img.gamemonetize.com"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preconnect"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.htmlgames.com"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preconnect"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://img.gamepix.com"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Server Disk Inflation: Softaculous vs Server Backups
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Symptom:&lt;/strong&gt; cPanel disk space reached critical limits (over 10 GB), threatening site uptime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Cause:&lt;/strong&gt; Softaculous/Installatron was configured to run local daily backups, generating massive &lt;code&gt;.tar.gz&lt;/code&gt; compressed archives directly inside the &lt;code&gt;/application_backups/&lt;/code&gt; home directory. Meanwhile, the web host (Netsons) was already performing off-site block backups via JetBackup 5 — the same job was effectively running twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disabled automated local backups inside Softaculous configuration.&lt;/li&gt;
&lt;li&gt;Purged accumulated &lt;code&gt;.tar.gz&lt;/code&gt; archives via cPanel File Manager.&lt;/li&gt;
&lt;li&gt;Left the host's native JetBackup engine to handle automated daily snapshots off-site, without consuming account quota.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't blindly follow synthetic performance scores.&lt;/strong&gt; PageSpeed advice can create loops if you don't account for CORS semantics on preconnect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit crawler HTML, not just browser HTML.&lt;/strong&gt; Features like Guest Mode can optimize first-byte metrics while unintentionally breaking search engine indexing — and the fix isn't always free of cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some fixes are trade-offs, not solutions.&lt;/strong&gt; Restoring indexability for a 3,000+ page catalog came at the price of page weight for new visitors. That's still a work in progress, not a closed ticket.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your backup layer.&lt;/strong&gt; Make sure software-level installers aren't duplicating host-level snapshot backups.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>performance</category>
      <category>seo</category>
    </item>
    <item>
      <title>BeeLadybug 0.4.0 — A Blind, Zero-Dependency Overlay for Debugging Anything on Screen</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Thu, 17 Sep 2026 18:04:58 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/beeladybug-040-a-blind-zero-dependency-overlay-for-debugging-anything-on-screen-6po</link>
      <guid>https://dev.to/antonioprosperi2svg/beeladybug-040-a-blind-zero-dependency-overlay-for-debugging-anything-on-screen-6po</guid>
      <description>&lt;p&gt;&lt;a href="https://beeenginejs.com/wp-content/uploads/2026/09/Screenshot-2026-09-15-194620.png" rel="noopener noreferrer"&gt;https://beeenginejs.com/wp-content/uploads/2026/09/Screenshot-2026-09-15-194620.png&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I kept running into
&lt;/h2&gt;

&lt;p&gt;Every time I built a new game or a new page, I ended up writing the same throwaway debug code: an FPS counter here, a &lt;code&gt;console.log&lt;/code&gt; there, a red box drawn around whatever DOM node I was hunting down. It always lived inside the project it was debugging — which meant it broke, or had to be rewritten, the moment I moved to a different project.&lt;/p&gt;

&lt;p&gt;So I pulled it out into its own package: &lt;strong&gt;BeeLadybug&lt;/strong&gt;. The core idea is simple and it's the one rule I refuse to break:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Core is blind.&lt;/strong&gt; It doesn't know what a "game," a "DOM node," or a "Python process" is. It only knows &lt;code&gt;sendData(type, payload)&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everything that actually understands &lt;em&gt;what&lt;/em&gt; it's looking at lives in an &lt;strong&gt;Adapter&lt;/strong&gt;. The Core just stores packets, runs a shared clock, and draws an overlay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "blind" matters
&lt;/h2&gt;

&lt;p&gt;The first version of this tool wasn't blind — it was welded to one specific game engine I was building. The moment I wanted to use it on a plain website, I had to rip out half the code. That coupling is exactly what BeeLadybug was built to avoid. A Core that knows nothing about its subject can sit in front of a &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; game, a DOM-heavy site, or a Python backend without a single line of the Core itself changing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The adapters
&lt;/h2&gt;

&lt;p&gt;Four ship today, each one translating a different world into the same generic packets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BeeLadybugCore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CanvasAdapter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;WebDOMAdapter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bee-ladybug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BeeLadybugCore&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Watching a game's canvas&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canvasAdapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CanvasAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;myCanvas&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;canvasAdapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Watching a page's DOM&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;domAdapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebDOMAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;footer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;domAdapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://beeenginejs.com/wp-content/uploads/2026/09/Immagine-2026-09-15-194536.png" rel="noopener noreferrer"&gt;https://beeenginejs.com/wp-content/uploads/2026/09/Immagine-2026-09-15-194536.png&lt;/a&gt;&lt;br&gt;
There's also a &lt;code&gt;PythonBridge&lt;/code&gt;, which streams telemetry over WebSocket from a Python process — useful if you're inspecting a bot or a simulation running server-side, not just the browser.&lt;/p&gt;
&lt;h2&gt;
  
  
  What's new in 0.4.0: two purely passive diagnostic modules
&lt;/h2&gt;

&lt;p&gt;The newest additions are two adapters that don't need you to instrument anything by hand — they attach native browser APIs and just watch.&lt;/p&gt;
&lt;h3&gt;
  
  
  🐜 AntAdapter — DOM mutation rate tracker
&lt;/h3&gt;

&lt;p&gt;It hooks a native &lt;code&gt;MutationObserver&lt;/code&gt; and, instead of just logging every change, keeps a &lt;strong&gt;1-second sliding window per node&lt;/strong&gt;. Cross a mutation-rate threshold (30/sec by default) and it emits a warning naming the offending element:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AntAdapter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bee-ladybug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AntAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;ant&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// → warn: "High Mutation Rate on #cta"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is the kind of thing that's brutal to notice by eye — some countdown or animation quietly re-rendering way more often than it should — but obvious once something is counting for you.&lt;/p&gt;
&lt;h3&gt;
  
  
  🕷️ SpiderAdapter — long tasks &amp;amp; slow resources
&lt;/h3&gt;

&lt;p&gt;This one wraps the native &lt;code&gt;PerformanceObserver&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SpiderAdapter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bee-ladybug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;spider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SpiderAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;spider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// → telemetry: long task, 85ms&lt;/span&gt;
&lt;span class="c1"&gt;// → warn: slow resource, 640ms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Two honest caveats I'd rather state up front than let you discover the hard way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Long Tasks API (&lt;code&gt;entryTypes: ['longtask']&lt;/code&gt;) is &lt;strong&gt;Chromium-only&lt;/strong&gt;. Firefox and Safari don't expose it, so SpiderAdapter feature-detects and logs once, gracefully, instead of pretending to work everywhere.&lt;/li&gt;
&lt;li&gt;Long task entries almost never carry a real script filename — the &lt;code&gt;attribution&lt;/code&gt; field usually just says &lt;code&gt;"window"&lt;/code&gt;. Don't expect &lt;code&gt;"caused by game.js"&lt;/code&gt;; expect a duration and a rough container type.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both adapters register themselves through a small generic mechanism I added specifically so the Core would stay blind even as the toolbar grows:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;disable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ANT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The overlay renders one toggle button per registered adapter — it has no hardcoded knowledge that "ANT" or "SPIDER" exist. A future fifth adapter needs zero changes to the overlay code.&lt;/p&gt;
&lt;h2&gt;
  
  
  Trying it without installing anything
&lt;/h2&gt;

&lt;p&gt;If you just want to see it on a page you don't control the build for, paste this into the browser console:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://cdn.jsdelivr.net/npm/bee-ladybug@0.4.0/src/index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;BeeLadybugCore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;WebDOMAdapter&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BeeLadybugCore&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebDOMAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;bee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No build step, no bundler — it's plain ESM, self-contained, zero runtime dependencies.&lt;/p&gt;
&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Two ideas are on the table but not yet built:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Motion Trail&lt;/strong&gt; — a small FIFO buffer of recent (x, y) positions per adapter, drawn with decaying alpha, to visualize movement paths (particularly useful for the Python bridge, where you're watching a remote process's trajectory).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent Bug Trap&lt;/strong&gt; — a log of caught errors that survives across page reloads (days, not just the session), so you can catch something intermittent, walk away, and come back to it later. Read-only, no runtime mutation — just a log you clear by hand once you've dealt with it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try BeeLadybug on something of your own, I'd genuinely like to hear where it falls over — that's the fastest way this gets better.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/antonioprosperi2-svg" rel="noopener noreferrer"&gt;
        antonioprosperi2-svg
      &lt;/a&gt; / &lt;a href="https://github.com/antonioprosperi2-svg/BeeLadybug-universal" rel="noopener noreferrer"&gt;
        BeeLadybug-universal
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Lightweight, zero-dependency HUD &amp;amp; telemetry overlay for web apps, game engines, and Python backends. Includes WebSocket bridge and custom AI assistant integration.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="MD"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;BeeLadybug&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/antonioprosperi2-svg/BeeLadybug-universal/main/docs/logo.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fantonioprosperi2-svg%2FBeeLadybug-universal%2Fmain%2Fdocs%2Flogo.jpg" alt="BeeLadybug" width="720"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Universal telemetry and visual inspection overlay.&lt;/p&gt;

&lt;p&gt;BeeLadybug is &lt;strong&gt;not&lt;/strong&gt; a Canvas widget. It is a small open-source debugger
core that accepts raw packets from any source — Canvas 2D games, DOM pages
headless bots, Python processes, AI pipelines — and renders them in one
dark console.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Il Core non sa cosa sta monitorando. Riceve solo dati grezzi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Perché questa struttura&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Il file storico &lt;code&gt;BeeLadybug&lt;/code&gt; era accoppiato a un engine di gioco (entità,
hitbox, &lt;code&gt;ctx.drawOverlay&lt;/code&gt;). Quello non scala a un sito HTML o a un modello
Python. Per questo il progetto riparte da zero con due strati:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Strato&lt;/th&gt;

&lt;th&gt;Responsabilità&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;&lt;code&gt;src/core/&lt;/code&gt;&lt;/td&gt;

&lt;td&gt;Orologio fittizio, buffer, grafici, overlay cyberpunk&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;&lt;code&gt;src/adapters/&lt;/code&gt;&lt;/td&gt;

&lt;td&gt;Traduttori. Convertono un mondo specifico in &lt;code&gt;sendData()&lt;/code&gt;&lt;br&gt;
&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;L'overlay &lt;strong&gt;non&lt;/strong&gt; è disegnato sul Canvas. È un pannello HTML in Shadow DOM:
funziona sopra un gioco, sopra una pagina, o da solo in una sandbox.&lt;/p&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;bee-ladybug/
├── src/
│   ├── index.js                 # API pubblica&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/antonioprosperi2-svg/BeeLadybug-universal" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/bee-ladybug" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.npmjs.com/package/bee-ladybug" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/bee-ladybug&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>debugging</category>
    </item>
    <item>
      <title>🔥 Stop using 500KB heavy telemetry packages for basic logs or canvas tracking.

Rebuilding BeeLadybug 🐞: a zero-dep universal visual debugger with a blind Core &amp; Shadow DOM overlay. No lag, no style conflicts 🚀

Check out the full breakdown 👇</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Sun, 13 Sep 2026 19:52:05 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/stop-using-500kb-heavy-telemetry-packages-for-basic-logs-or-canvas-tracking-rebuilding-3054</link>
      <guid>https://dev.to/antonioprosperi2svg/stop-using-500kb-heavy-telemetry-packages-for-basic-logs-or-canvas-tracking-rebuilding-3054</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/antonioprosperi2svg/riscrivere-beeladybug-da-zero-dallengine-di-gioco-al-debugger-universale-3g2j" class="crayons-story__hidden-navigation-link"&gt;Riscrivere BeeLadybug da zero: dall'engine di gioco al Debugger Universale&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/antonioprosperi2svg" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092373%2F0b0c9e85-4b67-40f5-a250-9e94df0a8f93.png" alt="antonioprosperi2svg profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antonioprosperi2svg" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio 
                
                
              
              &lt;div id="story-author-preview-content-4645247" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/antonioprosperi2svg" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092373%2F0b0c9e85-4b67-40f5-a250-9e94df0a8f93.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/antonioprosperi2svg/riscrivere-beeladybug-da-zero-dallengine-di-gioco-al-debugger-universale-3g2j" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 13&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/antonioprosperi2svg/riscrivere-beeladybug-da-zero-dallengine-di-gioco-al-debugger-universale-3g2j" id="article-link-4645247"&gt;
          Riscrivere BeeLadybug da zero: dall'engine di gioco al Debugger Universale
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/antonioprosperi2svg/riscrivere-beeladybug-da-zero-dallengine-di-gioco-al-debugger-universale-3g2j#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Riscrivere BeeLadybug da zero: dall'engine di gioco al Debugger Universale</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Sun, 13 Sep 2026 19:40:53 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/riscrivere-beeladybug-da-zero-dallengine-di-gioco-al-debugger-universale-3g2j</link>
      <guid>https://dev.to/antonioprosperi2svg/riscrivere-beeladybug-da-zero-dallengine-di-gioco-al-debugger-universale-3g2j</guid>
      <description>&lt;h2&gt;
  
  
  BeeLadybug 🐞
&lt;/h2&gt;

&lt;p&gt;Universal telemetry and visual inspection overlay.&lt;/p&gt;

&lt;p&gt;BeeLadybug non è un semplice widget Canvas: è un debugger open source ultraleggero che riceve pacchetti dati grezzi da qualsiasi sorgente (giochi Canvas 2D, pagine DOM, bot headless, processi Python e pipeline AI) e li visualizza in un'unica console scura in Shadow DOM.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Il Core non sa cosa sta monitorando. Riceve solo dati grezzi.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Perché questa struttura
&lt;/h3&gt;

&lt;p&gt;Il file storico di &lt;code&gt;BeeLadybug&lt;/code&gt; era strettamente accoppiato al motore di gioco (entità, hitbox, &lt;code&gt;ctx.drawOverlay&lt;/code&gt;). Un approccio che non scala quando si vuole ispezionare un sito HTML o un modello Python. Il progetto è stato quindi ripensato da zero su due livelli distinti:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strato&lt;/th&gt;
&lt;th&gt;Responsabilità&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/core/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Orologio fittizio, buffer, grafici, overlay cyberpunk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src/adapters/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Traduttori. Convertono un mondo specifico in chiamate &lt;code&gt;sendData()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;L'overlay &lt;strong&gt;non&lt;/strong&gt; è disegnato sul Canvas: è un pannello HTML isolato in Shadow DOM che funziona sopra un gioco, sopra una pagina web o da solo all'interno di una sandbox.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
text
bee-ladybug/
├── src/
│   ├── index.js                 # API pubblica
│   ├── core/
│   │   ├── BeeLadybugCore.js    # stato, clock, sendData
│   │   └── UIOverlay.js         # console scura + sparkline
│   └── adapters/
│       ├── CanvasAdapter.js     # prossimamente: hitbox e giochi
│       ├── WebDOMAdapter.js     # prossimamente: layout HTML
│       └── python/
│           └── PythonBridge.js  # futuro: WebSocket → sendData
├── examples/
│   └── core-sandbox.js          # demo senza adapter
├── index.html
├── package.json
└── README.md

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Inside BeeLadybug 🐞: A deep dive into visual debugging, OBB collision tracking, and F2 overlay architecture for the CodePen Challenge! Check out the full Mermaid flowchart and let me know your thoughts 🚀</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Sun, 13 Sep 2026 18:14:45 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/inside-beeladybug-a-deep-dive-into-visual-debugging-obb-collision-tracking-and-f2-overlay-14fk</link>
      <guid>https://dev.to/antonioprosperi2svg/inside-beeladybug-a-deep-dive-into-visual-debugging-obb-collision-tracking-and-f2-overlay-14fk</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/antonioprosperi2svg/inside-beeladybug-visual-logic-collision-debugging-codepen-challenge-5bg5" class="crayons-story__hidden-navigation-link"&gt;Inside BeeLadybug: Visual Logic &amp;amp; Collision Debugging (CodePen Challenge)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/antonioprosperi2svg" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092373%2F0b0c9e85-4b67-40f5-a250-9e94df0a8f93.png" alt="antonioprosperi2svg profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antonioprosperi2svg" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio 
                
                
              
              &lt;div id="story-author-preview-content-4640771" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/antonioprosperi2svg" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092373%2F0b0c9e85-4b67-40f5-a250-9e94df0a8f93.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/antonioprosperi2svg/inside-beeladybug-visual-logic-collision-debugging-codepen-challenge-5bg5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 12&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/antonioprosperi2svg/inside-beeladybug-visual-logic-collision-debugging-codepen-challenge-5bg5" id="article-link-4640771"&gt;
          Inside BeeLadybug: Visual Logic &amp;amp; Collision Debugging (CodePen Challenge)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/codepenchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;codepenchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gamedev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gamedev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/antonioprosperi2svg/inside-beeladybug-visual-logic-collision-debugging-codepen-challenge-5bg5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              3&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Inside BeeLadybug 🐞: A deep dive into visual debugging, OBB collision tracking, and F2 overlay architecture for the CodePen Challenge! Check out the full Mermaid flowchart and let me know your thoughts 🚀</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Sun, 13 Sep 2026 18:07:43 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/inside-beeladybug-a-deep-dive-into-visual-debugging-obb-collision-tracking-and-f2-overlay-2mhj</link>
      <guid>https://dev.to/antonioprosperi2svg/inside-beeladybug-a-deep-dive-into-visual-debugging-obb-collision-tracking-and-f2-overlay-2mhj</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/antonioprosperi2svg/inside-beeladybug-visual-logic-collision-debugging-codepen-challenge-5bg5" class="crayons-story__hidden-navigation-link"&gt;Inside BeeLadybug: Visual Logic &amp;amp; Collision Debugging (CodePen Challenge)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/antonioprosperi2svg" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092373%2F0b0c9e85-4b67-40f5-a250-9e94df0a8f93.png" alt="antonioprosperi2svg profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/antonioprosperi2svg" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Antonio 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Antonio 
                
                
              
              &lt;div id="story-author-preview-content-4640771" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/antonioprosperi2svg" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092373%2F0b0c9e85-4b67-40f5-a250-9e94df0a8f93.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Antonio &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/antonioprosperi2svg/inside-beeladybug-visual-logic-collision-debugging-codepen-challenge-5bg5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 12&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/antonioprosperi2svg/inside-beeladybug-visual-logic-collision-debugging-codepen-challenge-5bg5" id="article-link-4640771"&gt;
          Inside BeeLadybug: Visual Logic &amp;amp; Collision Debugging (CodePen Challenge)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/codepenchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;codepenchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gamedev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gamedev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/antonioprosperi2svg/inside-beeladybug-visual-logic-collision-debugging-codepen-challenge-5bg5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              3&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Inside BeeLadybug: Visual Logic &amp; Collision Debugging (CodePen Challenge)</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Sat, 12 Sep 2026 20:04:40 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/inside-beeladybug-visual-logic-collision-debugging-codepen-challenge-5bg5</link>
      <guid>https://dev.to/antonioprosperi2svg/inside-beeladybug-visual-logic-collision-debugging-codepen-challenge-5bg5</guid>
      <description>&lt;h2&gt;
  
  
  🐞 BeeLadybug (v2.4.0) — Visual Debugging &amp;amp; System Monitoring
&lt;/h2&gt;

&lt;p&gt;Following up on my previous post about &lt;strong&gt;BeeLadybug&lt;/strong&gt;, I wanted to map out its internal architecture for this week's CodePen Challenge using a clean Mermaid flowchart!&lt;/p&gt;

&lt;p&gt;BeeLadybug serves as the primary visual inspector for &lt;strong&gt;BeeEngine JS&lt;/strong&gt;. It lives isolated in &lt;code&gt;src/debug/&lt;/code&gt; and executes its render pass immediately after the game world, overlaying AABB/OBB hitboxes in camera space and system metrics in screen space.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⌨️ Input Architecture &amp;amp; Control
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;F12 Avoidance:&lt;/strong&gt; Left untouched to preserve standard browser DevTools workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tilde Key (~) Alternative:&lt;/strong&gt; Avoided due to non-standard layouts on non-US keyboards (such as Italian layouts).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;F2 Toggle:&lt;/strong&gt; Selected as the clean, standard toggle key for desktop and indie game engine debug panels.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 Screen Overlay Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AABB &amp;amp; OBB Hitbox Tracking:&lt;/strong&gt; Traverses active scene entities, groups, and child nodes. If an entity contains a &lt;code&gt;BeeTransform&lt;/code&gt;, BeeLadybug calculates and draws oriented bounding boxes (&lt;strong&gt;OBB&lt;/strong&gt;) in real-time.

&lt;ul&gt;
&lt;li&gt;🟢 &lt;strong&gt;Green:&lt;/strong&gt; Active entity, no collision detected.&lt;/li&gt;
&lt;li&gt;🔴 &lt;strong&gt;Red:&lt;/strong&gt; Overlapping/colliding with another bounding box.&lt;/li&gt;
&lt;li&gt;⚪ &lt;strong&gt;Gray:&lt;/strong&gt; Disabled or inactive entity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engine Metrics:&lt;/strong&gt; Displays current frame rate (&lt;code&gt;BeeTime.fps&lt;/code&gt;), active entity count vs. total allocation, frame execution time (&lt;code&gt;unscaledDt&lt;/code&gt; in ms), &lt;code&gt;timeScale&lt;/code&gt;, and simulation state (&lt;code&gt;RUN&lt;/code&gt;/&lt;code&gt;FREEZE&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🕹️ Quick Controls
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Action Performed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;F2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Toggle visual debugger panel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;F3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Toggle instant slow-motion (0.25x / 1.0x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;F4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Freeze / Unfreeze simulation loop (&lt;code&gt;BeeTime.pause&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Technical Note:&lt;/strong&gt; The GUI buttons on the screen overlay trigger the exact same methods as physical keyboard shortcuts. Freezing the loop stops delta time (&lt;code&gt;dt&lt;/code&gt;) calculations while maintaining the render loop, allowing pixel-perfect inspection of overlapping hitboxes.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛠️ Quick Implementation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BeeEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gameCanvas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enableLadybug&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Enabled on boot; press F2 to hide &lt;/span&gt;
&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📐 Logical Collision &amp;amp; Debug Flowchart
&lt;/h2&gt;

&lt;p&gt;Here is the exact decision workflow executed when BeeLadybug inspects entity bounds during high-throughput canvas operations:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A[🐞 BeeLadybug Detects Bug] --&amp;gt; B{Is SpatialHash Enabled?}
    B -- Yes --&amp;gt; C[🎯 Locate Colliding Entity ID]
    B -- No --&amp;gt; D[⚠️ Fallback: Full Canvas Scan]
    C --&amp;gt; E[📊 Log to BeeLadybug Console]
    D --&amp;gt; E
    E --&amp;gt; F[🔧 Apply Fix &amp;amp; Resume 60 FPS]

    %% Custom Cyberpunk Styling %%
    classDef bugStyle fill:#ff4757,stroke:#ff6b81,stroke-width:2px,color:#fff;
    classDef hashStyle fill:#2ed573,stroke:#2bcbba,stroke-width:2px,color:#fff;
    classDef warnStyle fill:#ffa502,stroke:#ff7f50,stroke-width:2px,color:#000;
    classDef fixStyle fill:#1e90ff,stroke:#70a1ff,stroke-width:2px,color:#fff;

    class A bugStyle;
    class C hashStyle;
    class D warnStyle;
    class F fixStyle;&lt;/code&gt;&lt;/pre&gt;



</description>
      <category>codepenchallenge</category>
      <category>gamedev</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>BeeEngine JS</title>
      <dc:creator>Antonio </dc:creator>
      <pubDate>Sat, 12 Sep 2026 18:39:10 +0000</pubDate>
      <link>https://dev.to/antonioprosperi2svg/beeengine-js-l2</link>
      <guid>https://dev.to/antonioprosperi2svg/beeengine-js-l2</guid>
      <description>&lt;h2&gt;
  
  
  Building a Pure CSS 3D Interactive Tower (Zero WebGL Dependencies)
&lt;/h2&gt;

&lt;p&gt;I wanted to display the modular architecture of my open-source 2D game framework, &lt;strong&gt;BeeEngine JS&lt;/strong&gt;, directly on its landing page—without the massive overhead of heavy 3D WebGL libraries.&lt;/p&gt;

&lt;p&gt;Instead of loading bulky 3D engines just for a visual widget (which adds unnecessary JavaScript payload and destroys the Total Blocking Time on mobile), I built a fully interactive 3D rotating tower using &lt;strong&gt;Pure CSS 3D Transforms&lt;/strong&gt; driven entirely by the GPU compositor layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Key Highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100% Native CSS 3D:&lt;/strong&gt; Built using &lt;code&gt;perspective&lt;/code&gt;, &lt;code&gt;rotateY()&lt;/code&gt;, &lt;code&gt;translateZ()&lt;/code&gt;, and standard semantic HTML elements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU Accelerated:&lt;/strong&gt; Layout transformations run off the main thread, keeping Total Blocking Time (TBT) at zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight JS Interaction:&lt;/strong&gt; Minimal Vanilla JS (ES6) handling touch and mouse drag events to smoothly control rotation without blocking normal clicks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO &amp;amp; Crawler Friendly:&lt;/strong&gt; Unlike WebGL canvas elements, every card in this tower is a standard &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; link, fully discoverable by search engine crawlers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🛠️ The Architecture Behind It
&lt;/h3&gt;

&lt;p&gt;The goal of &lt;strong&gt;BeeEngine JS&lt;/strong&gt; is to provide an ultra-lightweight (27.9 kB) and razor-sharp environment for 2D web games. Forcing users to download hundreds of kilobytes of WebGL code just to see the features of a &lt;em&gt;2D framework&lt;/em&gt; felt like a complete technical contradiction. &lt;/p&gt;

&lt;p&gt;By offloading the 3D math (&lt;code&gt;rotateY&lt;/code&gt; calculation based on the number of cards) directly to the browser's CSS rendering engine, the main thread remains 100% free to handle game logic, asset loading, and smooth scrolling.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Live Demo
&lt;/h3&gt;

&lt;p&gt;Check out the interactive CodePen demo below:&lt;br&gt;
Check out this Pen I made!&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/editor/Antonio-Prosperi/embed/01a096da-7acc-719c-939b-4436fd4f24bb?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>codepen</category>
    </item>
  </channel>
</rss>
