<?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: Luis Porras</title>
    <description>The latest articles on DEV Community by Luis Porras (@lporras).</description>
    <link>https://dev.to/lporras</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F168705%2F456c7490-bdf9-47e0-841f-76ff594f0133.png</url>
      <title>DEV Community: Luis Porras</title>
      <link>https://dev.to/lporras</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lporras"/>
    <language>en</language>
    <item>
      <title>Hacktoberfest 2026 llega a Barranquilla: construyamos con Open Source AI 🤖🌎</title>
      <dc:creator>Luis Porras</dc:creator>
      <pubDate>Thu, 01 Oct 2026 16:08:07 +0000</pubDate>
      <link>https://dev.to/lporras/hacktoberfest-2026-llega-a-barranquilla-construyamos-con-open-source-ai-25if</link>
      <guid>https://dev.to/lporras/hacktoberfest-2026-llega-a-barranquilla-construyamos-con-open-source-ai-25if</guid>
      <description>&lt;p&gt;Durante muchos años, Hacktoberfest ha sido una de las mejores oportunidades para que desarrolladores de todo el mundo se acerquen al Open Source, conozcan nuevos proyectos y hagan sus primeras contribuciones.&lt;/p&gt;

&lt;p&gt;Pero en 2026 Hacktoberfest cambia de enfoque.&lt;/p&gt;

&lt;p&gt;Este año la invitación es a aprender, experimentar y construir con Inteligencia Artificial Open Source y modelos open-weight.&lt;/p&gt;

&lt;p&gt;Y Barranquilla también hace parte de esta celebración.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 ¿Qué es Hacktoberfest 2026?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hacktoberfest es una celebración mundial del Open Source que ocurre durante todo el mes de octubre.&lt;/p&gt;

&lt;p&gt;En esta edición, el foco está puesto en open-source AI y open-weight models, con cientos de eventos presenciales y actividades online alrededor del mundo.&lt;/p&gt;

&lt;p&gt;La gran diferencia frente a años anteriores es que los Pull Requests y Merge Requests ya no cuentan para obtener las recompensas de Hacktoberfest.&lt;/p&gt;

&lt;p&gt;Esto no significa que el Open Source haya dejado de importar. Al contrario: Hacktoberfest sigue invitando a las personas a participar y contribuir en proyectos Open Source, pero este año la recompensa no está basada en la cantidad de PRs que puedas enviar.&lt;/p&gt;

&lt;p&gt;El objetivo es aprender y construir juntos, especialmente alrededor de las nuevas herramientas y modelos de Inteligencia Artificial.&lt;/p&gt;

&lt;p&gt;🤔 Entonces, ¿cómo participo este año?&lt;/p&gt;

&lt;p&gt;Participar en Hacktoberfest 2026 es bastante sencillo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Crea o inicia sesión en&lt;/strong&gt; &lt;a href="https://hacktoberfest.com/" rel="noopener noreferrer"&gt;My Hacktoberfest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Debes ingresar a My Hacktoberfest utilizando tu cuenta de MyMLH.&lt;/p&gt;

&lt;p&gt;Desde allí tendrás acceso a tu panel de participante y podrás consultar las actividades que cuentan para obtener stickers y otras recompensas.&lt;/p&gt;

&lt;p&gt;No necesitas estar contando Pull Requests ni cumplir una cantidad determinada de contribuciones a GitHub.&lt;/p&gt;

&lt;p&gt;Conectar tu cuenta de DEV es opcional, aunque puede ser útil si quieres participar en los DEV Challenges y obtener determinadas insignias.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Participa online o presencialmente&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Puedes participar durante todo octubre de diferentes maneras:&lt;/p&gt;

&lt;p&gt;Asistiendo a un Hacktoberfest Fest.&lt;br&gt;
Participando en Hacktoberfest online.&lt;br&gt;
Participando en los DEV Challenges.&lt;br&gt;
Asistiendo a livestreams.&lt;br&gt;
Participando en Global Hack Week: Hacktoberfest.&lt;br&gt;
Construyendo proyectos con herramientas de IA Open Source y modelos open-weight.&lt;/p&gt;

&lt;p&gt;Y sí: puedes hacer varias de estas actividades durante el mismo Hacktoberfest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧑‍💻 ¿Y qué pasa con GitHub?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esta es probablemente una de las preguntas más frecuentes para quienes participaron en Hacktoberfest anteriormente.&lt;/p&gt;

&lt;p&gt;En años anteriores, buena parte de la experiencia estaba alrededor de identificar Pull Requests y Merge Requests realizados durante octubre.&lt;/p&gt;

&lt;p&gt;Eso cambió en 2026.&lt;/p&gt;

&lt;p&gt;Los PRs ya no cuentan para las recompensas de Hacktoberfest y la plataforma ya no está enfocada en contabilizar este tipo de contribuciones.&lt;/p&gt;

&lt;p&gt;Por supuesto, GitHub y el Open Source siguen siendo completamente relevantes. Puedes utilizar GitHub para construir, publicar y compartir tus proyectos, contribuir a otros proyectos o trabajar colaborativamente.&lt;/p&gt;

&lt;p&gt;Pero este año Hacktoberfest quiere que pensemos más allá del clásico:&lt;/p&gt;

&lt;p&gt;"¿Cuántos PRs hice?"&lt;/p&gt;

&lt;p&gt;La pregunta ahora es:&lt;/p&gt;

&lt;p&gt;"¿Qué puedo aprender y qué puedo construir con Open Source AI?"&lt;/p&gt;

&lt;p&gt;🤖 ¿Qué puedo construir?&lt;/p&gt;

&lt;p&gt;Aquí es donde empieza la parte divertida.&lt;/p&gt;

&lt;p&gt;No necesitas ser un experto en Inteligencia Artificial para participar.&lt;/p&gt;

&lt;p&gt;Puedes experimentar con modelos open-weight, herramientas de IA Open Source, agentes, aplicaciones que utilizan modelos de lenguaje, herramientas para desarrolladores o cualquier otra idea que te permita aprender construyendo.&lt;/p&gt;

&lt;p&gt;Algunas ideas:&lt;/p&gt;

&lt;p&gt;🧠 Un chatbot utilizando un modelo open-weight.&lt;br&gt;
📚 Un asistente para estudiar.&lt;br&gt;
🔎 Una herramienta para buscar y consultar documentos.&lt;br&gt;
👨‍💻 Un copiloto para programadores.&lt;br&gt;
🌎 Una aplicación enfocada en problemas de nuestra región.&lt;br&gt;
🏝️ Una herramienta relacionada con turismo en el Caribe.&lt;br&gt;
🏥 Una aplicación para resolver algún problema de acceso a información.&lt;br&gt;
🎓 Una herramienta educativa.&lt;br&gt;
⚡ Un agente capaz de automatizar una tarea.&lt;br&gt;
💡 O simplemente un experimento para aprender cómo funcionan estos modelos.&lt;/p&gt;

&lt;p&gt;No tienes que llegar con una idea revolucionaria.&lt;/p&gt;

&lt;p&gt;Hacktoberfest se trata de aprender, experimentar y compartir lo que construyes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌴 Hacktoberfest Hack Day Barranquilla&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para celebrar Hacktoberfest 2026, desde la comunidad tecnológica de Barranquilla organizamos nuestro propio Hacktoberfest Hack Day.&lt;/p&gt;

&lt;p&gt;📅 Sábado 24 de octubre de 2026&lt;br&gt;
⏰ 9:00 AM – 7:00 PM&lt;br&gt;
📍 IDITEK — Cra 53 #53-105, Barranquilla&lt;br&gt;
💰 Entrada gratuita&lt;/p&gt;

&lt;p&gt;Será un día para reunirnos, aprender, experimentar y construir proyectos utilizando Open Source AI y modelos open-weight.&lt;/p&gt;

&lt;p&gt;Un Hack Day es básicamente un mini-hackathon: tienes un día para trabajar en una idea, construir un prototipo y presentar lo que desarrollaste al final.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👥 ¿Tengo que ir con un equipo?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;Puedes participar individualmente o con un equipo.&lt;/p&gt;

&lt;p&gt;Si ya tienes amigos con quienes quieres construir algo, armen equipo.&lt;/p&gt;

&lt;p&gt;Si vienes solo, también eres bienvenido. Una de las mejores partes de estos eventos es precisamente conocer a otras personas de la comunidad, encontrar colaboradores y terminar construyendo algo que inicialmente no tenías planeado.&lt;/p&gt;

&lt;p&gt;Todos los integrantes de un equipo deben registrarse y hacer check-in en el evento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧑‍🎓 ¿Necesito ser experto?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tampoco.&lt;/p&gt;

&lt;p&gt;Los principiantes son bienvenidos en Hacktoberfest.&lt;/p&gt;

&lt;p&gt;Si nunca has trabajado con modelos de IA, esta puede ser una excelente oportunidad para experimentar por primera vez.&lt;/p&gt;

&lt;p&gt;Y si ya tienes experiencia desarrollando aplicaciones con IA, puedes aprovechar el día para construir algo más ambicioso, compartir conocimiento y ayudar a otros participantes.&lt;/p&gt;

&lt;p&gt;La idea es que podamos aprender entre todos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💻 ¿Qué debo llevar?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si vas a construir, trae:&lt;/p&gt;

&lt;p&gt;💻 Tu computador.&lt;br&gt;
🔌 Cargador.&lt;br&gt;
🧠 Una idea... o simplemente ganas de experimentar.&lt;br&gt;
👥 Si quieres, un equipo.&lt;/p&gt;

&lt;p&gt;La página oficial de Hacktoberfest recomienda llevar laptop y cargador para los Hack Days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🗓️ ¿Cómo será el día?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tenemos una jornada pensada para combinar networking, construcción y colaboración:&lt;/p&gt;

&lt;p&gt;9:00 AM — Registro y Networking&lt;/p&gt;

&lt;p&gt;Llegamos, hacemos check-in, conocemos a otros participantes y comenzamos a formar equipos.&lt;/p&gt;

&lt;p&gt;10:00 AM – 12:00 PM — Coding&lt;/p&gt;

&lt;p&gt;Primera sesión de construcción.&lt;/p&gt;

&lt;p&gt;12:00 PM – 1:30 PM — Break&lt;/p&gt;

&lt;p&gt;Almuerzo y networking.&lt;/p&gt;

&lt;p&gt;2:00 PM – 6:00 PM — Coding&lt;/p&gt;

&lt;p&gt;Volvemos a construir, probar, romper cosas, arreglarlas y preparar nuestros proyectos.&lt;/p&gt;

&lt;p&gt;Final del día — Demos&lt;/p&gt;

&lt;p&gt;Llegó el momento de mostrar qué construimos.&lt;/p&gt;

&lt;p&gt;Los proyectos de un Hack Day deben completarse y enviarse durante el día del evento, siguiendo las instrucciones y deadline definidos por el host.&lt;/p&gt;

&lt;p&gt;🎁 ¿Y las recompensas?&lt;/p&gt;

&lt;p&gt;Hacktoberfest continúa teniendo swag y recompensas, aunque la dinámica cambió.&lt;/p&gt;

&lt;p&gt;Los participantes presenciales pueden recibir camisetas y otros artículos mientras haya disponibilidad. También existen stickers y otras recompensas asociadas a las actividades de Hacktoberfest.&lt;/p&gt;

&lt;p&gt;Además, los Hack Days pueden tener premios para los proyectos ganadores, dependiendo de las categorías y reglas definidas por cada evento.&lt;/p&gt;

&lt;p&gt;Pero, honestamente, el objetivo principal debería ser otro:&lt;/p&gt;

&lt;p&gt;venir a aprender algo que todavía no sabes, construir algo que todavía no existe y conocer a otras personas que también quieren hacerlo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 ¿Te animas?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si estás en Barranquilla, estudias programación, trabajas como desarrollador, estás aprendiendo Inteligencia Artificial, tienes curiosidad por los modelos Open Source o simplemente quieres pasar un sábado construyendo cosas interesantes...&lt;/p&gt;

&lt;p&gt;este evento es para ti.&lt;/p&gt;

&lt;p&gt;No necesitas tener un proyecto perfecto.&lt;/p&gt;

&lt;p&gt;No necesitas haber participado antes en Hacktoberfest.&lt;/p&gt;

&lt;p&gt;No necesitas hacer Pull Requests.&lt;/p&gt;

&lt;p&gt;No necesitas llegar siendo experto en IA.&lt;/p&gt;

&lt;p&gt;Solo necesitas ganas de aprender y construir.&lt;/p&gt;

&lt;p&gt;📍 Regístrate en el Hacktoberfest Hack Day Barranquilla&lt;/p&gt;

&lt;p&gt;👉 Regístrate aquí: &lt;a href="https://events.mlh.com/events/14917-hacktoberfest-hack-day-barranquilla" rel="noopener noreferrer"&gt;Hacktoberfest Hack Day Barranquilla — MLH&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nos vemos el 24 de octubre en IDITEK.&lt;/p&gt;

&lt;p&gt;Trae tu laptop. Nosotros ponemos la comunidad, el espacio y las ganas de construir. 🚀&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>community</category>
      <category>barranquilla</category>
    </item>
    <item>
      <title>FreeShow: The Open Source Presentation App Your Church Needs</title>
      <dc:creator>Luis Porras</dc:creator>
      <pubDate>Mon, 06 Apr 2026 17:34:11 +0000</pubDate>
      <link>https://dev.to/lporras/freeshow-the-open-source-presentation-app-your-church-needs-mo0</link>
      <guid>https://dev.to/lporras/freeshow-the-open-source-presentation-app-your-church-needs-mo0</guid>
      <description>&lt;h2&gt;
  
  
  Serving My Church Through Code
&lt;/h2&gt;

&lt;p&gt;Ever since I joined &lt;a href="https://www.instagram.com/comunidadfamiliareal/" rel="noopener noreferrer"&gt;Comunidad Familia Real&lt;/a&gt;, I've always had a deep desire to serve. Over time, I've been able to do that through the audiovisual team and currently as the leader of our worship band.&lt;/p&gt;

&lt;p&gt;But I also wanted to contribute from my talent as a software developer. And I finally found the perfect way to do both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discovering FreeShow
&lt;/h2&gt;

&lt;p&gt;If you've ever been part of a church tech team, you know the struggle: most presentation software for worship is either expensive, proprietary, or clunky. That's why I was thrilled when I discovered &lt;a href="https://freeshow.app" rel="noopener noreferrer"&gt;FreeShow&lt;/a&gt; — a &lt;strong&gt;free and open source&lt;/strong&gt; presentation app designed specifically for churches and live events.&lt;/p&gt;

&lt;p&gt;FreeShow lets you handle everything your church needs in one place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scripture display&lt;/strong&gt; during sermons&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Song lyrics&lt;/strong&gt; with real-time live display&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images and slides&lt;/strong&gt; for announcements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instrumental audio&lt;/strong&gt; playback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Welcome videos&lt;/strong&gt; and media&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage display&lt;/strong&gt; for musicians and speakers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the best part? It's completely free. No subscriptions, no licenses, no limitations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why FreeShow Stands Out
&lt;/h2&gt;

&lt;p&gt;Here's what makes FreeShow special compared to other church presentation tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;FreeShow&lt;/th&gt;
&lt;th&gt;ProPresenter&lt;/th&gt;
&lt;th&gt;EasyWorship&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$399+&lt;/td&gt;
&lt;td&gt;$199+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open Source&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-platform&lt;/td&gt;
&lt;td&gt;Windows, Mac, Linux&lt;/td&gt;
&lt;td&gt;Windows, Mac&lt;/td&gt;
&lt;td&gt;Windows only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bible integration&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live lyrics&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MIDI support&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NDI output&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How We Use It at Our Church
&lt;/h2&gt;

&lt;p&gt;At Comunidad Familia Real, we started implementing FreeShow to support our weekly services. Here's how we use it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;During the sermon&lt;/strong&gt; — We display Scripture passages on screen so the congregation can follow along&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worship time&lt;/strong&gt; — Live song lyrics are projected in real time as our band plays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Welcome and announcements&lt;/strong&gt; — Videos and image slides before and between services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instrumental background&lt;/strong&gt; — Ambient music during prayer and reflection moments&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The transition was smooth, and our team picked it up quickly. The interface is intuitive enough that even volunteers with no tech background can operate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  From User to Contributor
&lt;/h2&gt;

&lt;p&gt;I liked FreeShow so much that I decided to contribute back to the project. I'm excited to share that &lt;strong&gt;my first Pull Request was accepted&lt;/strong&gt; and is available in the latest version of FreeShow!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ChurchApps/FreeShow/pulls?q=author%3Alporras" rel="noopener noreferrer"&gt;View my PR on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's something deeply satisfying about using your professional skills to serve your community AND contribute to a project that helps churches around the world.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Your Church Should Try FreeShow
&lt;/h2&gt;

&lt;p&gt;If your church is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paying for expensive presentation software&lt;/strong&gt; — FreeShow does what you need, for free&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using PowerPoint or Google Slides&lt;/strong&gt; for worship — FreeShow is purpose-built for church services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Looking for something that "just works"&lt;/strong&gt; — it's lightweight, fast, and easy to set up&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Running on different operating systems&lt;/strong&gt; — it works on Windows, Mac, and Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Give it a try. You have nothing to lose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download FreeShow at &lt;a href="https://freeshow.app" rel="noopener noreferrer"&gt;freeshow.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Import your song library or create new songs directly in the app&lt;/li&gt;
&lt;li&gt;Add your Bible translations&lt;/li&gt;
&lt;li&gt;Set up your output screens&lt;/li&gt;
&lt;li&gt;You're ready for Sunday!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;a href="https://freeshow.app/docs" rel="noopener noreferrer"&gt;FreeShow documentation&lt;/a&gt; is a great place to learn the basics, &lt;a href="https://www.youtube.com/@theGarryBjr" rel="noopener noreferrer"&gt;Garry Bjr's YouTube channel&lt;/a&gt; has excellent tutorials and walkthroughs, and the community on &lt;a href="https://github.com/ChurchApps/FreeShow" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; is welcoming and active.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contribute!
&lt;/h2&gt;

&lt;p&gt;FreeShow is open source and welcomes contributions. Whether you're a developer, designer, translator, or just someone who wants to help improve the documentation — there's a place for you.&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/ChurchApps/FreeShow" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; to get started.&lt;/p&gt;




&lt;p&gt;I'm grateful for the opportunities to serve and keep growing as a developer. Technology can be a powerful tool for our communities — and open source makes it accessible to everyone.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have you used FreeShow or a similar tool at your church? I'd love to hear about your experience in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>node</category>
      <category>electron</category>
      <category>church</category>
    </item>
    <item>
      <title>BibleQL: A GraphQL API for the Bible</title>
      <dc:creator>Luis Porras</dc:creator>
      <pubDate>Mon, 06 Apr 2026 17:20:35 +0000</pubDate>
      <link>https://dev.to/lporras/bibleql-a-graphql-api-for-the-bible-2geg</link>
      <guid>https://dev.to/lporras/bibleql-a-graphql-api-for-the-bible-2geg</guid>
      <description>&lt;h2&gt;
  
  
  Why I Built BibleQL
&lt;/h2&gt;

&lt;p&gt;I've always wanted a simple, developer-friendly way to access Bible text programmatically. Most existing APIs are either proprietary, limited in translations, or use REST endpoints that make it hard to fetch exactly the data you need.&lt;/p&gt;

&lt;p&gt;That's why I created &lt;strong&gt;BibleQL&lt;/strong&gt; — a GraphQL API that lets you query Bible verses and passages across &lt;strong&gt;43 public domain translations in 31 languages&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is BibleQL?
&lt;/h2&gt;

&lt;p&gt;BibleQL is an open-source GraphQL API built with &lt;strong&gt;Ruby on Rails 8.1&lt;/strong&gt; and &lt;strong&gt;PostgreSQL&lt;/strong&gt;. It provides a single flexible endpoint where you can query exactly the Bible data you need — no more, no less.&lt;/p&gt;

&lt;p&gt;Here's what a query looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;passage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;translation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eng-web"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John 3:16"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;reference&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;translationName&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;verses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;bookName&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;chapter&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;verse&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you get back exactly what you asked for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"passage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"reference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John 3:16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"For God so loved the world, that he gave his one and only Son, that whoever believes in him should not perish, but have eternal life."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"translationName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"World English Bible"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"verses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"bookName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"chapter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"verse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"For God so loved the world, that he gave his one and only Son, that whoever believes in him should not perish, but have eternal life."&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;43 Bible translations&lt;/strong&gt; in 31 languages (all public domain)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible passage lookup&lt;/strong&gt; — single verses, ranges, and multi-ranges (e.g., &lt;code&gt;"Matthew 25:31-33,46"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Localized book names&lt;/strong&gt; — query using book names in the translation's language (e.g., &lt;code&gt;"Mateo 28:18-20"&lt;/code&gt; for Spanish, &lt;code&gt;"Lucas 3:1-10"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-text search&lt;/strong&gt; across all verses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verse of the Day&lt;/strong&gt; — a curated daily verse for any translation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Random verse&lt;/strong&gt; — get a random verse filtered by testament or specific books&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bible index&lt;/strong&gt; — browse the full structural hierarchy of any translation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language discovery&lt;/strong&gt; — list all available languages with their translations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Playground&lt;/strong&gt; — try the API right in your browser at &lt;a href="https://bibleql.org/playground" rel="noopener noreferrer"&gt;&lt;code&gt;/playground&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Supported Reference Formats
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;passage&lt;/code&gt; query understands many reference formats:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single verse&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"John 3:16"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verse range&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"John 3:16-18"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple ranges&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"Matthew 25:31-33,46"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full chapter&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"Genesis 1"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-chapter&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"Romans 12:1,3-4 &amp;amp; 13:2-4"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Localized names&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;"Mateo 28:18-20"&lt;/code&gt;, &lt;code&gt;"Lucas 3:1-10"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Client Libraries
&lt;/h2&gt;

&lt;p&gt;To make it even easier to get started, I've built client SDKs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ruby:&lt;/strong&gt; &lt;a href="https://github.com/lporras/bibleql-ruby" rel="noopener noreferrer"&gt;bibleql-ruby&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node.js:&lt;/strong&gt; &lt;a href="https://github.com/lporras/bibleql-js" rel="noopener noreferrer"&gt;bibleql-js&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Examples:&lt;/strong&gt; &lt;a href="https://github.com/lporras/bibleql-example" rel="noopener noreferrer"&gt;bibleql-example&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ruby 4.0 / Rails 8.1&lt;/strong&gt; — the latest and greatest&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; — reliable and performant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;graphql-ruby&lt;/strong&gt; — mature GraphQL implementation for Ruby&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Key authentication&lt;/strong&gt; with environment-aware prefixes (&lt;code&gt;bql_live_&lt;/code&gt; / &lt;code&gt;bql_test_&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting&lt;/strong&gt; via Rack::Attack (100 req/min per IP, 1,000 req/day per API key)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker + Kamal&lt;/strong&gt; for deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions CI/CD&lt;/strong&gt; — security scans, linting, and tests on every PR&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The API is live at &lt;strong&gt;&lt;a href="https://bibleql.org" rel="noopener noreferrer"&gt;https://bibleql.org&lt;/a&gt;&lt;/strong&gt;. You can explore it interactively using the &lt;a href="https://bibleql.org/playground" rel="noopener noreferrer"&gt;Playground&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To get an API key, visit the &lt;a href="https://bibleql.org/api-keys/request/new" rel="noopener noreferrer"&gt;API Key Request page&lt;/a&gt; and submit a request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking for Contributors!
&lt;/h2&gt;

&lt;p&gt;This is where I need &lt;strong&gt;your&lt;/strong&gt; help. BibleQL is fully open source and I'd love for this to be a community-driven project. Whether you're a seasoned Rails developer or just getting started with open source, there's room for you.&lt;/p&gt;

&lt;p&gt;Here are some areas where contributions would be especially welcome:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More Bible versions&lt;/strong&gt; — this is a big one! Currently all 43 translations are public domain, but I'd love to expand the API with widely-used copyrighted versions like &lt;strong&gt;NVI&lt;/strong&gt; (Nueva Version Internacional), &lt;strong&gt;RVR1960&lt;/strong&gt; (Reina-Valera 1960), &lt;strong&gt;NIV&lt;/strong&gt;, &lt;strong&gt;ESV&lt;/strong&gt;, and others. If you have experience navigating Bible text licensing — working with publishers, understanding API usage rights, or securing distribution agreements — I'd really appreciate your guidance. This is uncharted territory for me and any help figuring out the licensing path would be invaluable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New query types&lt;/strong&gt; — ideas for useful queries the API doesn't support yet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client libraries&lt;/strong&gt; — SDKs for Python, Go, Java, or any other language&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt; — improve guides, add tutorials, or write usage examples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bug fixes and improvements&lt;/strong&gt; — check the issues tab for open tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend apps&lt;/strong&gt; — build something cool on top of the API!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/lporras/bibleql" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; and the &lt;a href="https://github.com/lporras/bibleql/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing Guide&lt;/a&gt; to get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get in Touch
&lt;/h2&gt;

&lt;p&gt;If you have questions, ideas, or just want to chat about the project, feel free to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open an &lt;a href="https://github.com/lporras/bibleql/issues" rel="noopener noreferrer"&gt;issue on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Star the repo if you find it useful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I believe technology can be a powerful tool for making Scripture more accessible to everyone. Let's build this together.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;BibleQL is open source. Bible translations included via &lt;a href="https://github.com/seven1m/open-bibles" rel="noopener noreferrer"&gt;open-bibles&lt;/a&gt; are Public Domain or Creative Commons licensed.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>bible</category>
      <category>opensource</category>
      <category>graphql</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Usa el poder de Sidekiq Jobs con CronJobs</title>
      <dc:creator>Luis Porras</dc:creator>
      <pubDate>Mon, 05 May 2025 14:43:28 +0000</pubDate>
      <link>https://dev.to/lporras/usa-el-poder-de-sidekiq-jobs-con-cronjobs-2jo9</link>
      <guid>https://dev.to/lporras/usa-el-poder-de-sidekiq-jobs-con-cronjobs-2jo9</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/webdox/corre-tus-tareas-recurrentes-con-sidekiq-3nj1" class="crayons-story__hidden-navigation-link"&gt;Corre tus tareas recurrentes con Sidekiq&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/webdox"&gt;
            &lt;img alt="WebdoxCLM logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1415%2F2c163ddb-5577-49e5-9a66-9cb94a7f8ad2.png" class="crayons-logo__image" width="200" height="200"&gt;
          &lt;/a&gt;

          &lt;a href="/lporras" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F168705%2F456c7490-bdf9-47e0-841f-76ff594f0133.png" alt="lporras profile" class="crayons-avatar__image" width="542" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/lporras" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Luis Porras
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Luis Porras
                
              
              &lt;div id="story-author-preview-content-720640" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/lporras" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F168705%2F456c7490-bdf9-47e0-841f-76ff594f0133.png" class="crayons-avatar__image" alt="" width="542" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Luis Porras&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/webdox" class="crayons-story__secondary fw-medium"&gt;WebdoxCLM&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/webdox/corre-tus-tareas-recurrentes-con-sidekiq-3nj1" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 7 '21&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/webdox/corre-tus-tareas-recurrentes-con-sidekiq-3nj1" id="article-link-720640"&gt;
          Corre tus tareas recurrentes con Sidekiq
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ruby"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ruby&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/rails"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;rails&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/redis"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;redis&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/webdox/corre-tus-tareas-recurrentes-con-sidekiq-3nj1" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;11&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/webdox/corre-tus-tareas-recurrentes-con-sidekiq-3nj1#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

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

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ruby</category>
      <category>rails</category>
      <category>tutorial</category>
      <category>redis</category>
    </item>
    <item>
      <title>Corre tus tareas recurrentes con Sidekiq</title>
      <dc:creator>Luis Porras</dc:creator>
      <pubDate>Mon, 07 Jun 2021 16:18:11 +0000</pubDate>
      <link>https://dev.to/webdox/corre-tus-tareas-recurrentes-con-sidekiq-3nj1</link>
      <guid>https://dev.to/webdox/corre-tus-tareas-recurrentes-con-sidekiq-3nj1</guid>
      <description>&lt;p&gt;En Webdox utilizamos &lt;strong&gt;&lt;a href="https://github.com/mperham/sidekiq" rel="noopener noreferrer"&gt;Sidekiq&lt;/a&gt;&lt;/strong&gt; como nuestra plataforma para procesar tareas asíncronas.  &lt;strong&gt;Sidekiq&lt;/strong&gt; utiliza hilos (threads) para manejar varias tareas al mismo tiempo en un mismo proceso.&lt;/p&gt;

&lt;p&gt;Tenemos muchas tareas que ejecutamos de forma asíncrona con Sidekiq, por ejemplo: El envío de notificaciones por correo, la reindexación de contratos, la generación masiva de contratos y el inicio de la firma electrónica de cada contrato masivo, etc&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sidekiq&lt;/strong&gt; se puede usar de forma gratuita y de forma paga.  Cuando usamos la forma gratuita hay ciertas funcionalidades que no se incluyen y una de estas es ejecutar CRON JOBS.  Con esta funcionalidad podríamos tomar una tarea de Sidekiq y ejecutarla recurrentemente cada cierto tiempo con &lt;a href="https://www.hostinger.es/tutoriales/cron-job" rel="noopener noreferrer"&gt;Cron jobs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Afortunadamente existen Gemas que funcionan como plugins de Sidekiq y en Webdox utilizamos una para ejecutar tareas recurrentes de forma gratuita, su nombre es &lt;strong&gt;&lt;a href="https://github.com/Moove-it/sidekiq-scheduler" rel="noopener noreferrer"&gt;Sidekiq Scheduler&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A continuación un pequeño tutorial de cómo utilizar Sidekiq Scheduler&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalación y Configuración
&lt;/h2&gt;

&lt;p&gt;Agregamos la gema en nuestro Gemfile&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Gemfile&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'sidekiq-scheduler'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y Ejecutamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bundle install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creamos un Worker de Sidekiq el cual se ejecutará cada cierto tiempo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;hello_world_worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rb&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'sidekiq-scheduler'&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HelloWorldWorker&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Sidekiq&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Worker&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;perform&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s1"&gt;'Hello world'&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para configurar la periodicidad del Worker modificamos el archivo de configuración de Sidekiq, un apartado de Scheduler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/sidekiq.yml&lt;/span&gt;

&lt;span class="na"&gt;:schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;hello_world&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*'&lt;/span&gt;   &lt;span class="c1"&gt;# Runs once per minute&lt;/span&gt;
    &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HelloWorldWorker&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y corremos Sidekiq:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bundle &lt;span class="nb"&gt;exec &lt;/span&gt;sidekiq &lt;span class="nt"&gt;-C&lt;/span&gt; config/sidekiq.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez iniciado Sidekiq veremos como se imprime "Hello world" cada minuto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2021-06-07T15:54:38.710Z 62465 TID-ownzi9r98 INFO: Running in ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin20]
2021-06-07T15:54:38.710Z 62465 TID-ownzi9r98 INFO: See LICENSE and the LGPL-3.0 for licensing details.
2021-06-07T15:54:38.710Z 62465 TID-ownzi9r98 INFO: Upgrade to Sidekiq Pro for more features and support: http://sidekiq.org
2021-06-07T15:54:38.723Z 62465 TID-ownzi9r98 INFO: Loading Schedule
2021-06-07T15:54:38.723Z 62465 TID-ownzi9r98 INFO: Schedule empty! Set Sidekiq.schedule
2021-06-07T15:54:38.724Z 62465 TID-ownzi9r98 INFO: Schedules Loaded
2021-06-07T15:54:38.734Z 62465 TID-ownzi9r98 INFO: Reloading Schedule
2021-06-07T15:54:38.734Z 62465 TID-ownzi9r98 INFO: Loading Schedule
2021-06-07T15:54:38.790Z 62465 TID-ownzi9r98 INFO: Scheduling hello_world {"cron"=&amp;gt;"0 * * * * *", "class"=&amp;gt;"HelloWorldWorker", "queue"=&amp;gt;"default"}
2021-06-07T15:54:38.791Z 62465 TID-ownzi9r98 INFO: Schedules Loaded
2021-06-07T15:54:38.791Z 62465 TID-ownzi9r98 INFO: Starting processing, hit Ctrl-C to stop
2021-06-07T15:59:37.940Z 62990 TID-ov0v1hmpo HelloWorldWorker JID-4a465f9e9646157552de7f5c INFO: start
Hello world
2021-06-07T15:59:37.940Z 62990 TID-ov0v1hmpo HelloWorldWorker JID-4a465f9e9646157552de7f5c INFO: done: 0.0 sec
2021-06-07T15:59:37.940Z 62990 TID-ov0v1hmpo HelloWorldWorker JID-64dc6b6cb06ebf580c3faae6 INFO: start
Hello world
2021-06-07T15:59:37.940Z 62990 TID-ov0v1hmpo HelloWorldWorker JID-64dc6b6cb06ebf580c3faae6 INFO: done: 0.0 sec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Además tenemos la opción de visualizar las tareas recurrentes en el panel de administración de Sidekiq si realizamos la siguiente configuración:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.ru&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'sidekiq/web'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'sidekiq-scheduler/web'&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="no"&gt;Sidekiq&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Web&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fmsluy07gqr7th4o4tvxu.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%2Fmsluy07gqr7th4o4tvxu.png" alt="Alt Text" width="799" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por último recomendamos utilizar la página &lt;a href="https://crontab.guru/" rel="noopener noreferrer"&gt;CronTabGurú&lt;/a&gt; para cuando necesitemos configurar la periodicidad de las tareas recurrentes con la sintaxis de Cron Jobs.&lt;/p&gt;

&lt;p&gt;Tener en cuenta que la sintaxis de cron jobs que utiliza Sidekiq Scheduler tiene una sección extra en la parte de adelante la cual nos permite configurar los segundos.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>tutorial</category>
      <category>redis</category>
    </item>
  </channel>
</rss>
