<?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: Stan Bright</title>
    <description>The latest articles on DEV Community by Stan Bright (@stanbright).</description>
    <link>https://dev.to/stanbright</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%2F28460%2F6c716f67-c261-4923-a586-5b1779b5c7fc.jpeg</url>
      <title>DEV Community: Stan Bright</title>
      <link>https://dev.to/stanbright</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stanbright"/>
    <language>en</language>
    <item>
      <title>Top 13 Trending TypeScript repos in May 2024</title>
      <dc:creator>Stan Bright</dc:creator>
      <pubDate>Tue, 30 Apr 2024 22:11:07 +0000</pubDate>
      <link>https://dev.to/libhunt/top-13-trending-typescript-repos-in-may-2024-50pf</link>
      <guid>https://dev.to/libhunt/top-13-trending-typescript-repos-in-may-2024-50pf</guid>
      <description>&lt;p&gt;&lt;a href="https://media.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%2Fnp2g2lhceiu2p91s4j7d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fnp2g2lhceiu2p91s4j7d.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Good day everyone!&lt;/p&gt;

&lt;p&gt;I'm sharing 13 of the &lt;a href="https://www.libhunt.com/l/typescript/trending" rel="noopener noreferrer"&gt;trending TypeScript libraries&lt;/a&gt; and projects from LibHunt. As the case is with other programming languages, we can notice the high number of AI related projects. And that's amazing. Given the growing importance of AI and systems depending on it, it's paramount to have good open-source presence. &lt;/p&gt;

&lt;p&gt;If you think that there's a trending TypeScript project that is worth listing here, please add a link to it within the comments. Thanks!&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;⭐&lt;/th&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Resources&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F106073854%3Fv%3D4%26s%3D40" alt="flyde logo"&gt; &lt;strong&gt;1.6k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;flyde&lt;/strong&gt; &lt;br&gt;- flow-based, flow-based-programming, Reactive Programming, Visual, visual-programming&lt;/td&gt;
&lt;td&gt;⚡️⚡️⚡️ Open-source, visual programming for developers. Includes a VS Code extension, integrates with existing TypeScript code, browser and Node.js.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/flydelabs/flyde" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="http://www.flyde.dev/" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/flyde" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F168166%3Fv%3D4%26s%3D40" alt="pragmatic-drag-and-drop logo"&gt; &lt;strong&gt;6.4k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;pragmatic-drag-and-drop&lt;/strong&gt; &lt;br&gt;- Drag and Drop&lt;/td&gt;
&lt;td&gt;Fast drag and drop for any experience on any tech stack&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/atlassian/pragmatic-drag-and-drop" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://atlassian.design/components/pragmatic-drag-and-drop" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/pragmatic-drag-and-drop" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F45049140%3Fv%3D4%26s%3D40" alt="jampack logo"&gt; &lt;strong&gt;1.5k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;jampack&lt;/strong&gt; &lt;br&gt;- Jamstack, static-site, Blog, Node, static-site-building&lt;/td&gt;
&lt;td&gt;Optimizes static websites for best user experience and best Core Web Vitals scores.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/divriots/jampack" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://jampack.divriots.com/" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/jampack" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F146833583%3Fv%3D4%26s%3D40" alt="dashpress logo"&gt; &lt;strong&gt;1.3k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;dashpress&lt;/strong&gt; &lt;br&gt;- Storage, Admin, admin-ui, admin-dashboard, admin-panel&lt;/td&gt;
&lt;td&gt;Generate powerful admin apps without writing a single line of code - Run &lt;code&gt;npx dashpress&lt;/code&gt; to see some magic!&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/dashpresshq/dashpress" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="http://demo.dashpress.io" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/dashpress" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F39044357%3Fv%3D4%26s%3D40" alt="oneuptime logo"&gt; &lt;strong&gt;4.1k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;oneuptime&lt;/strong&gt; &lt;br&gt;- DevOps, Monitoring, incident-response, incident-management, status-page&lt;/td&gt;
&lt;td&gt;OneUptime is the complete open-source observability platform.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/OneUptime/oneuptime" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://oneuptime.com" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/oneuptime" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F126341964%3Fv%3D4%26s%3D40" alt="paperlib logo"&gt; &lt;strong&gt;1.2k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;paperlib&lt;/strong&gt; &lt;br&gt;- academic-paper, Management, computer-science, Computer Vision, neural-language-processing&lt;/td&gt;
&lt;td&gt;An open-source academic paper management tool.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/Future-Scholars/paperlib" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://paperlib.app" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/paperlib" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F102363196%3Fv%3D4%26s%3D40" alt="jan logo"&gt; &lt;strong&gt;17.6k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;jan&lt;/strong&gt; &lt;br&gt;- llama2, llamacpp, localai, self-hosted, Electron&lt;/td&gt;
&lt;td&gt;Jan is an open source alternative to ChatGPT that runs 100% offline on your computer. Multiple engine support (llama.cpp, TensorRT-LLM)&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/janhq/jan" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://jan.ai/" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/jan" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F127165244%3Fv%3D4%26s%3D40" alt="dify logo"&gt; &lt;strong&gt;25.6k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;dify&lt;/strong&gt; &lt;br&gt;- AI, backend-as-a-service, Gpt, langchain, llm&lt;/td&gt;
&lt;td&gt;Dify is an open-source LLM app development platform. Dify's intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, letting you quickly go from prototype to production.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/langgenius/dify" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://dify.ai" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/dify" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F61444807%3Fv%3D4%26s%3D40" alt="univer logo"&gt; &lt;strong&gt;3.1k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;univer&lt;/strong&gt; &lt;br&gt;- Formula, Chart, Canvas, data-table, Excel&lt;/td&gt;
&lt;td&gt;Univer is an open-source alternative to Google Sheets, Slides, and Docs&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/dream-num/univer" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://univer.ai" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/univer" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F134426827%3Fv%3D4%26s%3D40" alt="vector-admin logo"&gt; &lt;strong&gt;0.8k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;vector-admin&lt;/strong&gt; &lt;br&gt;- AI, aitools, Chroma, database-management, document-retrieval&lt;/td&gt;
&lt;td&gt;The universal tool suite for vector database management. Manage Pinecone, Chroma, Qdrant, Weaviate and more vector databases with ease.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/Mintplex-Labs/vector-admin" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://vectoradmin.com/" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/vector-admin" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F131470832%3Fv%3D4%26s%3D40" alt="Lobe Chat logo"&gt; &lt;strong&gt;29.3k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Lobe Chat&lt;/strong&gt; &lt;br&gt;- Chat, Bot, Agent, TypeScript, AI&lt;/td&gt;
&lt;td&gt;LobeChat is a open-source, extensible (Function Calling), high-performance chatbot framework.It supports one-click free deployment of your private ChatGPT/LLM web application.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/lobehub/lobe-chat" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://chat-preview.lobehub.com" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/lobe-chat" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F151241629%3Fv%3D4%26s%3D40" alt="Cap logo"&gt; &lt;strong&gt;1.2k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Cap&lt;/strong&gt; &lt;br&gt;- App, cap, coss, Mac, open-source&lt;/td&gt;
&lt;td&gt;Effortless, instant screen sharing. Open-source and cross-platform.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/CapSoftware/Cap" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://cap.so" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/CapSoftware/Cap" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F102226726%3Fv%3D4%26s%3D40" alt="FastGPT logo"&gt; &lt;strong&gt;12.7k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;FastGPT&lt;/strong&gt; &lt;br&gt;- gpt35, Nextjs, React, openai, Gpt&lt;/td&gt;
&lt;td&gt;FastGPT is a knowledge-based platform built on the LLMs, offers a comprehensive suite of out-of-the-box capabilities such as data processing, RAG retrieval, and visual AI workflow orchestration, letting you easily develop and deploy complex question-answering systems without the need for extensive setup or configuration.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/labring/FastGPT" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://fastgpt.in" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/FastGPT" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Bonus&lt;/strong&gt; - An interesting fact - TypeScript has become #2 on the Top 100 &lt;a href="https://www.libhunt.com/index" rel="noopener noreferrer"&gt;Programming Languages Popularity Index&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>programming</category>
    </item>
    <item>
      <title>21 Helpful and trending Ruby gems.</title>
      <dc:creator>Stan Bright</dc:creator>
      <pubDate>Wed, 24 Apr 2024 23:47:07 +0000</pubDate>
      <link>https://dev.to/stanbright/21-helpful-and-trending-in-april-ruby-gems-42en</link>
      <guid>https://dev.to/stanbright/21-helpful-and-trending-in-april-ruby-gems-42en</guid>
      <description>&lt;p&gt;Heya fellow Ruby devs!&lt;/p&gt;

&lt;p&gt;I'm sure you that if you are a seasoned ruby expert, that you already know most of these gems. I will also bet that you are using at least some of them. However! I'm promising that you will find something new and useful, too. For example, I found Ferrum only a few months ago, and it's been delightfully easy to navigate a headless chrome with it (compared to Selenium. Selenium was always giving me some hard time for some reason.)&lt;/p&gt;

&lt;p&gt;The list was extracted from &lt;a href="https://www.libhunt.com/l/ruby" rel="noopener noreferrer"&gt;LibHunt Ruby&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;It's interesting that we have two different Admin UIs that are trending. I think this is indicative that our community needs a more useful Admin UI gem. Of course I know about ActiveAdmin and rails_admin. I've tried both of them, and they are surely useful but not perfect. I'd say Python tops us here with their Django admin. Anyways, it's great to see some active development in this direction in the ruby community.&lt;/p&gt;

&lt;p&gt;Basecamp/Rails is working hard with trending work on four gems - solid_queue, solid_cache, console1984 &amp;amp; kamal. Many thanks for that. I'm not using solid_queue and solid_cache yet; however, they are definitely on my radar for my next project.&lt;/p&gt;

&lt;p&gt;Without further ado, here's the list. Please note that it's not ordered by number of stars but rather by stars growth (percentage).&lt;/p&gt;

&lt;p&gt;p.s. is there a gem you'd like to be added to the list :)?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;⭐&lt;/th&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Resources&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F144577318%3Fv%3D4%26s%3D40" alt="multiwoven logo"&gt; &lt;strong&gt;0.6k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;multiwoven&lt;/strong&gt; &lt;br&gt;- Data Analysis, data-engineering, data-ingestion, reverse-etl, data-pipeline&lt;/td&gt;
&lt;td&gt;🔥 Open Source Reverse ETL and Customer Data Platform (CDP). An open-source alternative to Hightouch, Census, and RudderStack.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/Multiwoven/multiwoven" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://multiwoven.com" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/multiwoven" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F4223%3Fv%3D4%26s%3D40" alt="solid_queue logo"&gt; &lt;strong&gt;1.5k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;solid_queue&lt;/strong&gt; &lt;br&gt;- Queue, background-jobs, active-job, Rails, ruby-on-rails&lt;/td&gt;
&lt;td&gt;Database-backed Active Job backend&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/rails/solid_queue" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/solid_queue" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F166417795%3Fv%3D4%26s%3D40" alt="langchainrb logo"&gt; &lt;strong&gt;1.1k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;langchainrb&lt;/strong&gt; &lt;br&gt;- Artificial intelligence, langchain, Machine Learning, ML, Rubyml&lt;/td&gt;
&lt;td&gt;Build LLM-powered applications in Ruby&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/patterns-ai-core/langchainrb" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://rubydoc.info/gems/langchainrb" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/langchainrb" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F504202%3Fv%3D4%26s%3D40" alt="Grover logo"&gt; &lt;strong&gt;0.9k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Grover&lt;/strong&gt; &lt;br&gt;- PDF&lt;/td&gt;
&lt;td&gt;A Ruby gem to transform HTML into PDFs, PNGs or JPEGs using Google Puppeteer/Chromium&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/Studiosity/grover" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.rubydoc.info/gems/grover" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/grover" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F138379721%3Fv%3D4%26s%3D40" alt="docuseal logo"&gt; &lt;strong&gt;5.2k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;docuseal&lt;/strong&gt; &lt;br&gt;- Documents, PDF, self-hosted, daisyui, document-signing&lt;/td&gt;
&lt;td&gt;Open source DocuSign alternative. Create, fill, and sign digital documents ✍️&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/docusealco/docuseal" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.docuseal.co" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/docuseal" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F4223%3Fv%3D4%26s%3D40" alt="solid_cache logo"&gt; &lt;strong&gt;0.7k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;solid_cache&lt;/strong&gt; &lt;br&gt;- Cache, Rails, Performance&lt;/td&gt;
&lt;td&gt;A database-backed ActiveSupport::Cache::Store&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/rails/solid_cache" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/solid_cache" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F145127157%3Fv%3D4%26s%3D40" alt="rage logo"&gt; &lt;strong&gt;0.7k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;rage&lt;/strong&gt; &lt;br&gt;- Web, Web Framework, Rails&lt;/td&gt;
&lt;td&gt;Fast web framework compatible with Rails.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/rage-rb/rage" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/rage-rb/rage" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F80786585%3Fv%3D4%26s%3D40" alt="maybe logo"&gt; &lt;strong&gt;26.5k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;maybe&lt;/strong&gt; &lt;br&gt;- Finance, Nextjs, personal-finance, React, NodeJS&lt;/td&gt;
&lt;td&gt;The OS for your personal finances&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/maybe-finance/maybe" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://maybe.co" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/maybe" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F61755974%3Fv%3D4%26s%3D40" alt="Amazing Print logo"&gt; &lt;strong&gt;0.7k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Amazing Print&lt;/strong&gt; &lt;br&gt;- pretty-print, terminal tools&lt;/td&gt;
&lt;td&gt;Pretty print your Ruby objects with style -- in full color and with proper indentation&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/amazing-print/amazing_print" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/amazing_print" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F111233186%3Fv%3D4%26s%3D40" alt="phlex logo"&gt; &lt;strong&gt;1.1k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;phlex&lt;/strong&gt; &lt;br&gt;- Template engine, Ruby, view-components, UI Components, phlex&lt;/td&gt;
&lt;td&gt;A framework for building object-oriented views in Ruby.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/phlex-ruby/phlex" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.phlex.fun" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.phlex.fun/" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/phlex" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F13131%3Fv%3D4%26s%3D40" alt="console1984 logo"&gt; &lt;strong&gt;0.6k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;console1984&lt;/strong&gt; &lt;br&gt;- Privacy, Security, Rails&lt;/td&gt;
&lt;td&gt;The Rails console you love, 1984 style&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/basecamp/console1984" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/console1984" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F62706925%3Fv%3D4%26s%3D40" alt="endoflife.date logo"&gt; &lt;strong&gt;2.2k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;endoflife.date&lt;/strong&gt; &lt;br&gt;- eol, end-of-life, release-schedule, release-policy, Windows&lt;/td&gt;
&lt;td&gt;Informative site with EoL dates of everything&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/endoflife-date/endoflife.date" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://endoflife.date" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/endoflife.date" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F5784215%3Fv%3D4%26s%3D40" alt="sidekiq-throttled logo"&gt; &lt;strong&gt;0.7k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;sidekiq-throttled&lt;/strong&gt; &lt;br&gt;- Sidekiq, Throttling, Concurrency, threshold&lt;/td&gt;
&lt;td&gt;Concurrency and rate-limit throttling for Sidekiq&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/ixti/sidekiq-throttled" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/sidekiq-throttled" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F6183%3Fv%3D4%26s%3D40" alt="ruby-science logo"&gt; &lt;strong&gt;0.5k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ruby-science&lt;/strong&gt; &lt;br&gt;- Book&lt;/td&gt;
&lt;td&gt;The reference for writing fantastic Rails applications&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/thoughtbot/ruby-science" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/ruby-science" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F191455%3Fv%3D4%26s%3D40" alt="ronin logo"&gt; &lt;strong&gt;0.6k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ronin&lt;/strong&gt; &lt;br&gt;- Security, Ruby, Hacking, Infosec, ctf-tools&lt;/td&gt;
&lt;td&gt;Ronin is a Free and Open Source Ruby Toolkit for Security Research and Development. Ronin also allows for the rapid development and distribution of code, exploits, payloads, etc, via 3rd party git repositories.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/ronin-rb/ronin" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://ronin-rb.dev" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://ronin-rb.dev/docs/" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/ronin-rb/ronin" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F84705953%3Fv%3D4%26s%3D40" alt="motor-admin-rails logo"&gt; &lt;strong&gt;0.7k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;motor-admin-rails&lt;/strong&gt; &lt;br&gt;- Admin Interface, Rails, Admin, Crud, Business Intelligence&lt;/td&gt;
&lt;td&gt;Low-code Admin panel and Business intelligence Rails engine. No DSL - configurable from the UI. Rails Admin, Active Admin, Blazer modern alternative.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/motor-admin/motor-admin-rails" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://app.getmotoradmin.com/demo/" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/motor-admin-rails" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F1898541%3Fv%3D4%26s%3D40" alt="heya logo"&gt; &lt;strong&gt;0.7k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;heya&lt;/strong&gt; &lt;br&gt;- Email, Rails, email-marketing, actionmailer&lt;/td&gt;
&lt;td&gt;Heya 👋 is a campaign mailer for Rails. Think of it like ActionMailer, but for timed email sequences. It can also perform other actions like sending a text message.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/honeybadger-io/heya" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.heya.email" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/heya" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F13131%3Fv%3D4%26s%3D40" alt="kamal logo"&gt; &lt;strong&gt;9.0k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;kamal&lt;/strong&gt; &lt;br&gt;- Deploy, Rails, Docker, Ops&lt;/td&gt;
&lt;td&gt;Deploy web apps anywhere.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/basecamp/kamal" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://kamal-deploy.org" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/kamal" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F66615189%3Fv%3D4%26s%3D40" alt="Avo logo"&gt; &lt;strong&gt;1.4k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Avo&lt;/strong&gt; &lt;br&gt;- Admin Interface, Rails, Ruby, Admin, Crud&lt;/td&gt;
&lt;td&gt;Build Ruby on Rails apps 10x faster&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/avo-hq/avo" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://avohq.io" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://docs.avohq.io" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/avo-hq/avo" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F58169103%3Fv%3D4%26s%3D40" alt="Postal logo"&gt; &lt;strong&gt;14.1k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Postal&lt;/strong&gt; &lt;br&gt;- Communication systems, Email, Mail Transfer Agents, Ruby, Mail&lt;/td&gt;
&lt;td&gt;📮 A fully featured open source mail delivery platform for incoming &amp;amp; outgoing e-mail&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/postalserver/postal" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://postalserver.io" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/postal" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F60340119%3Fv%3D4%26s%3D40" alt="ferrum logo"&gt; &lt;strong&gt;1.6k&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;ferrum&lt;/strong&gt; &lt;br&gt;- Chrome, Chromium, Headless, headless-chrome, Web&lt;/td&gt;
&lt;td&gt;Headless Chrome Ruby API&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/rubycdp/ferrum" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;, &lt;a href="https://ferrum.rubycdp.com" rel="noopener noreferrer"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/ferrum" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>ruby</category>
      <category>programming</category>
    </item>
    <item>
      <title>Top 10 Trending Python Libraries in April 2024</title>
      <dc:creator>Stan Bright</dc:creator>
      <pubDate>Tue, 23 Apr 2024 00:40:22 +0000</pubDate>
      <link>https://dev.to/libhunt/top-10-trending-python-libraries-in-april-2024-4l0j</link>
      <guid>https://dev.to/libhunt/top-10-trending-python-libraries-in-april-2024-4l0j</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffuly9rw5plwe1a3cobha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffuly9rw5plwe1a3cobha.png" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hey mates,&lt;/p&gt;

&lt;p&gt;I'm sharing the list of the top trending Python libraries from &lt;a href="https://www.libhunt.com/l/python"&gt;LibHunt Python&lt;/a&gt;. This should help you find something new and useful. As expected, almost everything is &lt;a href="https://www.libhunt.com/l/python/topic/ai"&gt;AI&lt;/a&gt; related. AI is here to stay, and that's what almost everyone is raving after.&lt;/p&gt;

&lt;p&gt;Is there a library you'd like being added here? Something that's been on your radar for the last few months that was growing fast.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Stars&lt;/th&gt;
&lt;th&gt;Resources&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;R2R&lt;/strong&gt; - AI, LLM&lt;/td&gt;
&lt;td&gt;The framework for fast development and deployment of RAG backends.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;1&lt;/strong&gt;.2k&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/SciPhi-AI/R2R"&gt;Repo&lt;/a&gt;, &lt;a href="https://r2r-docs.sciphi.ai/"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/SciPhi-AI/R2R"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;ingestr&lt;/strong&gt; - DB tools&lt;/td&gt;
&lt;td&gt;ingestr is a CLI tool to copy data between any databases with a single command seamlessly. (by bruin-data)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;2&lt;/strong&gt;.3k&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/bruin-data/ingestr"&gt;Repo&lt;/a&gt;, &lt;a href="https://bruin-data.github.io/ingestr/"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/ingestr"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;dbrx&lt;/strong&gt; - LLM, Gen-AI&lt;/td&gt;
&lt;td&gt;Code examples and resources for DBRX, a large language model developed by Databricks (by databricks)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;2&lt;/strong&gt;.3k&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/databricks/dbrx"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.databricks.com/"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/dbrx"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;hatchet&lt;/strong&gt; - Queue, Backend&lt;/td&gt;
&lt;td&gt;A distributed, fault-tolerant task queue (by hatchet-dev)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;2&lt;/strong&gt;.7k&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/hatchet-dev/hatchet"&gt;Repo&lt;/a&gt;, &lt;a href="https://hatchet.run/"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/hatchet"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;OpenDevin&lt;/strong&gt; - AI&lt;/td&gt;
&lt;td&gt;An autonomous AI software engineer who is capable of executing complex engineering tasks and collaborating actively with users on software development projects.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;22&lt;/strong&gt;.1k&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/OpenDevin/OpenDevin"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/OpenDevin"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;llama_parse&lt;/strong&gt; - AI, RAG&lt;/td&gt;
&lt;td&gt;Parse files for optimal RAG&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0&lt;/strong&gt;.8k&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/run-llama/llama_parse"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.llamaindex.ai/"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/llama_parse"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;great-tables&lt;/strong&gt; - Tables, Data presentation&lt;/td&gt;
&lt;td&gt;Easily generate information-rich, publication-quality tables from Python&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;1&lt;/strong&gt;k&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/posit-dev/great-tables"&gt;Repo&lt;/a&gt;, &lt;a href="https://posit-dev.github.io/great-tables/articles/intro.html"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/great-tables"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;MGM&lt;/strong&gt; - AI, Language Models&lt;/td&gt;
&lt;td&gt;Official repo for "Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models"&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;2&lt;/strong&gt;.8k&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/dvlab-research/MGM"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/MGM"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;PyRIT&lt;/strong&gt; - AI, Generative-Ai&lt;/td&gt;
&lt;td&gt;The Python Risk Identification Tool for generative AI (PyRIT) is an open access automation framework to empower security professionals and machine learning engineers to proactively find risks in their generative AI systems. (by Azure)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;1&lt;/strong&gt;.3k&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/Azure/PyRIT"&gt;Repo&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/Azure/PyRIT"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;niquests&lt;/strong&gt; - HTTP&lt;/td&gt;
&lt;td&gt;Requests but with HTTP/3, HTTP/2, Multiplexed Connections, System CAs, Certificate Revocation, DNS over HTTPS / TLS / QUIC or UDP, Async, DNSSEC, and (much) pain removed!&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0&lt;/strong&gt;.7k&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/jawah/niquests"&gt;Repo&lt;/a&gt;, &lt;a href="https://niquests.readthedocs.io/en/latest/"&gt;Web&lt;/a&gt;, &lt;a href="https://www.libhunt.com/r/niquests"&gt;Alternatives&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to steal a website and how to prevent it</title>
      <dc:creator>Stan Bright</dc:creator>
      <pubDate>Tue, 13 Dec 2022 03:23:56 +0000</pubDate>
      <link>https://dev.to/saashub/how-to-steal-a-website-12p7</link>
      <guid>https://dev.to/saashub/how-to-steal-a-website-12p7</guid>
      <description>&lt;p&gt;OK, this is going to be a quick showcase of how someone proxy-mirrored my website in a way that is very difficult to detect or prevent it. Moreover, I will share some of the helpful advice that was received from the Hacker News and /r/sysadmin communities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here it is the case
&lt;/h2&gt;

&lt;p&gt;I noticed yesterday that one of my websites, &lt;a href="https://www.saashub.com" rel="noopener noreferrer"&gt;SaaSHub&lt;/a&gt;, is not present on bing.com; however, its content is being served on a different and very suspicious domain name - &lt;a href="https://www.bing.com/search?q=site%3Asukuns.us.to" rel="noopener noreferrer"&gt;sukuns.us.to&lt;/a&gt;. And, of course, I started digging my nginx logs - grepping for that domain name. All I could find was that domain name appearing as the referrer when accessing some images. Then, suspecting what might be going on, I started accessing some unpopular pages (on their domain name) and monitoring the logs for them. All requests to my server were coming from different IPs located in the US but with my browser's User-Agent. At that point, I was pretty sure what was happening - someone was proxy-mirroring SaaSHub and serving it on-demand on their domain name.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2fghvxxcy77px2u2tr4l.png" rel="noopener noreferrer"&gt;Here it is a simplified diagram of the case&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I started thinking, brainstorming and searching for some generic advice on what I could do to prevent this...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1 - block their IP&lt;/strong&gt;. Unfortunately, that's not very effective in general, as they could easily change their IP address. What is more, in this particular case, they are using a very wide range of IPs coming from a variety of different ASNs (some of the cases I caught - AS55081, 35913, 36352, 21769, 52393, 394814, 55286). What is more, at first glance, collecting those IPs and ASNs isn't a trivial/quick task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2 - block them by user-agent&lt;/strong&gt; - Again, not an option as they are copying the user-agent of the user making the request on their domain-name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 3 - add a small piece of JavaScript that checks for the domain name, and if not &lt;a href="http://www.saashub.com" rel="noopener noreferrer"&gt;www.saashub.com&lt;/a&gt; - redirect to it&lt;/strong&gt;. This isn't a viable option in this case as the perpetrator is stripping all &lt;code&gt;&amp;lt;javascript&amp;gt;&lt;/code&gt; tags and files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 4 - use absolute URLs everywhere&lt;/strong&gt;. Well, they are rewriting all mentions of &lt;a href="http://www.saashub.com" rel="noopener noreferrer"&gt;www.saashub.com&lt;/a&gt; in links to their own domain name. So that doesn't seem like an option, too.&lt;/p&gt;

&lt;p&gt;At that point, I felt helpless and asked for help on &lt;a href="https://news.ycombinator.com/item?id=33952114" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt; &amp;amp; &lt;a href="https://old.reddit.com/r/sysadmin/comments/zjs60m/someone_is_proxymirroring_my_website_can_i_do/" rel="noopener noreferrer"&gt;/r/sysadmin&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Possible solutions and advice
&lt;/h2&gt;

&lt;p&gt;i.e. what can you do if this happens to you... based on the suggestions and advice that I received on HN &amp;amp; /r/sysadmin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) File a DMCA to their host&lt;/strong&gt;. I've sent a request to their free domain name provider so far.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) Covert the whole website to JavaScript&lt;/strong&gt;. Yup, that would work, but then no one without JS would be able to open SaaSHub, I'm guessing SEO will suffer too. So, this is not a path I'd like to take.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) Block all images being accessed with a referrer that's not the expected domain name&lt;/strong&gt; - I haven't implemented this one yet, but this could actually work in a generic way. I'm keeping this one in my toolbox of viable options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4) Implement a honey-trap URL so that all their IPs could be exposed and blocked&lt;/strong&gt;. This could work as well. "All" you have to do is add an endpoint that is not accessible by normal users - e.g. /honeytrap?some-random-param=rand-number (Note: you need the randomness as the culprit is loading each page once only and caching it after that). Then, add a cron script that will call that end-point on the proxy-mirror domain name and expose all their IPs. That way, we can block them in a relatively automated manner (as long as we know their domain name).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5) Add some hidden and random text to your pages&lt;/strong&gt;. Why? So that you can search for that text later on and find out all the domain names that mirror your content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moral of the story
&lt;/h2&gt;

&lt;p&gt;We are not absolutely helpless! It is unfortunate that we have to deal with it, but, as they say - it is what it is. At least we have a small toolbox of viable options on how to react and what we can try out. &lt;/p&gt;

&lt;p&gt;Also, I guess there could be other things and means available to prevent and mitigate similar vicious actions. I'd be happy if you shared your experience and solutions in the comments here. You can find more advice within the discussions linked above, too. Nevertheless, whatever we (you and I) decide to do in similar cases, it's always a difficult and time-consuming battle. And I believe that bringing some awareness to this might help others resolve it quicker than I.&lt;/p&gt;

&lt;p&gt;As of now, I think that the report to their free DNS provider has worked out, as their domain-name is not responding to an actual IP anymore. I will have to work on #5 from above, though, so that I can know when they move to a new domain-name.&lt;/p&gt;

&lt;p&gt;p.s. if someone working at Microsoft or Bing is reading this, please could you help get &lt;a href="https://www.saashub.com" rel="noopener noreferrer"&gt;SaaSHub&lt;/a&gt; indexed instead of the fake mirror sukuns.us.to. Thanks 🙇!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>security</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>A convenient method to find alternatives to almost any popular open-source project</title>
      <dc:creator>Stan Bright</dc:creator>
      <pubDate>Tue, 17 Aug 2021 00:54:19 +0000</pubDate>
      <link>https://dev.to/stanbright/the-easiest-way-to-find-alternatives-to-almost-any-popular-open-source-project-2c1n</link>
      <guid>https://dev.to/stanbright/the-easiest-way-to-find-alternatives-to-almost-any-popular-open-source-project-2c1n</guid>
      <description>&lt;p&gt;I've been improving the new version of &lt;a href="https://www.libhunt.com"&gt;LibHunt&lt;/a&gt; here and there for the last several months, and I think I've reached a reasonably presentable version. As a software dev myself, I'm looking for alternatives to the libraries I use quite often. Of course, I've been "eating my own dog food" and using LibHunt to find alternatives. What I had been doing is using the regular search function. I'd copy the name of the library from github, paste it in LibHunt's search box, and click on the first result in most cases. That has been working pretty well, yet it felt a bit cumbersome. &lt;/p&gt;

&lt;p&gt;This morning I had the following idea. Given that most popular open-source projects are hosted GitHub, and I'm already tracking them, I could support a similar URL schema in LibHunt so that the only difference from GitHub is the domain name. I got it implemented, tested and deployed in less than half an hour. So simple, and it saves all the copy-pasting, clicking and searching.&lt;/p&gt;

&lt;p&gt;Now, if you are looking for alternatives to a popular open-source project, I strongly believe that the quickest and most convenient solution is LibHunt.&lt;/p&gt;

&lt;p&gt;All you have to do is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a project on GitHub (e.g. &lt;a href="https://github.com/facebook/react"&gt;https://github.com/facebook/react&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Replace "&lt;strong&gt;github&lt;/strong&gt;" with "&lt;strong&gt;libhunt&lt;/strong&gt;" in the URL&lt;/li&gt;
&lt;li&gt;Hit enter 🚀&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As of now, the lists with alternatives (and similar projects) on LibHunt are based on three factors:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The projects were mentioned on common posts on Reddit, HackerNews, and dev.to (mentions are monitored almost in real-time)&lt;/li&gt;
&lt;li&gt;User suggested alternatives (directly on LibHunt)&lt;/li&gt;
&lt;li&gt;Users comparing projects on LibHunt&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Of course, these factors and methods are not perfect. However, they work pretty well in most cases. And as more people suggest alternatives and more posts from around the net are tracked, the quality of the lists will only improve.&lt;/p&gt;

&lt;p&gt;I hope this will be helpful to many of you fellow devs.&lt;/p&gt;

&lt;p&gt;Stan 🙇&lt;/p&gt;

&lt;p&gt;p.s. as always, any feedback is highly appreciated.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>github</category>
    </item>
    <item>
      <title>How to speed up your Ruby/Rails app by ~5% with zero efforts</title>
      <dc:creator>Stan Bright</dc:creator>
      <pubDate>Mon, 04 May 2020 06:07:33 +0000</pubDate>
      <link>https://dev.to/saashub/how-to-speed-up-your-ruby-rails-app-by-5-with-zero-efforts-56mc</link>
      <guid>https://dev.to/saashub/how-to-speed-up-your-ruby-rails-app-by-5-with-zero-efforts-56mc</guid>
      <description>&lt;p&gt;This is going to be a quick one. Yet I think it might be helpful to almost everyone using ruby. A few days ago, I learned about a gem by Shopify - &lt;a href="https://github.com/Shopify/symbol-fstring"&gt;symbol-fstring&lt;/a&gt;. Thank you &lt;a href="https://twitter.com/strzibnyj/status/1256056172609630208"&gt;@strzibnyj&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It does something very simple - very well: &lt;strong&gt;Access symbols internal strings without duplicating them&lt;/strong&gt;. Why is that important?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In Ruby many APIs tend to accept symbols, but regularly convert them to string internally. The typical example is ActiveSupport::HashWithIndifferentAccess, but there are plenty more.&lt;/p&gt;

&lt;p&gt;The problem with this is that Symbol#to_s creates a new string every time it is invoked, and since it often happens in hotspots, it causes a lot of work for the garbage collector, and cause many identical strings to be kept in memory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To activate the gem in an app, all you need is adding the gem to your Gemfile and requiring the "patch".&lt;/p&gt;

&lt;p&gt;e.g. &lt;code&gt;gem 'symbol-fstring', require: 'fstring/all'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That's all. SaaSHub has been running with it for 3 days now, and there haven't been any unexpected issues. Based on my rough benchmarks, a typical page like "&lt;a href="https://www.saashub.com/basecamp-alternatives"&gt;basecamp alternatives&lt;/a&gt;" responds about 5% faster and allocates about 5% fewer objects. &lt;/p&gt;

&lt;p&gt;I know, 5% isn't that much, yet it's "FREE". Moreover, this gem is maintained by a billion-dollar company, Shopify, popular with its high-quality dev standards. So, I guess it is both safe and worth it giving it a go.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>Cloudflare replaced reCAPTCHA with hCaptcha. I followed their example. It took me 18 min.</title>
      <dc:creator>Stan Bright</dc:creator>
      <pubDate>Fri, 10 Apr 2020 02:25:20 +0000</pubDate>
      <link>https://dev.to/stanbright/cloudflare-replaced-recaptcha-with-hcaptcha-i-followed-their-example-it-took-me-18-min-1ipn</link>
      <guid>https://dev.to/stanbright/cloudflare-replaced-recaptcha-with-hcaptcha-i-followed-their-example-it-took-me-18-min-1ipn</guid>
      <description>&lt;p&gt;Cloudflare announced yesterday that they are moving away from Google's &lt;a href="https://www.google.com/recaptcha/intro/v3.html"&gt;reCAPTCHA&lt;/a&gt; in favour of &lt;a href="https://www.hcaptcha.com/"&gt;hCaptcha&lt;/a&gt;. In my opinion, that is huge! Given the amount of traffic transiting through CloudFlare. That has cut some significant level of vision from Google's all-seeing and tracking eye. Moreover, they are giving a good example for others to follow. &lt;/p&gt;

&lt;p&gt;I'd be happy to be amongst their &lt;a href="https://www.youtube.com/watch?v=fW8amMCVAJQ"&gt;first followers ▶&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Immediately after reading their article, I set my next to-do: "Replace Google's reCAPTCHA with hCaptcha on LibHunt". For those that don't know, LibHunt is a small network of websites (e.g. &lt;a href="https://ruby.libhunt.com"&gt;ruby.libhunt.com&lt;/a&gt;) focussed on different programming languages and tech in general. One of the features is allowing people to share links to their blog-posts (e.g. this one). All good, but historically, I have had a lot of issues with SPAM and dealing with it. Of course, one of the measures I've implemented is including a "captcha" - and more specifically, Google's reCAPTCHA. That has helped. However, I've always been a bit sceptical in pouring even more data into Google's hands. That's also why I didn't implement reCAPTCHA v3 (which is expected to be installed side-wide 🙀) but stayed with the older v2. (please, let's not involve Google Analytics now, I'd be happy to replace that too, but I can't as of now).&lt;/p&gt;

&lt;p&gt;I also decided to note down the process so that I can share my experience. Well, it was easier and more straight-forward than I expected. It took me about 18 mins altogether. ~3 min reg + browsing around; ~10 min reading the docs and replacing "recaptcha" code and configs with "hcaptcha". ~5 min manually testing. There weren't any unexpected bits. It is almost a direct replacements. Literally. All the methods and functions are the same. You have to update your configs, a few param names and some links only.&lt;/p&gt;

&lt;p&gt;These are all the essential changes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update your site and secret keys&lt;/li&gt;
&lt;li&gt;Post data to &lt;strong&gt;&lt;a href="https://hcaptcha.com/siteverify"&gt;https://hcaptcha.com/siteverify&lt;/a&gt;&lt;/strong&gt; instead of to &lt;strong&gt;&lt;a href="https://www.google.com/recaptcha/api/siteverify"&gt;https://www.google.com/recaptcha/api/siteverify&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Load scripts from &lt;strong&gt;&lt;a href="https://hcaptcha.com/1/api.js"&gt;https://hcaptcha.com/1/api.js&lt;/a&gt;&lt;/strong&gt; instead of &lt;strong&gt;&lt;a href="https://www.google.com/recaptcha/api.js"&gt;https://www.google.com/recaptcha/api.js&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Replace "g-recaptcha" div with "h-captcha" (that includes the site key)&lt;/li&gt;
&lt;li&gt;Replace a div's class: from "g-recaptcha" to "h-captcha"&lt;/li&gt;
&lt;li&gt;Google is passing back "g-recaptcha-response" param, while hCaptcha is returning "h-captcha-response". So, use that param to validate results and the newly configured secret key.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's all.&lt;/p&gt;

&lt;p&gt;What is more, when people solve captchas on your website, you are supposed to earn some crypto coins - HMT (The HUMAN Token®). To be honest, I hadn't heard about it and couldn't find much info about it apart from what's on hcaptcha's website. What I found was references to some other token "Hamster Marketplace Token" :D. Anyways, I guess we are not in it for the crypto tokens. Although, I can imagine that if you run a very busy website, it could add up 🤷‍♂️. You also have the option to donate all your earnings from people solving captchas to Wikimedia foundation, which is an honourable. I guess many people will do that.&lt;/p&gt;

&lt;p&gt;To summarise the process of &lt;strong&gt;migrating from reCaptcha to hCaptha&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;👌 It's super easy, straightforward and shouldn't take you more than 20-40 minutes&lt;/li&gt;
&lt;li&gt;👁 You are feeding less data to Google&lt;/li&gt;
&lt;li&gt;💸 You earn crypto/money (I have no idea what's the potential though)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My advice: go for it!&lt;/p&gt;

&lt;p&gt;p.s. as another means to spread hCaptcha, I will be featuring and promoting it on one of my other websites - SaaSHub&lt;br&gt;
p.p.s. you can find more &lt;a href="https://www.saashub.com/recaptcha-alternatives"&gt;reCaptcha Alternatives on SaaSHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>recaptcha</category>
      <category>hcaptcha</category>
      <category>spam</category>
    </item>
    <item>
      <title>Replacing React with Preact. It was easy and worth it.</title>
      <dc:creator>Stan Bright</dc:creator>
      <pubDate>Fri, 17 Jan 2020 10:47:35 +0000</pubDate>
      <link>https://dev.to/saashub/replacing-react-with-preact-it-was-easy-and-worth-it-1fb0</link>
      <guid>https://dev.to/saashub/replacing-react-with-preact-it-was-easy-and-worth-it-1fb0</guid>
      <description>&lt;p&gt;I had been considering &lt;a href="https://preactjs.com/"&gt;preact&lt;/a&gt; for quite some time. After all, the sell is easy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100% compatible with the React ecosystem (kind of)&lt;/li&gt;
&lt;li&gt;Much smaller (js bundle size)&lt;/li&gt;
&lt;li&gt;Faster (performance)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;About two years ago, I went to a local meet-up in Sydney where the presenter was sharing how they were integrating Preact successfully in some parts of Qantas. That was interesting. And he was convincing. Yet, given that everyone is using React, I thought it was a daunting task and never put the time to research it further. Until recently.&lt;/p&gt;

&lt;p&gt;I was working on optimizing the page-load speed of SaaSHub, and one of the paths was decreasing the JS bundle size. I played a bit with &lt;strong&gt;webpack-bundle-analyzer&lt;/strong&gt; and &lt;strong&gt;source-map-explorer&lt;/strong&gt;, and it was apparent that 35% of all the libs were taken by React &amp;amp; react-select. Then I remembered &lt;strong&gt;preact&lt;/strong&gt;... and decided to review it again.&lt;/p&gt;

&lt;p&gt;It happened that that task was more scary than difficult. After going through the docs, the whole switch to preact consisted of adding it to &lt;strong&gt;packages.json&lt;/strong&gt;, adding the relevant aliasing to webpack's build configs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alias&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&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="s2"&gt;preact/compat&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="s2"&gt;react-dom/test-utils&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="s2"&gt;preact/test-utils&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="s2"&gt;react-dom&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="s2"&gt;preact/compat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// Must be below test-utils&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;environment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and importing 'preact/debug' somewhere in the app:&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;import 'preact/debug'&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;That was all. So simple. Everything worked without touching another line of code. Of course, the process could be more complicated for web apps with more sophisticated code.&lt;/p&gt;

&lt;p&gt;What are the benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.saashub.com"&gt;SaaSHub&lt;/a&gt;'s JS bundle file-size decreased with 20%: from 577k down to 460k&lt;/li&gt;
&lt;li&gt;Faster JS (although I haven't benchmarked that, neither have felt it being slow)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the end, if you are working on optimizing your JS, and you don't have super complicated setup, I'd highly recommend giving &lt;strong&gt;preact&lt;/strong&gt; a go. It might be easier than you think.&lt;/p&gt;

&lt;p&gt;p.s. the next step will be replacing &lt;strong&gt;react-select&lt;/strong&gt; with &lt;a href="https://github.com/downshift-js/downshift"&gt;downshift&lt;/a&gt;. I've already implemented one small component with it, and it is amazing. Unfortunately, that migration will require a lot more code changes.&lt;/p&gt;

</description>
      <category>react</category>
      <category>preact</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Postgres Trigram indexes VS Algolia</title>
      <dc:creator>Stan Bright</dc:creator>
      <pubDate>Mon, 19 Aug 2019 09:06:23 +0000</pubDate>
      <link>https://dev.to/saashub/postgres-trigram-indexes-vs-algolia-1oma</link>
      <guid>https://dev.to/saashub/postgres-trigram-indexes-vs-algolia-1oma</guid>
      <description>&lt;p&gt;I want to share my experience of using the native "trigram indexes" of Postgres to achieve a robust "typeahead/autocomplete/fuzzy search" functionality. I am using Algolia as an example, as I have noticed that a lot of people are using it precisely for that. Yet, I believe that you could do perfectly fine by using only Postgres in many situations.&lt;/p&gt;

&lt;p&gt;What are trigram indexes? They are a special type of index in Postgres that is available by default; however, they have to be explicitly enabled. Here it is an extract from the &lt;a href="https://www.postgresql.org/docs/9.6/pgtrgm.html"&gt;official docs&lt;/a&gt;: &lt;/p&gt;

&lt;p&gt;&lt;em&gt;"The pg_trgm module provides functions and operators for determining the similarity of alphanumeric text based on trigram matching, as well as index operator classes that support fast searching for similar strings.", "A trigram is a group of three consecutive characters taken from a string."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For example, the set of trigrams in the string "cat" is " c", " ca", "cat", and "at ". The set of trigrams in the string "foo|bar" is " f", " fo", "foo", "oo ", " b", " ba", "bar", and "ar ".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now let's follow what's necessary to build our autocomplete engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  1) Enable the Postgres extension
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;CREATE EXTENSION IF NOT EXISTS pg_trgm&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2) Index the columns you are going to query
&lt;/h2&gt;

&lt;p&gt;Once you have enabled &lt;code&gt;pg_trgm&lt;/code&gt; you have to index &lt;code&gt;varchar&lt;/code&gt; and &lt;code&gt;text&lt;/code&gt; columns to make use of it. e.g. &lt;code&gt;CREATE INDEX index_fuzzy_searches_on_name_trgm ON fuzzy_searches USING gin(name gin_trgm_ops)&lt;/code&gt;. Notice &lt;strong&gt;USING gin(name gin_trgm_ops)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we have very fast &lt;code&gt;LIKE&lt;/code&gt; queries with leading and trailing wild cards (&lt;code&gt;%&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  3) Prepare the query
&lt;/h2&gt;

&lt;p&gt;The next step is splitting the user query by spaces and adding a separate &lt;strong&gt;WHERE&lt;/strong&gt; clause per name. For example, if a user searches for "sales cloud". We'd end up with a query like &lt;code&gt;SELECT * FROM mytable WHERE name LIKE '%sales%' AND name LIKE '%cloud%'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A simplified implementation in Ruby on Rails could look like (in this case &lt;code&gt;ServiceSearch&lt;/code&gt; would be MATERIALIZED VIEW that I will explain down the post):&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;relation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ServiceSearch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;popular_first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;relation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;relation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"content LIKE ?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"%&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;relation&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4) Search for different types of records simultaneously
&lt;/h2&gt;

&lt;p&gt;One of the use cases of using a dedicated full-text search engine is querying all your records simultaneously. That could be achieved through a &lt;em&gt;MATERIALIZED VIEW&lt;/em&gt;. Moreover, you can easily give priority to some records. For example, showing Products before Categories. I am managing my views by the awesome &lt;a href="https://ruby.libhunt.com/scenic-alternatives"&gt;scenic gem&lt;/a&gt;, but you don't need to.&lt;/p&gt;

&lt;p&gt;Here it is the body of an exemplary materialized view:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;searchable_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'Service'&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;searchable_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;post_services_count&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;LOWER&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="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'approved'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'closed'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;UNION&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;searchable_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'Category'&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;searchable_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&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;weight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;LOWER&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="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;categorizations&lt;/span&gt; &lt;span class="n"&gt;cats&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;cats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'approved'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By having a view like that one, we can query multiple records with something as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;fuzzy_searches&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'%test%'&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real-world examples
&lt;/h2&gt;

&lt;p&gt;One of the top competitors of &lt;a href="https://www.saashub.com"&gt;SaaSHub&lt;/a&gt; - &lt;a href="https://alternativeto.net"&gt;alternativeto.net&lt;/a&gt; is using Algolia for their search autocomplete. I'd suggest testing their search and SaaSHub's. You won't find many differences in the UX or speed. &lt;/p&gt;

&lt;p&gt;In the end, if you need a simple autocomplete functionality for your project, and you are using Postgres, my suggestion is to consider its &lt;strong&gt;trigram&lt;/strong&gt; indexes + materialized views. Reaching out to external services may not be necessary and could be an overkill. However, I'm sure that there will be many cases in which it will make sense to pay for a professional SaaS product.&lt;/p&gt;




&lt;p&gt;p.s. you can find more &lt;a href="https://www.saashub.com/algolia-alternatives"&gt;Algolia alternatives&lt;/a&gt; on SaaSHub 🙈.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>postgres</category>
      <category>ruby</category>
    </item>
  </channel>
</rss>
