<?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: Andres Ortiz</title>
    <description>The latest articles on DEV Community by Andres Ortiz (@andres_ortiz_c410e5f78515).</description>
    <link>https://dev.to/andres_ortiz_c410e5f78515</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3398233%2F51dfac5c-f2ac-48c6-ae68-09b7ebef67d1.png</url>
      <title>DEV Community: Andres Ortiz</title>
      <link>https://dev.to/andres_ortiz_c410e5f78515</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andres_ortiz_c410e5f78515"/>
    <language>en</language>
    <item>
      <title>A Personal Take on Why It’s Worth — From Physical Barriers to Logical Frameworks</title>
      <dc:creator>Andres Ortiz</dc:creator>
      <pubDate>Fri, 15 Aug 2025 18:03:32 +0000</pubDate>
      <link>https://dev.to/andres_ortiz_c410e5f78515/a-personal-take-on-why-its-worth-from-physical-barriers-to-logical-frameworks-kp7</link>
      <guid>https://dev.to/andres_ortiz_c410e5f78515/a-personal-take-on-why-its-worth-from-physical-barriers-to-logical-frameworks-kp7</guid>
      <description>&lt;p&gt;You ever look at your yard and think, &lt;em&gt;“Man, I could totally turn this into something smarter”&lt;/em&gt;? That was me last year. My old fence was falling apart, but instead of just replacing it, I thought… what if I made it part of my connected home? That’s how I ended up going for a &lt;strong&gt;&lt;a href="https://chicagolandfencepros.com/aluminum-fences-chicago" rel="noopener noreferrer"&gt;Aluminum Fences chicago&lt;/a&gt;&lt;/strong&gt; — but not just any fence. This one was built to play nice with IoT gadgets.  &lt;/p&gt;




&lt;h2&gt;
  
  
  The “near me” factor in a connected world
&lt;/h2&gt;

&lt;p&gt;Here’s the thing — when I searched &lt;strong&gt;&lt;a href="https://chicagolandfencepros.com/aluminum-fences-chicago" rel="noopener noreferrer"&gt;Aluminum Fences near me&lt;/a&gt;&lt;/strong&gt;, I wasn’t just looking for a fence builder. I wanted someone who could also think about motion sensors, smart locks, and maybe even a camera mount or two. Turns out, local pros can be surprisingly open to blending old-school craftsmanship with tech.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Why a fence is basically an IoT-ready platform
&lt;/h2&gt;

&lt;p&gt;Sounds weird, right? But think about it: a fence is a &lt;em&gt;framework&lt;/em&gt;. With a little imagination, it’s a perfect base for:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smart gates&lt;/strong&gt; that unlock with your phone.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perimeter sensors&lt;/strong&gt; that send alerts if something’s moving out there.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weather stations&lt;/strong&gt; mounted at the edge of your property.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outdoor lighting&lt;/strong&gt; that responds to movement.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When I had my &lt;strong&gt;&lt;a href="https://chicagolandfencepros.com/aluminum-fences-chicago" rel="noopener noreferrer"&gt;Aluminum Fences in chicago&lt;/a&gt;&lt;/strong&gt; installed, I worked with the team to pre-wire certain spots. It’s way easier to plan for tech while you’re building, rather than drilling holes later and messing up the finish.  &lt;/p&gt;




&lt;h2&gt;
  
  
  My top 5 “IoT fence” lessons learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Plan power &amp;amp; connectivity early&lt;/strong&gt; — running wires later is a headache.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Height matters for sensors&lt;/strong&gt; — too low, and your pets will trigger false alarms.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Think modular&lt;/strong&gt; — mount devices so they’re easy to upgrade.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weatherproof everything&lt;/strong&gt; — IoT gear hates rain more than you think.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blend aesthetics with function&lt;/strong&gt; — you don’t want it looking like a sci-fi movie set (unless you do).
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  How my fence became part of my smart home
&lt;/h2&gt;

&lt;p&gt;Honestly, it’s kind of cool. I can get a ping on my phone if the gate opens. My backyard lights turn on automatically when I get home. And on windy days, my weather sensor lets me know if the wind’s strong enough to knock over my patio umbrella.  &lt;/p&gt;

&lt;p&gt;It’s not just a fence anymore — it’s the outer edge of my personal network.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Why you might go for it too
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You get &lt;strong&gt;privacy + security&lt;/strong&gt; in one shot.
&lt;/li&gt;
&lt;li&gt;Your home’s perimeter becomes part of your smart ecosystem.
&lt;/li&gt;
&lt;li&gt;Neighbors think you’re a genius (and maybe a little eccentric).
&lt;/li&gt;
&lt;li&gt;You can expand it anytime with new gadgets.
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you’re already into smart homes, adding IoT to your fence is like adding one more friendly guard to your team. And if you’re not? Well, you still get a fence that looks amazing and works hard.  &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Sincronizar limpiezas espirituales con fases lunares usando datos astronómicos y programación en Python</title>
      <dc:creator>Andres Ortiz</dc:creator>
      <pubDate>Sat, 09 Aug 2025 18:19:46 +0000</pubDate>
      <link>https://dev.to/andres_ortiz_c410e5f78515/sincronizar-limpiezas-espirituales-con-fases-lunares-usando-datos-astronomicos-y-programacion-en-4j17</link>
      <guid>https://dev.to/andres_ortiz_c410e5f78515/sincronizar-limpiezas-espirituales-con-fases-lunares-usando-datos-astronomicos-y-programacion-en-4j17</guid>
      <description>&lt;p&gt;En las tradiciones esotéricas, las &lt;strong&gt;fases lunares&lt;/strong&gt; han tenido un papel importante en la efectividad de rituales y limpiezas espirituales. Hoy, gracias a la programación, podemos combinar el conocimiento ancestral con datos astronómicos precisos para ejecutar limpiezas espirituales en el momento exacto, aumentando su potencia y eficacia.  &lt;/p&gt;

&lt;p&gt;Por ejemplo, si un sanador en &lt;strong&gt;&lt;a href="https://elsecretoazteca.com/limpieza-espiritual-chicago/" rel="noopener noreferrer"&gt;Limpieza Espiritual Chicago il&lt;/a&gt;&lt;/strong&gt; desea coordinar su trabajo con la luna llena o la luna nueva, puede apoyarse en un módulo de Python para obtener información astronómica actualizada y planificar sus ceremonias de manera más precisa.  &lt;/p&gt;

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

&lt;h2&gt;
  
  
  ¿Por qué sincronizar con las fases lunares?
&lt;/h2&gt;

&lt;p&gt;Las fases de la luna influyen en la energía disponible para ciertos tipos de trabajos espirituales:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Luna nueva&lt;/strong&gt;: Inicio de proyectos, renovación energética.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cuarto creciente&lt;/strong&gt;: Expansión, crecimiento personal.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Luna llena&lt;/strong&gt;: Culminación, liberación de bloqueos.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cuarto menguante&lt;/strong&gt;: Purificación, limpieza profunda.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Realizar una &lt;strong&gt;&lt;a href="https://elsecretoazteca.com/limpieza-espiritual-chicago/" rel="noopener noreferrer"&gt;Limpieza Espiritual en Chicago&lt;/a&gt;&lt;/strong&gt; en sincronía con estas fases puede potenciar el resultado y la percepción de los clientes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementando un sistema de sincronización con Python
&lt;/h2&gt;

&lt;p&gt;A continuación, un ejemplo de código que utiliza la librería &lt;code&gt;astronomy-lunar&lt;/code&gt; (puedes instalarla o reemplazarla por &lt;code&gt;ephem&lt;/code&gt; o &lt;code&gt;astral&lt;/code&gt;) para determinar la fase lunar actual y programar limpiezas espirituales.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ephem&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;obtener_fase_lunar&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;fecha_actual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;luna&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ephem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Moon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fecha_actual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;luna&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;phase&lt;/span&gt;  &lt;span class="c1"&gt;# Porcentaje de iluminación lunar
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fase&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clasificar_fase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;fase&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Luna Nueva&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;fase&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cuarto Creciente&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;fase&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Luna Llena&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cuarto Menguante&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;fase_actual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;obtener_fase_lunar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;fase_nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clasificar_fase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fase_actual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hoy la fase lunar es: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fase_nombre&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fase_actual&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;% iluminada)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este script devuelve la fase lunar actual y el porcentaje de iluminación. Con esta información, un terapeuta o chamán puede decidir cuándo programar una sesión de &lt;strong&gt;&lt;a href="https://elsecretoazteca.com/limpieza-espiritual-chicago/" rel="noopener noreferrer"&gt;Limpieza Espiritual Chicago cerca de mi&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrando datos astronómicos con gestión de agenda
&lt;/h2&gt;

&lt;p&gt;Si añadimos integración con una base de datos y un calendario digital (Google Calendar o iCal), podemos automatizar alertas para que el especialista sepa el día ideal para realizar cada tipo de limpieza, ahorrando tiempo y mejorando la efectividad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Unir la sabiduría ancestral de las fases lunares con la precisión de los datos astronómicos y la programación en Python abre nuevas posibilidades para la práctica espiritual moderna. No se trata de reemplazar la tradición, sino de reforzarla con herramientas tecnológicas que permitan mayor exactitud y alcance.  &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
    <item>
      <title>Puede un dispositivo IoT amplificar un ritual amoroso?</title>
      <dc:creator>Andres Ortiz</dc:creator>
      <pubDate>Tue, 05 Aug 2025 20:13:15 +0000</pubDate>
      <link>https://dev.to/andres_ortiz_c410e5f78515/puede-un-dispositivo-iot-amplificar-un-ritual-amoroso-4nk</link>
      <guid>https://dev.to/andres_ortiz_c410e5f78515/puede-un-dispositivo-iot-amplificar-un-ritual-amoroso-4nk</guid>
      <description>&lt;p&gt;En el mundo moderno, la tecnología se cruza con aspectos que antes parecían exclusivos de la tradición y la espiritualidad. Hoy en día, no es descabellado pensar que un &lt;strong&gt;dispositivo IoT&lt;/strong&gt; (Internet de las Cosas) pueda integrarse en un ritual místico.&lt;br&gt;&lt;br&gt;
En servicios como &lt;strong&gt;&lt;em&gt;&lt;a href="https://elsecretoazteca.com/amarres-de-amor-chicago/" rel="noopener noreferrer"&gt;Amarres de Amor Chicago il&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;, la precisión en la ejecución y el control de los elementos son cruciales. Aquí es donde la automatización y los sensores inteligentes pueden marcar la diferencia.&lt;/p&gt;

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


&lt;h2&gt;
  
  
  ¿Cómo podría un IoT intervenir en un ritual?
&lt;/h2&gt;

&lt;p&gt;En prácticas como los &lt;strong&gt;&lt;em&gt;&lt;a href="https://elsecretoazteca.com/amarres-de-amor-chicago/" rel="noopener noreferrer"&gt;Amarres de Amor en Chicago&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;, la sincronización con factores ambientales (temperatura, humedad, fase lunar) y la repetición exacta de acciones son esenciales. Un dispositivo IoT puede:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Activar velas electrónicas en momentos específicos.
&lt;/li&gt;
&lt;li&gt;Monitorear la humedad y temperatura de un altar.
&lt;/li&gt;
&lt;li&gt;Emitir sonidos o vibraciones en fases determinadas del ritual.
&lt;/li&gt;
&lt;li&gt;Registrar datos para ajustar la ceremonia en el futuro.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El valor de un sistema IoT en este contexto no radica en “magia digital”, sino en mejorar la &lt;strong&gt;consistencia&lt;/strong&gt; y &lt;strong&gt;precisión&lt;/strong&gt; del ritual.&lt;/p&gt;


&lt;h2&gt;
  
  
  Ejemplo de código en Python para control IoT
&lt;/h2&gt;

&lt;p&gt;A continuación, un ejemplo sencillo en Python usando &lt;code&gt;paho-mqtt&lt;/code&gt; para controlar un dispositivo IoT que encienda una luz ambiental en un ritual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;paho-mqtt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;paho.mqtt.client&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;mqtt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;BROKER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;broker.hivemq.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;TOPIC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ritual/altar/light&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;userdata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Conectado con código: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TOPIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mqtt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on_connect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;on_connect&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BROKER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1883&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Encender luz ambiental del altar
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;activar_luz&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TOPIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ON&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; Luz ambiental encendida.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Apagar luz ambiental del altar
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;apagar_luz&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TOPIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OFF&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; Luz ambiental apagada.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loop_start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;activar_luz&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&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="c1"&gt;# Luz encendida por 10 segundos
&lt;/span&gt;    &lt;span class="nf"&gt;apagar_luz&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loop_stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este script publica mensajes a un broker MQTT para encender o apagar una luz en un altar conectado. Esto puede escalarse a sensores y otros elementos del ritual.&lt;/p&gt;




&lt;h2&gt;
  
  
  Integración de datos en rituales
&lt;/h2&gt;

&lt;p&gt;Los &lt;strong&gt;&lt;em&gt;&lt;a href="https://elsecretoazteca.com/amarres-de-amor-chicago/" rel="noopener noreferrer"&gt;Amarres de Amor Chicago&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt; modernos pueden beneficiarse de integrar sensores que recojan datos en tiempo real. Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sensor de temperatura y humedad&lt;/strong&gt;: Ajustar velas y aromaterapia.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cámara IoT&lt;/strong&gt;: Verificar la posición exacta de los elementos.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relojes astronómicos&lt;/strong&gt;: Iniciar acciones según la posición lunar.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La información recolectada puede registrarse en un dashboard web o app móvil para mejorar la experiencia.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Un dispositivo IoT no reemplaza el aspecto simbólico y emocional de un ritual amoroso, pero sí puede ayudar a perfeccionarlo. La tecnología aporta precisión, consistencia y registro histórico, elementos que pueden aumentar la efectividad percibida de la ceremonia.&lt;/p&gt;

&lt;p&gt;Si te interesa, en un próximo artículo puedo mostrar cómo integrar &lt;strong&gt;Node-RED&lt;/strong&gt; y &lt;strong&gt;Raspberry Pi&lt;/strong&gt; para crear un sistema IoT completo para rituales, con monitoreo remoto y automatización avanzada.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
    <item>
      <title>Python Code to Generate Digital QR Checklists for Technicians After Final Cleaning</title>
      <dc:creator>Andres Ortiz</dc:creator>
      <pubDate>Mon, 04 Aug 2025 21:13:58 +0000</pubDate>
      <link>https://dev.to/andres_ortiz_c410e5f78515/python-code-to-generate-digital-qr-checklists-for-technicians-after-final-cleaning-4oo4</link>
      <guid>https://dev.to/andres_ortiz_c410e5f78515/python-code-to-generate-digital-qr-checklists-for-technicians-after-final-cleaning-4oo4</guid>
      <description>&lt;p&gt;In fast-paced environments like &lt;strong&gt;&lt;em&gt;&lt;a href="https://quickcleanchicago.com/services/realtor-cleaning-services-chicag/" rel="noopener noreferrer"&gt;Realtor Cleaning Services chicago&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;, documenting the final phase of a cleaning job is essential. A digital checklist provides accountability, ensures service quality, and builds trust between cleaning providers and real estate professionals.&lt;/p&gt;

&lt;p&gt;This post explains how to build a Python script that creates a digital checklist, converts it into a QR code, and displays it for technicians to scan, sign off, or review on the spot—ideal for mobile verification during property turnover.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Why Digital Checklists Matter in Cleaning Workflows
&lt;/h2&gt;

&lt;p&gt;When executing &lt;strong&gt;&lt;em&gt;&lt;a href="https://quickcleanchicago.com/services/realtor-cleaning-services-chicag/" rel="noopener noreferrer"&gt;Realtor Cleaning Services in chicago&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;, you need verifiable steps to ensure that key zones like kitchens, bathrooms, HVAC units, and high-touch surfaces are cleaned and inspected. Traditional paper checklists are easily lost, while QR-linked forms can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be updated in real time&lt;/li&gt;
&lt;li&gt;Provide timestamps and GPS metadata&lt;/li&gt;
&lt;li&gt;Track technician completion across locations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Python, we can automate QR generation and optionally upload the data to a cloud backend like Google Sheets or Firebase.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;qrcode&lt;/code&gt;: for generating QR images&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Pillow&lt;/code&gt;: for displaying or saving images&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;json&lt;/code&gt;: to structure the checklist&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uuid&lt;/code&gt;: to generate unique checklist IDs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install the required libraries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;qrcode[pil]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Python Code Example: &lt;code&gt;generate_checklist_qr.py&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;qrcode&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_checklist&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;checklist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tasks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sweep and mop floors&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wipe down all countertops&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Clean inside and outside of appliances&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sanitize bathrooms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dust all surfaces&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dispose of all debris&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;checklist&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_qr_from_checklist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checklist&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checklist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qrcode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;checklist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_checklist.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; QR saved as &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;checklist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_checklist.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;checklist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_checklist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;generate_qr_from_checklist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checklist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a PNG image with the encoded checklist. It can be scanned by mobile devices, linked to a cloud-based dashboard, or printed and left on-site.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pro Tips for Field Implementation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pair QR scans with simple mobile forms (Google Forms or Typeform) for feedback.&lt;/li&gt;
&lt;li&gt;Store signed checklists in a shared drive with property address labels.&lt;/li&gt;
&lt;li&gt;Add fields like technician name and completion time dynamically.&lt;/li&gt;
&lt;li&gt;Print on waterproof stickers for harsh environments.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Use Case: Real Estate Turnovers
&lt;/h2&gt;

&lt;p&gt;For companies offering &lt;strong&gt;&lt;em&gt;&lt;a href="https://quickcleanchicago.com/services/realtor-cleaning-services-chicag/" rel="noopener noreferrer"&gt;Realtor Cleaning Services chicago il&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;, this tool can be a game-changer. You create QR checklists on the fly, assign them to techs, and verify each completed job with a scan.&lt;/p&gt;

&lt;p&gt;Want to integrate this system with Google Sheets or an internal dashboard? Let me know in the comments and I’ll walk you through it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to Build a “Find Microdermabrasion Near Me” Web App with HTML, CSS &amp; JavaScript</title>
      <dc:creator>Andres Ortiz</dc:creator>
      <pubDate>Sat, 02 Aug 2025 18:42:21 +0000</pubDate>
      <link>https://dev.to/andres_ortiz_c410e5f78515/how-to-build-a-find-microdermabrasion-near-me-web-app-with-html-css-javascript-4g79</link>
      <guid>https://dev.to/andres_ortiz_c410e5f78515/how-to-build-a-find-microdermabrasion-near-me-web-app-with-html-css-javascript-4g79</guid>
      <description>&lt;p&gt;Okay, real talk. Have you ever found yourself googling “microdermabrasion near me” at 11 p.m. the night before a wedding or a big job interview? Been there. I once spent 40 minutes scrolling random spa sites that looked like they were built in 2007. Yikes.&lt;/p&gt;

&lt;p&gt;So one night I thought—why not just build a simple web app that helps people find skin treatments near them? Not rocket science, just practical. If you’re learning frontend dev, this is a fun little project with real-world value.&lt;/p&gt;

&lt;p&gt;Let’s break it down together, right?&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Wait, What Even Is Microdermabrasion?
&lt;/h2&gt;

&lt;p&gt;Quick and dirty: it’s a skincare treatment where they exfoliate your face with a special tool. No needles, no downtime. Kinda like power-washing your pores, you know?&lt;/p&gt;

&lt;p&gt;A lot of people in &lt;strong&gt;&lt;a href="https://maestrosespirituales.com/amarre-de-amor-en-waco-tx/" rel="noopener noreferrer"&gt;Microdermabrasion Chicago&lt;/a&gt;&lt;/strong&gt; swear by it. And I mean—have you seen their glow on Instagram? Unreal.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Things You’ll Learn Building This App
&lt;/h2&gt;

&lt;p&gt;I’m keeping this beginner-friendly but useful. We’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic HTML structure for location-based search&lt;/li&gt;
&lt;li&gt;Using Google Maps API (super fun once it works)&lt;/li&gt;
&lt;li&gt;Styling with CSS Grid (because flexbox is not always enough)&lt;/li&gt;
&lt;li&gt;Adding JavaScript geolocation (yes, your browser can track you)&lt;/li&gt;
&lt;li&gt;Clean UI tricks for mobile users&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Let’s get into the step-by-step.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Set Up Your HTML Skeleton
&lt;/h3&gt;

&lt;p&gt;Keep it simple. Something like:&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;form&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"searchForm"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter your city or zip"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Search&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"results"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing fancy. You want it to load fast and feel intuitive.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Plug In Google Maps or Places API
&lt;/h3&gt;

&lt;p&gt;This is where the magic happens. You’ll need an API key, and a little patience. Use the &lt;code&gt;placesService.textSearch()&lt;/code&gt; method to return clinics near your location.&lt;/p&gt;

&lt;p&gt;Quick tip: limit the query to terms like "microdermabrasion" + city name. In my case, I tried &lt;strong&gt;&lt;a href="https://maestrosespirituales.com/amarre-de-amor-en-waco-tx/" rel="noopener noreferrer"&gt;Microdermabrasion in Chicago&lt;/a&gt;&lt;/strong&gt; and it returned actual local spas—pretty neat.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Style with Care
&lt;/h3&gt;

&lt;p&gt;Don’t underestimate the power of clean design. Use soft gradients, rounded corners, and big clickable buttons. I used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;#f09&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#c06&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&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;Honestly, people will judge your whole app based on your font choices. [sic]&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Add Geolocation (Optional But Cool)
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;navigator.geolocation.getCurrentPosition()&lt;/code&gt; to auto-detect user location. Saves a step and feels slick.&lt;/p&gt;

&lt;p&gt;Just remember—ask permission first. Nobody wants their face treatment journey starting with a privacy scare.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Display Results Dynamically
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;innerHTML&lt;/code&gt; or (if you're feeling spicy) dynamically generate elements with &lt;code&gt;createElement()&lt;/code&gt;. Highlight name, rating, address, and maybe even a map preview.&lt;/p&gt;

&lt;p&gt;When I tested it in &lt;strong&gt;&lt;a href="https://maestrosespirituales.com/amarre-de-amor-en-waco-tx/" rel="noopener noreferrer"&gt;Microdermabrasion Chicago il&lt;/a&gt;&lt;/strong&gt; areas, it worked like a charm. Felt like I built my own little Yelp.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Bother? Here’s What You’ll Get Out of This Project
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You’ll learn APIs like a boss.&lt;/li&gt;
&lt;li&gt;Practice real UI/UX choices (not just todo lists).&lt;/li&gt;
&lt;li&gt;Understand how front and back can talk to each other.&lt;/li&gt;
&lt;li&gt;Build something that actually helps people IRL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus, it’s portfolio-worthy and easy to deploy with Netlify or GitHub Pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR — Let’s Recap Real Fast
&lt;/h2&gt;

&lt;p&gt;If you’ve ever wished you could just find a legit spa without all the noise, you’re not alone. You can totally build your own little helper app—and look good doing it.&lt;/p&gt;

&lt;p&gt;Start simple. Break things. Google errors. And you’ll get there.&lt;/p&gt;

&lt;p&gt;Give it a shot this week—you’ll see! &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Real-life project: web platform for scheduling and recording microinjections in mesotherapy sessions</title>
      <dc:creator>Andres Ortiz</dc:creator>
      <pubDate>Fri, 01 Aug 2025 20:13:59 +0000</pubDate>
      <link>https://dev.to/andres_ortiz_c410e5f78515/real-life-project-web-platform-for-scheduling-and-recording-microinjections-in-mesotherapy-sessions-4fna</link>
      <guid>https://dev.to/andres_ortiz_c410e5f78515/real-life-project-web-platform-for-scheduling-and-recording-microinjections-in-mesotherapy-sessions-4fna</guid>
      <description>&lt;p&gt;Ever worked on something where, halfway through, you think: “Why doesn’t this exist already?” That was me building a platform to manage mesotherapy sessions—scheduling, recording, tracking microinjections. You know, the stuff that doesn’t sound glamorous until you see it actually working.&lt;/p&gt;

&lt;p&gt;This project came from a real need. A client running a clinic offering &lt;strong&gt;&lt;a href="https://elitechicagospa.com/mesotherapy-in-chicago/" rel="noopener noreferrer"&gt;Mesotherapy Chicago IL&lt;/a&gt;&lt;/strong&gt; reached out. They were still using paper charts. Yep, real paper. In 2025. Wild.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I once shadowed a session just to get a feel for it. The nurse had sticky notes—like actual ones—marking injection areas. You’d think this was a skit. That’s when I knew we had to build something smarter.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Key Ideas Behind the Platform
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Session Scheduler with visual calendar&lt;/li&gt;
&lt;li&gt;Digital face/body injection mapping tool&lt;/li&gt;
&lt;li&gt;Role-based access for staff/admins&lt;/li&gt;
&lt;li&gt;Secure patient history tracking&lt;/li&gt;
&lt;li&gt;Exportable reports for compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me show you how we made it real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Set Up the Backend
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init vite@latest meso-app &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--template&lt;/span&gt; react
&lt;span class="nb"&gt;cd &lt;/span&gt;meso-app
npm &lt;span class="nb"&gt;install &lt;/span&gt;express mongoose cors dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Build Patient Models (MongoDB)
&lt;/h3&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;mongoose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&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;PatientSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;dob&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;sessions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Patient&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PatientSchema&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Create the Scheduler API
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/schedule&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;patientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;treatment&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&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="c1"&gt;// Save session to DB&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Add Injection Mapping
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"face-map"&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/face.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Injection map"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Record Microinjections
&lt;/h3&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;injectionPoint&lt;/span&gt; &lt;span class="o"&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="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientX&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="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;injections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;injectionPoint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Authentication Layer
&lt;/h3&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;jwt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verifyToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&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;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JWT_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decoded&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;decoded&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7: Build Admin Dashboard
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/admin"&lt;/span&gt; &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;AdminPanel&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 8: Generate PDF Report
&lt;/h3&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;PDFDocument&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdfkit&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;doc&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;PDFDocument&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// Add text and points, then stream to response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 9: Patient Search Component
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Search patient..."&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSearch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;patients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 10: Notifications and Alerts
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;appointmentToday&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;toast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You have a session scheduled today!&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What Made It Work
&lt;/h2&gt;

&lt;p&gt;We used React + Node.js, MongoDB for data, and simple JPEG overlays for injection zones. Not fancy, but super effective.&lt;/p&gt;

&lt;p&gt;One of the nurses literally asked if I had experience with &lt;strong&gt;&lt;a href="https://elitechicagospa.com/mesotherapy-in-chicago/" rel="noopener noreferrer"&gt;Mesotherapy Chicago&lt;/a&gt;&lt;/strong&gt; clinics before. I hadn’t. I just listened.&lt;/p&gt;

&lt;p&gt;And another client? They asked if we could scale it for &lt;strong&gt;&lt;a href="https://elitechicagospa.com/mesotherapy-in-chicago/" rel="noopener noreferrer"&gt;Mesotherapy in Chicago&lt;/a&gt;&lt;/strong&gt; providers citywide. That was the moment it clicked—we weren’t just solving a one-off problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You Might Wanna Try Something Similar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It’s a real-world use case that &lt;em&gt;isn’t&lt;/em&gt; a to-do app&lt;/li&gt;
&lt;li&gt;You’ll work across backend/frontend/auth/reporting&lt;/li&gt;
&lt;li&gt;You’ll learn how to solve real workflow problems&lt;/li&gt;
&lt;li&gt;And it feels dang good to build something people actually need&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Give this a shot—especially if you're tired of tutorials and want something that hits different.&lt;/p&gt;

&lt;p&gt;Work with someone in healthcare. Or beauty. Or clinics. There's always something chaotic that tech can clean up.&lt;/p&gt;

&lt;p&gt;You’ll be surprised how much your code can matter.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Programming an Ionic Foot Bath for Voice Control with Python</title>
      <dc:creator>Andres Ortiz</dc:creator>
      <pubDate>Thu, 31 Jul 2025 17:35:46 +0000</pubDate>
      <link>https://dev.to/andres_ortiz_c410e5f78515/programming-an-ionic-foot-bath-for-voice-control-with-python-5cag</link>
      <guid>https://dev.to/andres_ortiz_c410e5f78515/programming-an-ionic-foot-bath-for-voice-control-with-python-5cag</guid>
      <description>&lt;p&gt;Ever tried to relax... and ended up tangled in a mess of wires and code? Yeah, same here.&lt;/p&gt;

&lt;p&gt;I remember the first time I set up an &lt;strong&gt;ionic foot bath&lt;/strong&gt; at home—pure chaos. I was juggling cables, fumbling with the settings, and still somehow managed to mess up the temperature. You’d think these things would be more “plug and play,” right?&lt;/p&gt;

&lt;p&gt;Well, guess what? They &lt;em&gt;can&lt;/em&gt; be. And even cooler—you can now control them with just your voice. Yep, we’re gonna talk about building a voice-activated &lt;strong&gt;ionic foot bath&lt;/strong&gt; controller using Python. I know, it sounds like sci-fi, but it’s actually pretty doable.&lt;/p&gt;

&lt;p&gt;Let’s dive in. (Pun slightly intended.)&lt;/p&gt;




&lt;h2&gt;
  
  
  So, what’s the deal with voice-activated spa gadgets?
&lt;/h2&gt;

&lt;p&gt;Imagine this: you're chilling, feet soaked, eyes closed, and suddenly you wanna tweak the timer or change the mode. Do you really wanna dry your hands, squint at buttons, and figure out which one’s “bubble”? Nah. That’s where voice control saves the day.&lt;/p&gt;

&lt;p&gt;I tried this out with a &lt;strong&gt;&lt;a href="https://elitechicagospa.com/ionic-foot-bath-in-chicago/" rel="noopener noreferrer"&gt;Chicago Ionic Foot Bath&lt;/a&gt;&lt;/strong&gt; that a friend recommended. It had great build quality and was perfect for experimentation. Plus, living in Chicago means you &lt;em&gt;need&lt;/em&gt; something warm and soothing for your feet during winter.&lt;/p&gt;




&lt;h2&gt;
  
  
  Five key things you need to wrap your head around (but casually):
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Voice Recognition APIs&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Like Google Speech-to-Text or Vosk. You talk, it listens, it acts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python Integration&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Python’s super flexible. Perfect for stitching everything together.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart Plug or Relay&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
To physically control the bath’s power or features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IoT Gateway (like Raspberry Pi)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Think of it like the “translator” between your voice and the foot bath.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trigger Words or Commands&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You don’t want the bath turning off every time you sneeze, right?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  How to Make It Happen (without frying your nerves)
&lt;/h2&gt;

&lt;p&gt;First, install Python libraries like &lt;code&gt;speech_recognition&lt;/code&gt;, &lt;code&gt;pyttsx3&lt;/code&gt;, and &lt;code&gt;gpiozero&lt;/code&gt; (if you're using Raspberry Pi). Here’s a quick messy snippet from my setup—don’t judge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;speech_recognition&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Recognizer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Microphone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Say something:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recognize_google&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You said: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;turn on&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpio -g write 17 1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Turns it on
&lt;/span&gt;    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;turn off&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpio -g write 17 0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Turns it off
&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UnknownValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Oops, didn’t catch that.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now this won’t win you any awards, but it &lt;em&gt;does&lt;/em&gt; turn your &lt;strong&gt;&lt;a href="https://elitechicagospa.com/ionic-foot-bath-in-chicago/" rel="noopener noreferrer"&gt;Ionic Foot Bath in Chicago&lt;/a&gt;&lt;/strong&gt; into a talkative little buddy. [sic]&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick side story (because why not)
&lt;/h2&gt;

&lt;p&gt;So I had this friend, Jenna. Always stressed, never rests. I rigged this bath for her and hooked it up with an Alexa integration. She was floored. “I didn’t think I'd ever boss around a foot bath,” she said.&lt;/p&gt;

&lt;p&gt;Now she starts every Sunday with:&lt;br&gt;&lt;br&gt;
“Alexa, bubble time.”  &lt;/p&gt;

&lt;p&gt;Weird typo on the packaging though… "Chicago"? 🤔 Probably just a print fail.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-talk benefits (a.k.a. why it’s worth your time)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No more bending down&lt;/strong&gt; — your back will thank you&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hands stay dry&lt;/strong&gt; — useful when you’re mid-manicure or holding a coffee&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You feel like Iron Man&lt;/strong&gt; — 'nuff said&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It’s actually fun to build&lt;/strong&gt; — even if you mess up&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impress your friends&lt;/strong&gt; — or at least confuse them&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it out—what’s the worst that could happen?
&lt;/h2&gt;

&lt;p&gt;Seriously, this week, give it a shot. Mess with the code, burn your eyebrows (figuratively), and see how far you can go. Start simple. Get creative. Whether you're tweaking a basic setup or integrating your &lt;strong&gt;&lt;a href="https://elitechicagospa.com/ionic-foot-bath-in-chicago/" rel="noopener noreferrer"&gt;Ionic Foot Bath in Chicago IL&lt;/a&gt;&lt;/strong&gt; with a full smart home routine, you’re learning something cool—and maybe helping your sore feet at the same time.&lt;/p&gt;

&lt;p&gt;Go for it. You’ll see.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Can an AI detect what your skin needs? Create a model in 30 minutes</title>
      <dc:creator>Andres Ortiz</dc:creator>
      <pubDate>Wed, 30 Jul 2025 22:21:53 +0000</pubDate>
      <link>https://dev.to/andres_ortiz_c410e5f78515/can-an-ai-detect-what-your-skin-needs-create-a-model-in-30-minutes-1p98</link>
      <guid>https://dev.to/andres_ortiz_c410e5f78515/can-an-ai-detect-what-your-skin-needs-create-a-model-in-30-minutes-1p98</guid>
      <description>&lt;p&gt;Wow, seriously? I once stared at my bathroom mirror, wondering if my skin was dehydrated or just angry—right?—until I thought, “Why not let AI decide?”&lt;/p&gt;

&lt;p&gt;I tried browsing beauty blogs and guessing products by trial and error [sic], and ended up with a cabinet full of half‑used creams. Then I realized: with a quick model, Python can analyze basic skin data and tell you exactly what your skin craves—no more guesswork.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  5 Key Concepts (Casual List)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Data collection: simple surveys and selfies
&lt;/li&gt;
&lt;li&gt;Preprocessing: clean and normalize inputs
&lt;/li&gt;
&lt;li&gt;Model architecture: lightweight neural nets
&lt;/li&gt;
&lt;li&gt;Inference: real‑time recommendations
&lt;/li&gt;
&lt;li&gt;Deployment: wrap in a Flask app
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  How to Build Your Skin AI (Step by Step)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Install Dependencies
&lt;/h3&gt;

&lt;p&gt;Grab your libraries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;tensorflow pandas flask opencv-python
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Collect Sample Data
&lt;/h3&gt;

&lt;p&gt;Create a CSV with columns: &lt;code&gt;oiliness, dryness, sensitivity, pimples, skin_tone&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;oiliness&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dryness&lt;/span&gt;&lt;span class="sh"&gt;'&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="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sensitivity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pimples&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tone&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fair&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hydration&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;# ... add more rows ...
&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;skin_data.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Preprocess Inputs
&lt;/h3&gt;

&lt;p&gt;Normalize numeric features, encode &lt;code&gt;tone&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sklearn.preprocessing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StandardScaler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OneHotEncoder&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;skin_data.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;scaler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StandardScaler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;X_num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scaler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit_transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;oiliness&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dryness&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sensitivity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pimples&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;

&lt;span class="n"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OneHotEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sparse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;X_tone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit_transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tone&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;

&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concatenate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;X_num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_tone&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Define a Simple Neural Net
&lt;/h3&gt;

&lt;p&gt;A tiny model for fast training.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tensorflow&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Sequential&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Dense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;relu&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input_shape&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&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="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Dense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;relu&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Dense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;softmax&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Compile &amp;amp; Train
&lt;/h3&gt;

&lt;p&gt;Train in minutes—seriously under 30.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;adam&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sparse_categorical_crossentropy&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;accuracy&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;validation_split&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Evaluate Your Model
&lt;/h3&gt;

&lt;p&gt;Check performance quickly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accuracy: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Save the Model
&lt;/h3&gt;

&lt;p&gt;Reuse without retraining.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;skin_needs_model.h5&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. Build a Flask API
&lt;/h3&gt;

&lt;p&gt;Serve recommendations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jsonify&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tensorflow&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keras&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;skin_needs_model.h5&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/recommend&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;recommend&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;features&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;features&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;pred&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hydration&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;oil_control&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sensitive_care&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;recommendation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;argmax&lt;/span&gt;&lt;span class="p"&gt;()]})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9. Quick Front‑End Snippet
&lt;/h3&gt;

&lt;p&gt;Test via JavaScript &lt;code&gt;fetch()&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/recommend&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;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&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;Content-Type&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;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;features&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&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="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="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;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Try: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommendation&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10. Enhance with Selfie Input (Bonus)
&lt;/h3&gt;

&lt;p&gt;Capture a basic image for future expansion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;
&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;selfie.jpg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;resized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# feed to a CNN later
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Benefits (Casual Bullets)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No more guesswork&lt;/strong&gt;: tailored suggestions, wow.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast MVP&lt;/strong&gt;: build in half an hour, you know?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable&lt;/strong&gt;: add more features—UV index, humidity, right?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DIY‑friendly&lt;/strong&gt;: you don’t need a data science team.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shop smarter&lt;/strong&gt;: skip unnecessary visits to &lt;strong&gt;&lt;a href="https://elitechicagofacials.com/facials-avondale/" rel="noopener noreferrer"&gt;Botox in Avondale&lt;/a&gt;&lt;/strong&gt; opt for home remedies or pro treatments like &lt;strong&gt;&lt;a href="https://elitechicagofacials.com/facials-avondale/" rel="noopener noreferrer"&gt;Facials Avondale&lt;/a&gt;&lt;/strong&gt; or advanced &lt;strong&gt;&lt;a href="https://elitechicagofacials.com/facials-avondale/" rel="noopener noreferrer"&gt;Microneedling in Avondale&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Conclusion + Call to Action&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Give it a try this week—you’ll see how AI can demystify skincare. Fork the repo, train on your own profiles, and share your results in the comments—can’t wait to see your editions!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>¿Puede un sistema IoT tener energía negativa? Explorando la limpieza espiritual de entornos inteligentes</title>
      <dc:creator>Andres Ortiz</dc:creator>
      <pubDate>Wed, 30 Jul 2025 20:32:40 +0000</pubDate>
      <link>https://dev.to/andres_ortiz_c410e5f78515/puede-un-sistema-iot-tener-energia-negativa-explorando-la-limpieza-espiritual-de-entornos-1ilk</link>
      <guid>https://dev.to/andres_ortiz_c410e5f78515/puede-un-sistema-iot-tener-energia-negativa-explorando-la-limpieza-espiritual-de-entornos-1ilk</guid>
      <description>&lt;p&gt;La tecnología ha transformado nuestro día a día. Casas inteligentes, sensores conectados, asistentes virtuales, cámaras automatizadas… vivimos rodeados de dispositivos IoT (Internet of Things) que monitorean, aprenden y toman decisiones en tiempo real. Pero, ¿qué ocurre cuando un entorno digital se vuelve tenso, caótico o simplemente no “fluye”? ¿Puede un sistema IoT absorber o proyectar energía negativa?&lt;/p&gt;

&lt;p&gt;Aunque parezca una pregunta esotérica, en la práctica muchos expertos en bienestar holístico y tecnología han comenzado a observar cómo los entornos inteligentes también pueden beneficiarse de un enfoque energético.&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué significa “energía negativa” en un sistema digital?
&lt;/h2&gt;

&lt;p&gt;Cuando hablamos de energía negativa en un entorno IoT no nos referimos a fantasmas en la red, sino a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Caos informático&lt;/strong&gt;: demasiados dispositivos conectados sin orden ni propósito.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ambientes tensos&lt;/strong&gt;: lugares con discusiones constantes, estrés o ansiedad.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallos constantes&lt;/strong&gt;: errores, bloqueos, interferencias sin razón aparente.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensación de incomodidad&lt;/strong&gt; en entornos tecnológicamente cargados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Así como una casa puede sentirse pesada emocionalmente, un sistema inteligente puede sufrir de "ruido energético", afectando la experiencia del usuario, el rendimiento del hardware e incluso el bienestar de quienes lo habitan.&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué es una limpieza espiritual de entornos inteligentes?
&lt;/h2&gt;

&lt;p&gt;Es un proceso en el que se integran &lt;strong&gt;rituales energéticos tradicionales&lt;/strong&gt; con buenas prácticas tecnológicas. Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apagar todos los dispositivos durante 24 horas (descarga energética).
&lt;/li&gt;
&lt;li&gt;Usar inciensos o sahumerios cerca de hubs o routers (purificación del entorno).
&lt;/li&gt;
&lt;li&gt;Reprogramar sensores y asistentes con nuevas intenciones o palabras clave.
&lt;/li&gt;
&lt;li&gt;Meditar o armonizar el espacio antes de configuraciones clave.
&lt;/li&gt;
&lt;li&gt;Organizar nombres de dispositivos de forma coherente y simbólica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este enfoque ha ganado fuerza en servicios de bienestar urbano y domótica avanzada, especialmente en espacios donde se promueve la &lt;strong&gt;&lt;a href="https://botanicadelamor.com/limpieza-espiritual-en-chicago/" rel="noopener noreferrer"&gt;Limpieza Espiritual en Chicago&lt;/a&gt;&lt;/strong&gt; como complemento energético a la tecnología doméstica.&lt;/p&gt;




&lt;h2&gt;
  
  
  Código simbólico: redefinir nombres y funciones con intención
&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;dispositivos&lt;/span&gt; &lt;span class="o"&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;id&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="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sensor_temperatura_01&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;camara_sala_conflicto&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;asistente_virtual_eco&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="c1"&gt;// Renombrar dispositivos con nombres energéticamente positivos&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;armonizar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nombre&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;nombre&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;conflicto&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;paz&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;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eco&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;claridad&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;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sensor&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;guía&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;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;camara&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;protección&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dispositivosArmonizados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dispositivos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;dispositivo&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="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;dispositivo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;armonizar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dispositivo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dispositivosArmonizados&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este tipo de cambios, aunque parezcan simbólicos, pueden tener un efecto real en la percepción, el uso y el flujo energético del espacio.&lt;/p&gt;




&lt;h2&gt;
  
  
  Espacios conectados ≠ espacios conscientes
&lt;/h2&gt;

&lt;p&gt;Una casa inteligente no siempre es un espacio saludable. No basta con automatizar la luz o la música si el entorno está cargado de ansiedad o caos digital. Por eso, cada vez más personas recurren a servicios de &lt;strong&gt;&lt;a href="https://botanicadelamor.com/limpieza-espiritual-en-chicago/" rel="noopener noreferrer"&gt;Limpieza Espiritual en chicago&lt;/a&gt;&lt;/strong&gt;como una forma de reequilibrar no solo el hogar físico, sino también su dimensión energética.&lt;/p&gt;

&lt;p&gt;También se están abriendo caminos hacia soluciones que integran sensores de ambiente que no solo midan temperatura o humedad, sino &lt;strong&gt;vibraciones, patrones de ruido o campos electromagnéticos&lt;/strong&gt;, permitiendo identificar desequilibrios energéticos.&lt;/p&gt;

&lt;p&gt;Y es que incluso en entornos conectados como oficinas, estudios o departamentos domóticos, técnicas como la &lt;strong&gt;&lt;a href="https://botanicadelamor.com/limpieza-espiritual-en-chicago/" rel="noopener noreferrer"&gt;limpieza espiritual chicago&lt;/a&gt;&lt;/strong&gt; comienzan a formar parte del mantenimiento integral de espacios de alto rendimiento.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;El futuro no solo será tecnológico, será energético. Aprender a integrar prácticas de limpieza espiritual en entornos inteligentes no es superstición, es una nueva capa de conciencia aplicada a la convivencia con sistemas digitales. En el equilibrio entre energía y automatización puede encontrarse el verdadero confort del hogar moderno.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Simula una lectura de cartas del tarot con Python</title>
      <dc:creator>Andres Ortiz</dc:creator>
      <pubDate>Tue, 29 Jul 2025 21:20:55 +0000</pubDate>
      <link>https://dev.to/andres_ortiz_c410e5f78515/simula-una-lectura-de-cartas-del-tarot-con-python-3jn3</link>
      <guid>https://dev.to/andres_ortiz_c410e5f78515/simula-una-lectura-de-cartas-del-tarot-con-python-3jn3</guid>
      <description>&lt;p&gt;¿Alguna vez te has sentido atrapado entre dos mundos? Uno lógico, de código y estructuras, y otro... más bien místico, lleno de símbolos, intuiciones y energías. Yo sí. Y un día, se me ocurrió juntarlos.&lt;/p&gt;

&lt;p&gt;Era una madrugada, tenía Python abierto, y vi en mi escritorio un mazo de tarot que me había regalado una amiga. Fue como una señal: &lt;em&gt;¿y si lo mezclo con código?&lt;/em&gt; Pues aquí estamos. Te muestro cómo tú también puedes hacer una lectura básica del tarot con Python. No necesitas ser un experto en esoterismo ni en programación.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbpjsjqd2ctvfg9s6mpaa.png" alt="Limpieza Espiritual En Chicago il" width="800" height="533"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  ¿Por qué combinar tarot y Python?
&lt;/h2&gt;

&lt;p&gt;Okay, suena raro al principio. Pero piensa esto: el tarot no es una herramienta predictiva mágica —bueno, para algunos sí—, pero sobre todo es un &lt;strong&gt;espejo del inconsciente&lt;/strong&gt;. Y Python, con su capacidad para estructurar y automatizar procesos, se convierte en un excelente vehículo para jugar con eso.&lt;/p&gt;

&lt;p&gt;Además, si estás pasando por un mal momento, no estaría mal considerar una &lt;strong&gt;&lt;a href="https://botanicadelamor.com/limpieza-espiritual-en-chicago/" rel="noopener noreferrer"&gt;Limpieza Espiritual En Chicago&lt;/a&gt;&lt;/strong&gt;. A veces el código no basta, you know?&lt;/p&gt;




&lt;h2&gt;
  
  
  Conceptos clave (en tono relajado)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cartas del tarot&lt;/strong&gt;: Son como emojis del alma. Hay 78, pero usaremos algunas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aleatoriedad controlada&lt;/strong&gt;: &lt;code&gt;random.sample()&lt;/code&gt; para repartir el destino.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diccionarios de Python&lt;/strong&gt;: Guardan los significados de las cartas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Posiciones simbólicas&lt;/strong&gt;: Pasado, presente, futuro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loop interactivo&lt;/strong&gt;: Porque si quieres más tiradas… que se repita.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Vamos al grano: ¿cómo lo hacemos?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Paso 1: Importar y definir
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;

&lt;span class="n"&gt;cartas_tarot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;El Loco&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Comienzos frescos, fe y aventura&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La Muerte&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Transformación, dejar ir lo viejo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;El Diablo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ataduras, adicciones, tentaciones&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;El Sol&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Claridad, éxito, alegría&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La Luna&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Intuición, confusión, sueños&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La Justicia&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Causa y efecto, karma&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;El Mago&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Poder personal, creatividad&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;El Colgado&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pausa, cambio de perspectiva&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La Torre&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Crisis repentina, liberación&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La Estrella&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Esperanza, sanación, propósito&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Paso 2: Mezclar el mazo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;mazo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cartas_tarot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mazo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Paso 3: Hacer una tirada de tres cartas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tirada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mazo&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Paso 4: Posiciones simbólicas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;posiciones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pasado&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Presente&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Futuro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;carta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tirada&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;posiciones&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;carta&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cartas_tarot&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;carta&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  BONUS: Tirada infinita (modo juego de consola)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Presiona ENTER para una nueva lectura...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mazo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tirada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mazo&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;posiciones&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tirada&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cartas_tarot&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tirada&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ¿Y si lo conviertes en app?
&lt;/h2&gt;

&lt;p&gt;Piénsalo: podrías usar Flask para crear una pequeña interfaz web donde los usuarios hagan clic y reciban su lectura.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;render_template&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Incluso podrías usar librerías como &lt;code&gt;gTTS&lt;/code&gt; para leer la interpretación en voz alta. &lt;em&gt;Cool, right?&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Mini-caso real
&lt;/h2&gt;

&lt;p&gt;Una vez hice esta lectura para mi hermana. Le salió "El Colgado" en el presente. Me dijo: “¡Eso soy yo, literal! Estoy esperando que todo cambie.” Y cambió, pero cuando &lt;em&gt;ella&lt;/em&gt; cambió primero. Mind-blowing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recursos extra (sin que suene a lista aburrida)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/dariusk/corpora/blob/master/data/divination/tarot_interpretations.json" rel="noopener noreferrer"&gt;Tarot en JSON (por Darius Kazemi)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Flask o Streamlit para web apps&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gTTS&lt;/code&gt; o &lt;code&gt;pyttsx3&lt;/code&gt; para voz&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;colorama&lt;/code&gt; para dar color a las cartas en consola&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Y si el ambiente en casa no mejora…
&lt;/h2&gt;

&lt;p&gt;Mira, hay cosas que el código no soluciona. Si estás sintiendo pesadez, cansancio inexplicable o simplemente “algo raro”, considera una &lt;strong&gt;&lt;a href="https://botanicadelamor.com/limpieza-espiritual-en-chicago/" rel="noopener noreferrer"&gt;Limpieza Espiritual En Chicago il&lt;/a&gt;&lt;/strong&gt;. Yo he visto cambios, de verdad.&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué ganas haciendo esto?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Aprendes sin darte cuenta (en serio).&lt;/li&gt;
&lt;li&gt;Te conectas con un lado tuyo menos lógico.&lt;/li&gt;
&lt;li&gt;Es divertido, y eso ya vale la pena.&lt;/li&gt;
&lt;li&gt;Puedes compartirlo con amigos o redes.&lt;/li&gt;
&lt;li&gt;Y si le sumas más funcionalidades, hasta podrías ofrecer tiradas automáticas en tu web.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Última función útil
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;leer_tarot&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mazo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;posiciones&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mazo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cartas_tarot&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mazo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;leer_tarot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Cierre sin tanto drama
&lt;/h2&gt;

&lt;p&gt;¿Y si esta semana en vez de seguir el algoritmo… te conectas contigo mismo, o con tu editor de código, o con ambos?&lt;/p&gt;

&lt;p&gt;Dale play a esta idea. Y si algo se siente denso... una &lt;strong&gt;&lt;a href="https://botanicadelamor.com/limpieza-espiritual-en-chicago/" rel="noopener noreferrer"&gt;Limpieza Espiritual Chicago&lt;/a&gt;&lt;/strong&gt; puede ser el reset que necesitas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;See you on the flip side, místico-coder.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo programar un calendario sagrado de santería con Python y Django</title>
      <dc:creator>Andres Ortiz</dc:creator>
      <pubDate>Tue, 29 Jul 2025 20:26:47 +0000</pubDate>
      <link>https://dev.to/andres_ortiz_c410e5f78515/como-programar-un-calendario-sagrado-de-santeria-con-python-y-django-2jpf</link>
      <guid>https://dev.to/andres_ortiz_c410e5f78515/como-programar-un-calendario-sagrado-de-santeria-con-python-y-django-2jpf</guid>
      <description>&lt;p&gt;¿Sabes ese momento en el que mezclas dos mundos que parecen no tener nada que ver? Bueno, me pasó. Estaba en plena madrugada, lidiando con un bug tonto en Django, cuando me di cuenta de que podía usar ese mismo código para algo mucho más espiritual: &lt;strong&gt;programar un calendario sagrado de santería&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Sí, suena raro. Pero si te interesa la programación &lt;em&gt;y&lt;/em&gt; el camino espiritual, esto va a interesarte.  &lt;/p&gt;




&lt;h3&gt;
  
  
  Cuando el código y lo espiritual chocan…
&lt;/h3&gt;

&lt;p&gt;Yo crecí entre líneas de código… y rezos. Mi tía abuela, que vivía en el sur de Chicago, practicaba santería. Me llevaba a las ceremonias y me contaba las historias de los &lt;strong&gt;orishas&lt;/strong&gt; como si fueran superhéroes. Años después, como desarrollador, quise hacer algo útil para ella: un &lt;strong&gt;calendario personalizado&lt;/strong&gt; que marcara días importantes como los de &lt;strong&gt;Eleguá&lt;/strong&gt; o &lt;strong&gt;Changó&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Lo básico, contado a lo “cuate”
&lt;/h3&gt;

&lt;p&gt;Antes de ponerte con el código, necesitas entender unos términos clave, pero tranquiiilo, no va en plan académico. Te los dejo como se los conté a un amigo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Orishas&lt;/strong&gt;: Divinidades que representan fuerzas de la naturaleza.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odu&lt;/strong&gt;: Caminos del destino en los que se basa la adivinación.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ebbo&lt;/strong&gt;: Ofrendas rituales que se hacen en fechas clave.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Días sagrados&lt;/strong&gt;: Cada orisha tiene fechas concretas para ser honrado.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diloggún&lt;/strong&gt;: Sistema de adivinación basado en caracoles. (Lo que vendría siendo tu base de datos divina, jeje.)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Y entonces… ¿cómo lo armás?
&lt;/h3&gt;

&lt;p&gt;Lo bueno de usar &lt;strong&gt;Django&lt;/strong&gt; es que puedes estructurar todo esto como si fuera un blog, pero con más alma. Aquí te va el &lt;strong&gt;código base en Python&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# calendario/models.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.db&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Orisha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dia_festivo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;descripcion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__str__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nombre&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EventoRitual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;orisha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ForeignKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Orisha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on_delete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;nombre_evento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fecha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;detalle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__str__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nombre_evento&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fecha&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ese código te da las bases para un calendario personalizado donde puedes añadir los eventos sagrados. O sea, el día de &lt;strong&gt;Obatalá&lt;/strong&gt;, el de Yemayá, etc. Yo lo probé con eventos mensuales y hasta logré integrarlo con &lt;strong&gt;Google Calendar&lt;/strong&gt; (con la API de ellos, pero eso ya es otra historia, bro).&lt;/p&gt;




&lt;h3&gt;
  
  
  Mini-metáfora para entenderlo mejor
&lt;/h3&gt;

&lt;p&gt;Imagínate que cada &lt;strong&gt;orisha&lt;/strong&gt; es como una app en tu celular. Cada uno tiene su “update” en un día particular del año. Lo que haces con este código es crear un &lt;strong&gt;sistema operativo espiritual&lt;/strong&gt;, donde Django es el backend que mantiene todo funcionando... y tú, el dev-sacerdote que mantiene el equilibrio 😅.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recursos que me salvaron (y que quizás te sirvan también)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Django Admin&lt;/strong&gt;: ¡Bendito seas! Me ahorró horas de trabajo para añadir o editar eventos sin tener que escribir más código.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FullCalendar.js&lt;/strong&gt;: Para el frontend, si quieres que luzca como un calendario pro.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite&lt;/strong&gt;: Usé esta base porque era simple, no necesitaba nada más complejo.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y claro, para temas más profundos, como rituales o consultas, hay gente con conocimiento más vasto. Si estás por allá y buscas orientación, echa un ojo a esta comunidad de &lt;a href="https://elsecretoazteca.com/santeria-chicago-il/" rel="noopener noreferrer"&gt;&lt;strong&gt;Santeria en Chicago&lt;/strong&gt;&lt;/a&gt;. Te pueden orientar con más que solo código, you know?&lt;/p&gt;




&lt;h3&gt;
  
  
  ¿Por qué te puede servir esto?
&lt;/h3&gt;

&lt;p&gt;Bueno, no es solo para santeros techies como yo 😅. Te dejo un par de ideas por si no se te ocurre cómo usarlo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📅 Mantener orden en las fechas de tus celebraciones
&lt;/li&gt;
&lt;li&gt;🧘🏽‍♀️ Llevar un diario espiritual con los eventos
&lt;/li&gt;
&lt;li&gt;🧑🏾‍💻 Aprender Django con un proyecto más emocional
&lt;/li&gt;
&lt;li&gt;💡 Automatizar recordatorios de rituales
&lt;/li&gt;
&lt;li&gt;🤝 Compartirlo con tu comunidad religiosa
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¿Y si estás en Illinois? Hay más práctica que teoría. Algunos centros de &lt;a href="https://elsecretoazteca.com/santeria-chicago-il/" rel="noopener noreferrer"&gt;&lt;strong&gt;Chicago Santeria&lt;/strong&gt;&lt;/a&gt; están empezando a usar tecnología para conectar mejor con sus miembros. Increíble, ¿no?&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusión sencilla y directa (como debe ser)
&lt;/h3&gt;

&lt;p&gt;Si alguna vez sentiste que el código y la fe eran polos opuestos… guess what? No lo son. Yo armé esto porque quería honrar mis raíces y, de paso, mejorar como dev. No es perfecto, pero es útil. Y tiene corazón.&lt;/p&gt;

&lt;p&gt;Dale una probadita esta semana. Haz algo con sentido, algo que conecte contigo y con los tuyos. Y si terminas haciendo tu propio calendario, mándamelo, que quiero verlo 😉&lt;/p&gt;

&lt;p&gt;Ah, y si estás explorando prácticas en tu zona, te dejo un último tip: los eventos de &lt;a href="https://elsecretoazteca.com/santeria-chicago-il/" rel="noopener noreferrer"&gt;&lt;strong&gt;Santeria Chicago il&lt;/strong&gt;&lt;/a&gt; pueden inspirarte más de lo que crees.&lt;/p&gt;




&lt;p&gt;¿Te animas? ✨&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
