<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Articles | Coders' Compass Publishing</title><link>https://coderscompass.org/articles/</link><description>A list of articles published by Coders' Compass.</description><language>en-gb</language><copyright>Coders' Compass Publishing</copyright><generator>Hugo -- gohugo.io</generator><lastBuildDate>Mon, 19 Jan 2026 17:57:30 +0530</lastBuildDate><atom:link href="https://coderscompass.org/articles/index.xml" rel="self" type="application/rss+xml"/><item><title>SearXNG: Self-Hosted Private Search Aggregator</title><link>https://coderscompass.org/articles/searxng-self-hosted-private-search-aggregator/</link><guid isPermaLink="true">https://coderscompass.org/articles/searxng-self-hosted-private-search-aggregator/</guid><pubDate>Mon, 19 Jan 2026 17:57:30 +0530</pubDate><dc:creator>Subhomoy Haldar</dc:creator><description>Self-host SearXNG, a metasearch engine aggregating results from multiple engines. Ad-free results and JSON API for LLM integration.</description><content:encoded>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>&lt;a href="https://github.com/searxng/searxng">SearXNG&lt;/a> is a free, open-source metasearch engine that aggregates results from over 70 search engines while respecting your privacy. Unlike traditional search engines, SearXNG doesn’t track your searches, build a profile on you, or serve you advertisements.&lt;/p>
&lt;p>When you use popular search engines like Google or Bing, your queries are logged, analysed, and used to build an advertising profile. Even privacy-focused alternatives like DuckDuckGo are proprietary and require trust in a third party. By self-hosting SearXNG, you take complete control over your search experience. Your queries stay on your server, and you can verify exactly what the software does by examining the &lt;a href="https://github.com/searxng/searxng">source code&lt;/a>.&lt;/p>
&lt;p>One particularly useful feature is SearXNG’s ability to output results as JSON. This makes it an excellent tool for integrating web search capabilities into local LLM applications like Open WebUI, with no need for API keys or worrying about rate limits.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.docker.com/get-started/get-docker/">Docker&lt;/a> version 20.10 or later installed on your system. Newer versions of Docker include the Docker Compose plugin.&lt;/li>
&lt;li>A Linux server (Debian or Ubuntu recommended) or any system capable of running Docker containers.&lt;/li>
&lt;li>Basic familiarity with the terminal.&lt;/li>
&lt;/ul>
&lt;h2 id="verification">Verification&lt;/h2>
&lt;p>Before proceeding with the installation, verify that Docker is installed.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-0-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1">1&lt;/a>&lt;/span>&lt;span>docker --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You should see output similar to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-1-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1">1&lt;/a>&lt;/span>&lt;span>Docker version 29.0.1, build eedd9698e9
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Verify Docker Compose is installed:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-2-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-1">1&lt;/a>&lt;/span>&lt;span>docker compose version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Expected output:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-3-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-1">1&lt;/a>&lt;/span>&lt;span>Docker Compose version 2.40.3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="installation">Installation&lt;/h2>
&lt;p>SearXNG uses Redis (or Valkey, a Redis-compatible alternative) for cacheing and rate limiting. The Docker Compose configuration below sets up both services.&lt;/p>
&lt;p>Choose or create an appropriate directory, such as &lt;code>~/self-hosting/searxng&lt;/code>.&lt;/p>
&lt;p>Create a &lt;code>docker-compose.yaml&lt;/code> file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#1"> 1&lt;/a>&lt;/span>&lt;span>&lt;span style="color:#ca9ee6">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="2">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#2"> 2&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">redis&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="3">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#3"> 3&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: redis
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="4">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#4"> 4&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: docker.io/valkey/valkey:8-alpine
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="5">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#5"> 5&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">command&lt;/span>: &amp;gt;-&lt;span style="color:#737994">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="6">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#6"> 6&lt;/a>&lt;/span>&lt;span>&lt;span style="color:#737994"> valkey-server --save 30 1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="7">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#7"> 7&lt;/a>&lt;/span>&lt;span>&lt;span style="color:#737994"> --loglevel warning&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="8">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#8"> 8&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">restart&lt;/span>: unless-stopped
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="9">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#9"> 9&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">networks&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="10">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#10">10&lt;/a>&lt;/span>&lt;span> - searxng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="11">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#11">11&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="12">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#12">12&lt;/a>&lt;/span>&lt;span> - ./data/redis:/data
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="13">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#13">13&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">user&lt;/span>: &lt;span style="color:#a6d189">&amp;#34;1000:1000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="14">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#14">14&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">cap_drop&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="15">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#15">15&lt;/a>&lt;/span>&lt;span> - ALL
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="16">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#16">16&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">cap_add&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="17">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#17">17&lt;/a>&lt;/span>&lt;span> - SETGID
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="18">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#18">18&lt;/a>&lt;/span>&lt;span> - SETUID
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="19">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#19">19&lt;/a>&lt;/span>&lt;span> - DAC_OVERRIDE
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="20">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#20">20&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">logging&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="21">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#21">21&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">driver&lt;/span>: &lt;span style="color:#a6d189">&amp;#34;json-file&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="22">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#22">22&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">options&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="23">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#23">23&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">max-size&lt;/span>: &lt;span style="color:#a6d189">&amp;#34;1m&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="24">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#24">24&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">max-file&lt;/span>: &lt;span style="color:#a6d189">&amp;#34;1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="25">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#25">25&lt;/a>&lt;/span>&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="26">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#26">26&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">searxng&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="27">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#27">27&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: searxng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="28">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#28">28&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: docker.io/searxng/searxng:latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="29">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#29">29&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">restart&lt;/span>: unless-stopped
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="30">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#30">30&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">networks&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="31">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#31">31&lt;/a>&lt;/span>&lt;span> - searxng
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="32">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#32">32&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="33">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#33">33&lt;/a>&lt;/span>&lt;span> - &lt;span style="color:#a6d189">&amp;#34;8080:8080&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="34">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#34">34&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="35">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#35">35&lt;/a>&lt;/span>&lt;span> - ./data/searxng:/etc/searxng:rw
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="36">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#36">36&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="37">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#37">37&lt;/a>&lt;/span>&lt;span> - SEARXNG_BASE_URL=http://localhost:8080/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="38">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#38">38&lt;/a>&lt;/span>&lt;span> - UWSGI_WORKERS=2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="39">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#39">39&lt;/a>&lt;/span>&lt;span> - UWSGI_THREADS=2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="40">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#40">40&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">cap_drop&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="41">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#41">41&lt;/a>&lt;/span>&lt;span> - ALL
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="42">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#42">42&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">cap_add&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="43">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#43">43&lt;/a>&lt;/span>&lt;span> - CHOWN
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="44">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#44">44&lt;/a>&lt;/span>&lt;span> - SETGID
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="45">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#45">45&lt;/a>&lt;/span>&lt;span> - SETUID
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="46">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#46">46&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">logging&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="47">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#47">47&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">driver&lt;/span>: &lt;span style="color:#a6d189">&amp;#34;json-file&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="48">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#48">48&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">options&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="49">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#49">49&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">max-size&lt;/span>: &lt;span style="color:#a6d189">&amp;#34;1m&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="50">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#50">50&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">max-file&lt;/span>: &lt;span style="color:#a6d189">&amp;#34;1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="51">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#51">51&lt;/a>&lt;/span>&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="52">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#52">52&lt;/a>&lt;/span>&lt;span>&lt;span style="color:#ca9ee6">networks&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="53">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#53">53&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">searxng&lt;/span>:
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;blockquote>
&lt;p>&lt;strong>Note&lt;/strong>: Adjust the &lt;code>SEARXNG_BASE_URL&lt;/code> environment variable to match your server’s IP address or hostname. If you’re deploying on a local network, use your server’s IP (e.g., &lt;code>http://192.168.0.90:8080/&lt;/code>). The port mapping can also be customised—change &lt;code>8080:8080&lt;/code> to something like &lt;code>8090:8080&lt;/code> if port 8080 is already in use.&lt;/p>
&lt;/blockquote>
&lt;p>Pull the images and start the containers:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-4-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-1">1&lt;/a>&lt;/span>&lt;span>docker compose pull &lt;span style="color:#99d1db;font-weight:bold">&amp;amp;&amp;amp;&lt;/span> docker compose up -d
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Access SearXNG at &lt;code>http://localhost:8080&lt;/code> (or your configured address).&lt;/p>
&lt;h2 id="https">HTTPS&lt;/h2>
&lt;h3 id="on-private-tailscale-network">On Private Tailscale Network&lt;/h3>
&lt;p>If you want free HTTPS without configuring certificates manually, you can use &lt;a href="https://tailscale.com/kb/1242/tailscale-serve">Tailscale Serve&lt;/a>. After installing Tailscale on your server:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-5-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-1">1&lt;/a>&lt;/span>&lt;span>tailscale serve --bg &lt;span style="color:#ef9f76">8080&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This exposes your SearXNG instance over HTTPS on your Tailscale network.&lt;/p>
&lt;h3 id="on-the-public-internet-with-caddy">On the Public Internet With Caddy&lt;/h3>
&lt;p>If you want to access your SearXNG instance publicly, it is &lt;strong>strongly&lt;/strong> recommended that you use HTTPS. You can achieve this with a reverse proxy like Caddy, especially if you have it &lt;a href="https://github.com/Coders-Compass/caddy-with-ratelimit/">configured with the rate-limit plugin&lt;/a>.&lt;/p>
&lt;h2 id="features-and-use-cases">Features and Use Cases&lt;/h2>
&lt;p>SearXNG offers several interesting advantages over traditional search engines.&lt;/p>
&lt;h3 id="ad-free-search-results">Ad-Free Search Results&lt;/h3>
&lt;p>All search results pass through your server, which means you see the actual results with no sponsored content or advertisements. This alone makes self-hosting worthwhile. You do not need to scroll past &amp;ldquo;promoted results&amp;rdquo; to find what you&amp;rsquo;re actually looking for.&lt;/p>
&lt;p>&lt;img src="https://coderscompass.org/images/articles/searxng/sample-ad-free-search.webp" alt="Ad-free search results showing multiple engine sources" decoding="async">
&lt;/p>
&lt;p>&lt;em>Search results aggregated from Google, Qwant, Startpage, and DuckDuckGo. Completely ad-free.&lt;/em>&lt;/p>
&lt;h3 id="llm-integration-via-json-api">LLM Integration via JSON API&lt;/h3>
&lt;p>SearXNG can output search results as JSON, making it trivial to integrate with local LLM applications. If you’re running &lt;a href="https://github.com/open-webui/open-webui">Open WebUI&lt;/a> or similar tools, you can use SearXNG as a web search backend without:&lt;/p>
&lt;ul>
&lt;li>Paying for API access to search providers&lt;/li>
&lt;li>Managing API keys&lt;/li>
&lt;li>Hitting rate limits&lt;/li>
&lt;/ul>
&lt;p>You can perform a (practically) unlimited number of searches through your own instance. The JSON output (look up how to enable it) includes useful metadata like which engines returned each result, relevance scores, and content snippets.&lt;/p>
&lt;h3 id="aggregated-multi-engine-results">Aggregated Multi-Engine Results&lt;/h3>
&lt;p>Depending on your configuration, SearXNG queries multiple search engines simultaneously and combines the results. This provides several benefits:&lt;/p>
&lt;ul>
&lt;li>Results that are heavily weighted on one engine might not appear prominently on others. Aggregation surfaces these differences.&lt;/li>
&lt;li>You get a more comprehensive view of information.&lt;/li>
&lt;li>If one engine has poor coverage for a topic, others may fill the gap.&lt;/li>
&lt;/ul>
&lt;p>The default configuration queries Google, Bing, DuckDuckGo, Qwant, Startpage, and many others. You can customise which engines to use through the settings interface.&lt;/p>
&lt;h2 id="privacy-considerations">Privacy Considerations&lt;/h2>
&lt;p>While SearXNG prevents search engines from tracking your queries directly, there’s an important caveat: &lt;em>your IP address is still visible to the search engines&lt;/em> when SearXNG queries them on your behalf. This means search providers might still build a profile based on the searches coming from your server’s IP.&lt;/p>
&lt;p>To mitigate this, consider one of the following approaches:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Use a VPN container&lt;/strong>: Run &lt;a href="https://github.com/qdm12/gluetun">Gluetun&lt;/a> alongside SearXNG to route all search queries through a VPN. This masks your server’s IP address.&lt;/li>
&lt;li>&lt;strong>Use a shared VPN exit node&lt;/strong>: If you have access to a VPN service with shared IP addresses, your queries will blend in with traffic from other users.&lt;/li>
&lt;/ol>
&lt;p>This might be overkill for most home users. The benefits of no tracking cookies, personalised advertising, or search history are already a substantial improvement over using search engines directly. It is worth partially implementing this over not implementing this at all.&lt;/p>
&lt;h2 id="supporting-the-project">Supporting the Project&lt;/h2>
&lt;p>SearXNG is maintained by a volunteer community. The project doesn&amp;rsquo;t appear to have a direct donation mechanism, but you can support it in other ways:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Contribute code&lt;/strong>: The project is written primarily in Python and welcomes contributions on &lt;a href="https://github.com/searxng/searxng">GitHub&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Report bugs and suggest features&lt;/strong>: Use the &lt;a href="https://github.com/searxng/searxng/issues">issue tracker&lt;/a> to help improve the project.&lt;/li>
&lt;li>&lt;strong>Help with translations&lt;/strong>: SearXNG supports multiple languages, and translation contributions are always welcome.&lt;/li>
&lt;li>&lt;strong>Join the community&lt;/strong>: The &lt;a href="https://matrix.to/#/#searxng:matrix.org">Matrix channel&lt;/a> (#searxng:matrix.org) is active and welcoming to newcomers.&lt;/li>
&lt;/ul>
&lt;p>Running a public instance (if you have the resources) also helps the broader community access privacy-respecting search.&lt;/p>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>SearXNG provides a practical way to reclaim control over your search experience. The deployment is straightforward with Docker Compose, and the benefits are immediate: ad-free results, no tracking, and a free web search API.&lt;/p>
&lt;p>SearXNG is worth considering for those who are concerned about privacy or wish to avoid advertisements. Self-hosting offers the advantage of integrating with local LLMs for web search. The configuration above should get you running in under ten minutes.&lt;/p>
&lt;p>Have you set up SearXNG or another privacy-focused search solution? Share your experience in the comments.&lt;/p></content:encoded><category>self-hosting</category><category>docker</category><category>privacy</category><category>search-engine</category><category>large-language-models</category></item><item><title>It-Tools: Self Hosted Collection of Developer Tools and It Utilities</title><link>https://coderscompass.org/articles/it-tools-self-hosted-collection-of-developer-tools-and-it-utilities/</link><guid isPermaLink="true">https://coderscompass.org/articles/it-tools-self-hosted-collection-of-developer-tools-and-it-utilities/</guid><pubDate>Mon, 08 Dec 2025 10:13:15 +0000</pubDate><dc:creator>Subhomoy Haldar</dc:creator><description>Self-host IT-Tools, a collection of handy developer utilities like formatters and converters. Keep sensitive data private within your network.</description><content:encoded>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>&lt;a href="https://it-tools.tech/">IT-Tools&lt;/a> is a self-hosted collection of handy tools for IT usage. It includes converters, formatters, prettifiers, and many other utilities that developers and IT professionals use regularly. The project is created by &lt;a href="https://corentin.tech/">Corentin Thomasset&lt;/a> and is available on &lt;a href="https://github.com/CorentinTh/it-tools">GitHub&lt;/a> under the GPL-3.0 licence.&lt;/p>
&lt;p>We have an instinct to search for tools like YAML or JSON formatters, word counters, and very simple hosted web tools. The problem with them is that we don’t know what’s happening with potentially sensitive data we hand over to them. It’s not recommended to paste private, possibly confidential information onto publicly available websites where we don’t know who the owner is and what’s being done with the data. You will definitely get scowled at by your senior developer!&lt;/p>
&lt;p>By self-hosting this collection of tools and keeping them within your private network, you have better control over where your data is being copy-pasted. This project is also open source, so you can check if by some means your data is being uploaded to a third-party service. We&amp;rsquo;ve checked the IT-Tools repository and confirmed there&amp;rsquo;s no Plausible integration in the self-hosted version. See the &lt;a href="#analytics-on-the-public-instance">Analytics on the Public Instance&lt;/a> section for details. It&amp;rsquo;s very unlikely, and it would erode all the trust in the project if something were found in the source code. Following such an event, there definitely would be forks of the project, and we would migrate to them as a community.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.docker.com/get-started/get-docker/">Docker&lt;/a> version 20.10 or later installed on your system. Newer versions of Docker include the Docker Compose plugin. Refer to the &lt;a href="#verification">Verification&lt;/a> section to ensure you have everything set up properly.&lt;/li>
&lt;li>An optional &lt;a href="https://en.wikipedia.org/wiki/Reverse_proxy">reverse proxy&lt;/a> if you want to expose it securely (e.g., &lt;a href="https://caddyserver.com/">Caddy&lt;/a>, &lt;a href="https://traefik.io/">Traefik&lt;/a>, or &lt;a href="https://nginx.org/">Nginx&lt;/a>)&lt;/li>
&lt;/ul>
&lt;h2 id="verification">Verification&lt;/h2>
&lt;p>Before proceeding with the installation, verify that Docker is installed.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-0-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1">1&lt;/a>&lt;/span>&lt;span>docker --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You should see output similar to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-1-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1">1&lt;/a>&lt;/span>&lt;span>Docker version 29.0.1, build eedd9698e9
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Optionally, verify Docker Compose is installed:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-2-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-1">1&lt;/a>&lt;/span>&lt;span>docker compose version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Expected output:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-3-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-1">1&lt;/a>&lt;/span>&lt;span>Docker Compose version 2.40.3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="installation">Installation&lt;/h2>
&lt;p>This is one of the simplest Docker deployments you can have. You don’t even need any volumes with this. It can be a stateless container.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Note&lt;/strong>: The image is available from both Docker Hub (&lt;code>corentinth/it-tools:latest&lt;/code>) and GitHub Container Registry (&lt;code>ghcr.io/corentinth/it-tools:latest&lt;/code>). Both are official and maintained. We use the Docker Hub version for brevity.&lt;/p>
&lt;/blockquote>
&lt;h3 id="using-docker-run">Using Docker Run&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-4-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-1">1&lt;/a>&lt;/span>&lt;span>docker run -d &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-4-2">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-2">2&lt;/a>&lt;/span>&lt;span>&lt;span style="color:#8caaee">&lt;/span> --name it-tools &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-4-3">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-3">3&lt;/a>&lt;/span>&lt;span>&lt;span style="color:#8caaee">&lt;/span> --restart unless-stopped &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-4-4">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-4">4&lt;/a>&lt;/span>&lt;span>&lt;span style="color:#8caaee">&lt;/span> -p 8080:80 &lt;span style="color:#8caaee">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-4-5">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-5">5&lt;/a>&lt;/span>&lt;span>&lt;span style="color:#8caaee">&lt;/span> corentinth/it-tools:latest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="using-docker-compose">Using Docker Compose&lt;/h3>
&lt;p>Sometimes you want a more permanent version control way of deploying your tools. We can achieve this using a Docker Compose file.&lt;/p>
&lt;p>Choose or create an appropriate directory. Something like &lt;code>~/self-hosting/it-tools&lt;/code>.&lt;/p>
&lt;p>Create a &lt;code>docker-compose.yaml&lt;/code> file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-5-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-1">1&lt;/a>&lt;/span>&lt;span>&lt;span style="color:#ca9ee6">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-5-2">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-2">2&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">it-tools&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-5-3">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-3">3&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">image&lt;/span>: corentinth/it-tools:latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-5-4">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-4">4&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">container_name&lt;/span>: it-tools
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-5-5">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-5">5&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">restart&lt;/span>: unless-stopped
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-5-6">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-6">6&lt;/a>&lt;/span>&lt;span> &lt;span style="color:#ca9ee6">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-5-7">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-7">7&lt;/a>&lt;/span>&lt;span> - “8080:80”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then within that directory run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#838ba7" id="hl-6-1">&lt;a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-1">1&lt;/a>&lt;/span>&lt;span>docker compose up -d
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="test-the-deployment">Test the Deployment&lt;/h3>
&lt;p>Access the application at &lt;code>localhost:8080&lt;/code>.&lt;/p>
&lt;h2 id="available-tools">Available Tools&lt;/h2>
&lt;p>As of December 2025, the latest version is &lt;a href="https://github.com/CorentinTh/it-tools/releases/tag/v2024.10.22-7ca5933">&lt;strong>v2024.10.22-7ca5933&lt;/strong>&lt;/a>, released on 22 October 2024.&lt;/p>
&lt;p>&lt;img src="https://coderscompass.org/images/articles/it-tools/tool-search-shortcut.webp" alt="Tool search with keyboard shortcut" decoding="async">
&lt;em>Quickly search for tools using the keyboard shortcut.&lt;/em>&lt;/p>
&lt;p>IT-Tools includes over 100 utilities organised into convenient categories. Here’s the list of tools available by category:&lt;/p>
&lt;h3 id="cryptographic-utilities">Cryptographic Utilities&lt;/h3>
&lt;ul>
&lt;li>Token generator&lt;/li>
&lt;li>Hash text (MD5, SHA1, SHA256, SHA224, SHA512, SHA384, SHA3, RIPEMD160)&lt;/li>
&lt;li>Bcrypt&lt;/li>
&lt;li>UUIDs generator&lt;/li>
&lt;li>ULID generator&lt;/li>
&lt;li>Encrypt / decrypt text&lt;/li>
&lt;li>BIP39 passphrase generator&lt;/li>
&lt;li>HMAC generator&lt;/li>
&lt;li>RSA key pair generator&lt;/li>
&lt;li>Password strength analyser&lt;/li>
&lt;li>PDF signature checker&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://coderscompass.org/images/articles/it-tools/random-token-generator.webp" alt="Random token generator interface" loading="lazy" decoding="async">
&lt;em>Generate random tokens for various use cases.&lt;/em>&lt;/p>
&lt;h3 id="converters">Converters&lt;/h3>
&lt;ul>
&lt;li>Date-time converter&lt;/li>
&lt;li>Integer base converter&lt;/li>
&lt;li>Roman numeral converter&lt;/li>
&lt;li>Base64 string encoder/decoder&lt;/li>
&lt;li>Base64 file converter&lt;/li>
&lt;li>Colour converter&lt;/li>
&lt;li>Case converter&lt;/li>
&lt;li>Text to NATO alphabet&lt;/li>
&lt;li>Text to ASCII binary&lt;/li>
&lt;li>Text to Unicode&lt;/li>
&lt;li>YAML to JSON converter&lt;/li>
&lt;li>YAML to TOML&lt;/li>
&lt;li>JSON to YAML converter&lt;/li>
&lt;li>JSON to TOML&lt;/li>
&lt;li>List converter&lt;/li>
&lt;li>TOML to JSON&lt;/li>
&lt;li>TOML to YAML&lt;/li>
&lt;li>XML to JSON&lt;/li>
&lt;li>JSON to XML&lt;/li>
&lt;li>Markdown to HTML&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://coderscompass.org/images/articles/it-tools/base64-encoder-decoder.webp" alt="Base64 encoder and decoder tool" loading="lazy" decoding="async">
&lt;em>Encode and decode Base64 strings easily.&lt;/em>&lt;/p>
&lt;h3 id="tools-for-the-web">Tools for the Web&lt;/h3>
&lt;ul>
&lt;li>Encode/decode URL-formatted strings&lt;/li>
&lt;li>Escape HTML entities&lt;/li>
&lt;li>URL parser&lt;/li>
&lt;li>Device information&lt;/li>
&lt;li>Basic auth generator&lt;/li>
&lt;li>Open graph meta generator&lt;/li>
&lt;li>OTP code generator&lt;/li>
&lt;li>MIME types&lt;/li>
&lt;li>JWT parser&lt;/li>
&lt;li>Keycode info&lt;/li>
&lt;li>Slugify string&lt;/li>
&lt;li>HTML WYSIWYG editor&lt;/li>
&lt;li>User-agent parser&lt;/li>
&lt;li>HTTP status codes&lt;/li>
&lt;li>JSON diff&lt;/li>
&lt;li>Outlook Safelink decoder&lt;/li>
&lt;/ul>
&lt;h3 id="images-and-videos">Images and Videos&lt;/h3>
&lt;ul>
&lt;li>QR Code generator&lt;/li>
&lt;li>Wi-Fi QR code generator&lt;/li>
&lt;li>SVG placeholder generator&lt;/li>
&lt;li>Camera recorder&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://coderscompass.org/images/articles/it-tools/qr-code-generator.webp" alt="QR code generator interface" loading="lazy" decoding="async">
&lt;em>Generate QR codes for URLs, text, and more.&lt;/em>&lt;/p>
&lt;h3 id="development">Development&lt;/h3>
&lt;ul>
&lt;li>Git cheat sheet&lt;/li>
&lt;li>Random port generator&lt;/li>
&lt;li>&lt;code>crontab&lt;/code> generator&lt;/li>
&lt;li>JSON prettify and format&lt;/li>
&lt;li>JSON minify&lt;/li>
&lt;li>JSON to CSV&lt;/li>
&lt;li>SQL prettify and formatter&lt;/li>
&lt;li>&lt;code>chmod&lt;/code> calculator&lt;/li>
&lt;li>Docker run to Docker compose converter&lt;/li>
&lt;li>XML formatter&lt;/li>
&lt;li>YAML prettify and format&lt;/li>
&lt;li>Email normaliser&lt;/li>
&lt;li>Regex Tester&lt;/li>
&lt;li>Regex cheat sheet&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://coderscompass.org/images/articles/it-tools/docker-run-to-compose.webp" alt="Docker run to Docker compose converter" loading="lazy" decoding="async">
&lt;em>Convert Docker run commands to Docker compose files.&lt;/em>&lt;/p>
&lt;h3 id="network">Network&lt;/h3>
&lt;ul>
&lt;li>IPv4 subnet calculator&lt;/li>
&lt;li>IPv4 address converter&lt;/li>
&lt;li>IPv4 range expander&lt;/li>
&lt;li>MAC address lookup&lt;/li>
&lt;li>MAC address generator&lt;/li>
&lt;li>IPv6 ULA generator&lt;/li>
&lt;/ul>
&lt;h3 id="mathematics">Mathematics&lt;/h3>
&lt;ul>
&lt;li>Math evaluator&lt;/li>
&lt;li>ETA calculator&lt;/li>
&lt;li>Percentage calculator&lt;/li>
&lt;/ul>
&lt;h3 id="measurement">Measurement&lt;/h3>
&lt;ul>
&lt;li>Chronometer&lt;/li>
&lt;li>Temperature converter&lt;/li>
&lt;li>Benchmark builder&lt;/li>
&lt;/ul>
&lt;h3 id="text-utilities">Text Utilities&lt;/h3>
&lt;ul>
&lt;li>Lorem ipsum generator&lt;/li>
&lt;li>Text statistics&lt;/li>
&lt;li>Emoji picker&lt;/li>
&lt;li>String obfuscator&lt;/li>
&lt;li>Text diff&lt;/li>
&lt;li>Numeronym generator&lt;/li>
&lt;li>ASCII Art Text Generator&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://coderscompass.org/images/articles/it-tools/lorem-ipsum-generator.webp" alt="Lorem ipsum generator tool" loading="lazy" decoding="async">
&lt;em>Generate placeholder text for your projects.&lt;/em>&lt;/p>
&lt;h3 id="data-processing-tools">Data Processing Tools&lt;/h3>
&lt;ul>
&lt;li>Phone parser and formatter&lt;/li>
&lt;li>IBAN validator and parser&lt;/li>
&lt;/ul>
&lt;h2 id="analytics-on-the-public-instance">Analytics on the Public Instance&lt;/h2>
&lt;p>The publicly hosted version of IT-Tools uses Plausible as an analytics platform, as evidenced by the &lt;a href="https://github.com/CorentinTh/it-tools/blob/0de73e8971b4c977086d246b112f218ed3dcc3f8/src/plugins/plausible.plugin.ts">plausible.plugin.ts file&lt;/a> in the source code. However, when you self-host it using the Docker image, there is no analytics tracking.&lt;/p>
&lt;ol>
&lt;li>The &lt;a href="https://github.com/CorentinTh/it-tools/blob/0de73e8971b4c977086d246b112f218ed3dcc3f8/Dockerfile">Dockerfile&lt;/a> does not include any environment variables or configuration for Plausible&lt;/li>
&lt;li>The Plausible plugin requires explicit configuration to function, which is absent in the self-hosted deployment.&lt;/li>
&lt;li>All tools are Vue.js components that process data locally within the browser.&lt;/li>
&lt;/ol>
&lt;p>Other than this, there’s no evidence of data being sent to any third parties. All tools are Vue.js components that process data within themselves. Some of them use local storage, but none of them do any data transfers. There are no traces of any HTTP usage.&lt;/p>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>Overall, IT-Tools is a nifty collection of handy tools all in one place. It’s highly recommended that you try it. The deployment is straightforward, and having these tools self-hosted (ideally within your local network) means you can use them without worrying about data privacy.&lt;/p>
&lt;p>If you derive a lot of value from this little tool, we recommend &lt;a href="https://github.com/sponsors/CorentinTh">sponsoring Corentin on GitHub&lt;/a> so that we can keep this wonderful project going! You can also &lt;a href="https://buymeacoffee.com/cthmsst">buy Corentin a coffee&lt;/a>.&lt;/p>
&lt;p>Know any other such tools worth self-hosting? Let us know in the comments!&lt;/p></content:encoded><category>self-hosting</category><category>docker</category><category>utilities</category><category>developer-tools</category><category>privacy</category></item><item><title>Comparing TODIM and CPT-TODIM for Social Sustainability Assessment in G7 Countries</title><link>https://coderscompass.org/articles/todim-cpt-todim-social-sustainability-g7/</link><guid isPermaLink="true">https://coderscompass.org/articles/todim-cpt-todim-social-sustainability-g7/</guid><pubDate>Tue, 09 Sep 2025 00:00:00 +0000</pubDate><dc:creator>Vaishnudebi Dutta</dc:creator><dc:creator>Subhomoy Haldar</dc:creator><description>We compare decision-making algorithms to rank G7 countries on social sustainability. CPT-TODIM proves most stable out of TODIM and CoCoSo.</description><content:encoded>&lt;h2 id="background">Background&lt;/h2>
&lt;p>This paper came from a question we asked: if you want to rank countries on how “socially sustainable” they are, which algorithm should you use? Many multi-criteria decision-making (MCDM) algorithms exist, yet most research focuses on a single one. We wanted to dig deeper.&lt;/p>
&lt;p>We focused on TODIM and its enhanced variant CPT-TODIM because they’re based on &lt;a href="https://en.wikipedia.org/wiki/Prospect_theory">prospect theory&lt;/a>. People are more affected by losses than by gains, as the Nobel Prize-winning idea suggests. This makes them well-suited for decisions where subjective judgement matters.&lt;/p>
&lt;h2 id="the-problem-in-plain-english">The Problem in Plain English&lt;/h2>
&lt;p>Suppose you want to rank the G7 countries (Canada, France, Germany, Italy, Japan, UK, USA) on social sustainability. You have 14 criteria: average wage, employment rate, income inequality, women in politics, education levels, and so on. How do you combine all these numbers into a single ranking?&lt;/p>
&lt;p>Most algorithms work by computing a “distance” to some ideal solution. The country closest to the ideal wins. The problem is that by compressing all that multi-dimensional data into a single distance score, you lose nuance. Two very different countries might end up with similar distances, making the ranking unstable.&lt;/p>
&lt;p>TODIM takes a different approach. Instead of evaluating countries based on their distance from a theoretical ideal, this method involves a criterion-by-criterion comparison of every country. For each pair, it asks: “Is Country A better or worse than Country B on this criterion? By how much?” Then it weighs losses more heavily than gains (because that’s how humans think). The result is a more stable ranking that doesn’t flip the alternatives around when you add or remove options.&lt;/p>
&lt;p>CPT-TODIM extends this by adding parameters that model risk attitudes more precisely. It transforms the criterion weights using cumulative prospect theory, giving decision-makers finer control over how gains and losses are perceived.&lt;/p>
&lt;h2 id="measuring-rank-reversals">Measuring Rank Reversals&lt;/h2>
&lt;p>We assessed algorithm stability through &lt;a href="https://en.wikipedia.org/wiki/Rank_reversals_in_decision-making">rank reversal&lt;/a> analysis. Rank reversal occurs when removing one option changes the ordering of the remaining choices. We tested each algorithm by removing one G7 country at a time and checking if the remaining rankings shifted:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Algorithm&lt;/th>
&lt;th>Rank Reversals (out of 7 removals)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>CoCoSo&lt;/td>
&lt;td>4 (FR, IT, JP, USA removals)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>TODIM&lt;/td>
&lt;td>2 (CA, DE removals)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CPT-TODIM&lt;/td>
&lt;td>1 (DE removal only)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>CoCoSo proved unreliable, with more than half of removals causing rank reversals. Both TODIM variants displayed minimal reversals, with CPT-TODIM being the most stable.&lt;/p>
&lt;h2 id="abstract">Abstract&lt;/h2>
&lt;p>Social sustainability objectives within the framework of sustainable development goals (SDGs) are critical aspects of balanced societies. Governments must constantly assess their performance to accomplish social sustainability goals. This paper evaluates the performance of seven industrialised nations: members of the Group of Seven (G7), in a streamlined manner. The rank sum weighting approach was used to quantify the subjectivity of experts’ judgements. In order to assess social sustainability performance for G7 countries, TODIM (TOmada de Decisão Interativa e Multicritério) and Cumulative Prospect Theory TODIM (CPT-TODIM) are implemented to compare the social sustainability performance of the G7 nations. Furthermore, sensitivity analysis is performed over 1000 different weight permutations of the criteria and alternatives from the original roster are removed to evaluate and contrast the two Multi-Criteria Decision-Making (MCDM) algorithms used to gain a deeper understanding of the strengths and limitations of each approach such as rank reversal problem. This analysis has also led to the conclusion of CPT-TODIM outranking both TODIM and CoCoSo algorithms. Analysis of 2020 OECD iLibrary data using both algorithms revealed that France emerged as the most socially sustainable country among the G7 nations.&lt;/p>
&lt;h2 id="publication-details">Publication Details&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Journal:&lt;/strong> International Journal of Information Technology &amp;amp; Decision Making&lt;/li>
&lt;li>&lt;strong>Published:&lt;/strong> 9 September 2025&lt;/li>
&lt;li>&lt;strong>DOI:&lt;/strong> &lt;a href="https://www.worldscientific.com/doi/10.1142/S021962202550097X">10.1142/S021962202550097X&lt;/a>&lt;/li>
&lt;li>&lt;strong>Publisher:&lt;/strong> World Scientific&lt;/li>
&lt;li>&lt;strong>ISSN:&lt;/strong> 0219-6220 (Print), 1793-6845 (Online)&lt;/li>
&lt;li>&lt;strong>Open Access:&lt;/strong> &lt;a href="https://research-information.bris.ac.uk/en/publications/performance-comparison-of-todim-and-cpt-todim-in-social-sustainab/">Accepted Author Manuscript (University of Bristol)&lt;/a> available under &lt;a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="authors">Authors&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://coderscompass.org/authors/vaishnudebi-dutta/">Vaishnudebi Dutta&lt;/a> (Corresponding Author, University of Bristol)&lt;/li>
&lt;li>&lt;a href="https://coderscompass.org/authors/subhomoy-haldar/">Subhomoy Haldar&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="keywords">Keywords&lt;/h2>
&lt;p>Social sustainability, multi-criteria decision-making, prospect theory, TODIM, CPT-TODIM, sensitivity analysis&lt;/p>
&lt;h2 id="code-and-data">Code and Data&lt;/h2>
&lt;p>The Python code for running the comparative and sensitivity analysis is available on GitHub: &lt;a href="https://github.com/Coders-Compass/social-sustainability">Coders-Compass/social-sustainability&lt;/a>&lt;/p>
&lt;p>The study uses 2020 data from the &lt;a href="https://www.oecd.org/en/publications.html">OECD iLibrary&lt;/a>.&lt;/p>
&lt;h2 id="access-the-publication">Access the Publication&lt;/h2>
&lt;p>The publisher version is available through the &lt;a href="https://www.worldscientific.com/doi/10.1142/S021962202550097X">DOI link&lt;/a> (closed access). In the interest of open access, the &lt;strong>accepted author manuscript&lt;/strong> is freely available from the &lt;a href="https://research-information.bris.ac.uk/en/publications/performance-comparison-of-todim-and-cpt-todim-in-social-sustainab/">University of Bristol research repository&lt;/a> under a &lt;a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0&lt;/a> license, made open access under the university&amp;rsquo;s Scholarly Works Policy.&lt;/p>
&lt;p>The paper contains the complete mathematical derivations, sensitivity analysis heat maps, and policy implications for each G7 country.&lt;/p></content:encoded><category>research</category><category>publications</category><category>academic</category><category>mcdm</category><category>todim</category><category>decision-making</category><category>sustainability</category><category>prospect-theory</category></item><item><title>Probability of Real Roots in a Quadratic Equation with Uniform(α,β) Coefficients</title><link>https://coderscompass.org/articles/probability-real-roots-quadratic-uniform-alpha-beta/</link><guid isPermaLink="true">https://coderscompass.org/articles/probability-real-roots-quadratic-uniform-alpha-beta/</guid><pubDate>Wed, 29 Mar 2023 00:00:00 +0000</pubDate><dc:creator>Subhomoy Haldar</dc:creator><description>We derive a general formula for the probability of real roots when quadratic coefficients are U(α,β), extending our symmetric case result.</description><content:encoded>&lt;h2 id="background">Background&lt;/h2>
&lt;p>This paper is a direct follow-up to our &lt;a href="https://coderscompass.org/articles/probability-real-roots-quadratic-iid-uniform-theta/">earlier work on the symmetric case&lt;/a>, where we found that the probability of obtaining real roots of a quadratic equation is approximately 62.7% when coefficients are drawn from $U(-\theta, \theta)$.&lt;/p>
&lt;p>The question that follows naturally is what happens when we remove the symmetry constraint?&lt;/p>
&lt;blockquote>
&lt;p>What if the coefficients come from $U(\alpha, \beta)$ for any real numbers $\alpha$ and $\beta$?&lt;/p>
&lt;/blockquote>
&lt;p>The generalisation was more challenging than expected. We could apply simplifications for the symmetric case. For this instance, we had to employ a more powerful approach of obtaining the value - vector calculus. Our co-author &lt;a href="https://www.linkedin.com/in/mkchaudhary/">Mukesh Chaudhary&lt;/a> provided the insight necessary to proceed.&lt;/p>
&lt;h2 id="the-problem-in-plain-english">The Problem in Plain English&lt;/h2>
&lt;p>Consider the quadratic equation $Ax^2 + Bx + C = 0$. It has real roots when $B^2 \geq 4AC$. We want to find the probability of this happening when $A$, $B$, and $C$ are independently drawn from a uniform distribution $U(\alpha, \beta)$.&lt;/p>
&lt;p>The geometric intuition follows: when we have three independent real values, we’re essentially working in a 3D space where each point $(A, B, C)$ represents one set of coefficients. Out of this entire cube, only certain sub-regions satisfy the discriminant condition $B^2 \geq 4AC$.&lt;/p>
&lt;blockquote>
&lt;p>The probability we&amp;rsquo;re after is the volume of this &amp;ldquo;solution region&amp;rdquo; divided by the total volume.&lt;/p>
&lt;/blockquote>
&lt;p>The shape of this solution region is rather intricate. In the symmetric case, we could work around the complexity. But in the general case, we needed to compute these volumes properly using vector calculus.&lt;/p>
&lt;h2 id="the-key-finding">The Key Finding&lt;/h2>
&lt;p>Unlike the symmetric case, which gives a single probability (62.7%), the general case produces different probabilities depending on the relationship between $\alpha$ and $\beta$. We derived the following algorithm that handles all cases:&lt;/p>
&lt;p>&lt;strong>Algorithm to calculate the probability of obtaining a real root when the coefficients are sampled from the continuous distribution $U(\alpha, \beta)$, where $\alpha, \beta \in \mathbb{R}$
:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Calculate the scaling factor $\theta = \dfrac{\text{signum}(\alpha) \cdot \text{signum}(\beta)}{\max(|\alpha|, |\beta|)}$&lt;/li>
&lt;li>Find the ratio $f = \min(|\alpha|, |\beta|) \cdot \theta$, and its absolute value $r = |f|$&lt;/li>
&lt;li>Calculate total volume of the cube as $V = (1 - f)^3$&lt;/li>
&lt;li>Pre-compute $V_0 = \dfrac{5}{36} + \dfrac{\log 2}{6} \approx 0.2544$
It is also recommended to compute: $r^2$, $r^3$, $r^{\frac{3}{2}}$, $\dfrac{\log r}{6}$&lt;/li>
&lt;li>If $f = 0$, return $V_0 \approx 0.2544$&lt;/li>
&lt;li>If $f \in \left[\dfrac{1}{2}, 1\right]$, return $0$&lt;/li>
&lt;li>If $f \in \left[\dfrac{1}{4}, \dfrac{1}{2}\right)$, return $\left(-V_0 - \dfrac{\log r}{6} + r^2 - \dfrac{8}{9}r^3\right) \div V$&lt;/li>
&lt;li>If $f \in \left(0, \dfrac{1}{4}\right)$, return $\left(V_0 - 2r + \dfrac{16}{9}r^{\frac{3}{2}} + r^2 - \dfrac{8}{9}r^3\right) \div V$&lt;/li>
&lt;li>If $f \in \left[-\dfrac{1}{2}, 0\right)$, return $\left(V_0 + 2r + 3r^2 + r^3\left(2V_0 - \dfrac{\log r}{6} - \dfrac{8}{9}\right)\right) \div V$&lt;/li>
&lt;li>If $f \in \left[-1, -\dfrac{1}{2}\right)$, return $\left(2(V_0 + r + r^2) + \dfrac{\log r}{6} + r^3\left(2V_0 - \dfrac{\log r}{6}\right)\right) \div V$&lt;/li>
&lt;/ol>
&lt;p>The constant $V_0 = \dfrac{5}{36} + \dfrac{\log 2}{6}$ appears throughout the formula and represents the base probability in certain limiting cases.&lt;/p>
&lt;h2 id="abstract">Abstract&lt;/h2>
&lt;p>The roots of a quadratic equation $Ax^2 + Bx + C = 0$ are real if the discriminant $B^2 - 4AC$ is non-negative. In this paper, the coefficients are taken as independently and identically distributed $U(\alpha, \beta)$, where $\alpha, \beta \in \mathbb{R}$. The exact probability of obtaining real roots is derived through simplification by considering the ratio of the endpoints. Vector calculus is used to derive the final formula, which is experimentally verified using Monte Carlo simulation.&lt;/p>
&lt;h2 id="publication-details">Publication Details&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Journal:&lt;/strong> Journal of the Indian Society for Probability and Statistics&lt;/li>
&lt;li>&lt;strong>Volume:&lt;/strong> 24, Pages 135–149&lt;/li>
&lt;li>&lt;strong>Published:&lt;/strong> March 2023&lt;/li>
&lt;li>&lt;strong>DOI:&lt;/strong> &lt;a href="https://doi.org/10.1007/s41096-023-00149-6">10.1007/s41096-023-00149-6&lt;/a>&lt;/li>
&lt;li>&lt;strong>Publisher:&lt;/strong> Springer India&lt;/li>
&lt;li>&lt;strong>ISSN:&lt;/strong> 2364-9569 (Online)&lt;/li>
&lt;/ul>
&lt;h2 id="authors">Authors&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://coderscompass.org/authors/subhomoy-haldar/">Subhomoy Haldar&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://orcid.org/0000-0003-3530-9027">Dr. Soubhik Chakraborty&lt;/a> (Supervisor)&lt;/li>
&lt;li>&lt;a href="https://www.linkedin.com/in/mkchaudhary/">Mukesh Chaudhary&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="keywords">Keywords&lt;/h2>
&lt;p>Quadratic equation, continuous uniform distribution, probability, Monte Carlo simulation, vector calculus&lt;/p>
&lt;h2 id="related-work">Related Work&lt;/h2>
&lt;p>This paper extends our &lt;a href="https://coderscompass.org/articles/probability-real-roots-quadratic-iid-uniform-theta/">earlier result for the symmetric case&lt;/a>, where coefficients were drawn from $U(-\theta, \theta)$. That work established the foundational approach and the 62.7% probability for the symmetric distribution.&lt;/p>
&lt;h2 id="access-the-publication">Access the Publication&lt;/h2>
&lt;p>The full paper is available through the DOI link above. It contains the complete mathematical derivations, proofs, and Monte Carlo simulation results that verify the formula. We also show a render of the acceptable volume within the unit cube that represents the region where roots are real.&lt;/p></content:encoded><category>research</category><category>publications</category><category>academic</category><category>probability</category><category>mathematics</category><category>statistics</category><category>vector-calculus</category></item><item><title>Implications of Agricultural Practices on Vegetation and Terrestrial Invertebrates in Riparian Zones</title><link>https://coderscompass.org/articles/agricultural-practices-riparian-vegetation-invertebrates-nonlinear-model/</link><guid isPermaLink="true">https://coderscompass.org/articles/agricultural-practices-riparian-vegetation-invertebrates-nonlinear-model/</guid><pubDate>Fri, 30 Sep 2022 00:00:00 +0000</pubDate><dc:creator>Vaishnudebi Dutta</dc:creator><description>A nonlinear mathematical model shows how unchecked agricultural expansion into riparian zones threatens vegetation and invertebrate populations. Stability analysis reveals the conditions for coexistence.</description><content:encoded>&lt;h2 id="background">Background&lt;/h2>
&lt;p>Riparian zones are the strips of land that run alongside rivers, streams, and wetlands. They act as transition areas between water and land, supporting a remarkable range of life. The vegetation growing in these zones filters sediment, regulates nutrients, stabilises stream banks, and moderates water temperature. Invertebrates (insects, spiders, beetles, and similar creatures) living in this zone depend on this vegetation for food, shelter, hunting grounds, and breeding sites.&lt;/p>
&lt;p>Farmers increasingly use riparian land for agriculture. The rising population drives demand for more cultivable area, and riparian zones, with their fertile, well-watered soil, become tempting targets. The trouble is that clearing vegetation for farming removes the habitat that invertebrates rely on, setting off a chain of ecological consequences.&lt;/p>
&lt;p>Field studies have documented these effects at various locations around the world, but mathematical models capturing the three-way interaction between riparian vegetation, terrestrial invertebrates, and agricultural production have been rare. This paper fills that gap by proposing a nonlinear model built from differential equations, then analysing its behaviour to identify the conditions under which all three can coexist.&lt;/p>
&lt;h2 id="the-problem-in-plain-english">The Problem in Plain English&lt;/h2>
&lt;p>Picture a stretch of riverbank. Trees and shrubs grow along it, providing cover for spiders, beetles, and other small creatures. These invertebrates do useful things: some eat crop pests, others help pollinate nearby fields, and their activity contributes to healthy soil. The vegetation also acts as a buffer, trapping excess nitrogen and phosphorus before it reaches the water.&lt;/p>
&lt;p>Now imagine a farmer clears part of that riverbank to plant crops. The vegetation shrinks, and so does the habitat for invertebrates. Fewer invertebrates mean fewer natural pest controllers and pollinators, which can actually hurt the farm’s own output in the long run.&lt;/p>
&lt;p>The paper captures this situation with three variables that change over time:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>$V(t)$&lt;/strong> - the amount of riparian vegetation&lt;/li>
&lt;li>&lt;strong>$I(t)$&lt;/strong> - the population of terrestrial invertebrates&lt;/li>
&lt;li>&lt;strong>$A(t)$&lt;/strong> - the agricultural production&lt;/li>
&lt;/ul>
&lt;p>Each variable is governed by a differential equation describing how it grows, shrinks, and interacts with the others. Vegetation grows logistically (it can only get so big given finite land and water) but gets reduced by both farming and invertebrate consumption. Invertebrates grow from vegetation but face internal competition and harm from agricultural activity. Agriculture also grows logistically but gets a boost from invertebrates (through pest control and pollination).&lt;/p>
&lt;h2 id="key-findings">Key Findings&lt;/h2>
&lt;p>The mathematical analysis identified six possible long-term states the system could settle into:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Equilibrium&lt;/th>
&lt;th>What it means&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>$E_0$&lt;/td>
&lt;td>Everything collapses: no vegetation, no invertebrates, no agriculture&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$E_1$&lt;/td>
&lt;td>Only agriculture survives; vegetation and invertebrates are gone&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$E_2$&lt;/td>
&lt;td>Only vegetation survives; no invertebrates or agriculture&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$E_3$&lt;/td>
&lt;td>Vegetation and agriculture coexist, but invertebrates have vanished&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$E_4$&lt;/td>
&lt;td>Vegetation and invertebrates coexist, but there is no agriculture&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>$E_5$&lt;/td>
&lt;td>All three coexist: vegetation, invertebrates, and agriculture together&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The most important result concerns $E_5$, the coexistence state. The paper shows it exists and is stable when:&lt;/p>
&lt;p>$$\theta\beta &amp;gt; \left(1 + \frac{\alpha}{r}\right)\delta$$&lt;/p>
&lt;p>In words: the benefit that invertebrates draw from vegetation ($\theta\beta$) must outweigh the damage that agriculture inflicts, scaled by how much farming erodes vegetation’s capacity to regrow. If agriculture encroaches too aggressively, this condition breaks, and the system collapses to $E_3$ - a system with farms and some vegetation, but no invertebrates.&lt;/p>
&lt;p>The sensitivity analysis reinforces this picture. The two most influential parameters are:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>$r$&lt;/strong> (vegetation’s intrinsic growth rate) - higher values stabilise the system and help all three components reach equilibrium faster&lt;/li>
&lt;li>&lt;strong>$\gamma$&lt;/strong> (competition among invertebrates) - stronger competition reduces invertebrate numbers, which hurts agricultural output because fewer invertebrates mean less natural pest control&lt;/li>
&lt;/ul>
&lt;p>When the depletion rate $\alpha$ (how fast farming destroys vegetation) is too high, the system destabilises. The simulations show growing oscillations and eventual collapse.&lt;/p>
&lt;h2 id="what-this-means">What This Means&lt;/h2>
&lt;p>The mathematics formalises something ecologists have long suspected: riparian buffers - the uncultivated, vegetated strips next to waterways - are worth protecting. They sustain invertebrate populations that benefit farming through pollination, pest suppression, decomposition, and water quality regulation. Pushing agriculture into these zones might yield short-term gains, but the model shows it risks destabilising the entire system.&lt;/p>
&lt;h2 id="abstract">Abstract&lt;/h2>
&lt;p>Uncontrolled land-use owing to agricultural practices has not only resulted in depletion of vegetation, but has also worsened the habitat of terrestrial invertebrates living in riparian zones. With these dynamic interactions in mind, a nonlinear model is developed using a set of differential equations, including riparian vegetation, terrestrial invertebrates, and agricultural production as system variables. The model is based on the notion that terrestrial invertebrates totally depend on riparian vegetation for their survival and utilization of riparian zones for agricultural purposes not only cause the loss of riparian vegetation, but of terrestrial invertebrates as well. The generated differential-equation system is examined for equilibrium solutions, their existences and stabilities. The mathematical analysis demonstrates the conditions under which agricultural production, riparian vegetation, and terrestrial invertebrates can coexist and create a stable system. These intuitive conclusions are supported by quantitative results using numerical simulation and differential sensitivity analysis. The qualitative as well as quantitative findings suggest that excessive utilization of forested riparian land for agricultural practices may cause destabilization of the system and therefore, they should be put under check in riparian zones.&lt;/p>
&lt;h2 id="publication-details">Publication Details&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Journal:&lt;/strong> International Journal of Applied and Computational Mathematics&lt;/li>
&lt;li>&lt;strong>Volume:&lt;/strong> 8, Article 268&lt;/li>
&lt;li>&lt;strong>Published:&lt;/strong> 30 September 2022&lt;/li>
&lt;li>&lt;strong>DOI:&lt;/strong> &lt;a href="https://doi.org/10.1007/s40819-022-01471-6">10.1007/s40819-022-01471-6&lt;/a>&lt;/li>
&lt;li>&lt;strong>Publisher:&lt;/strong> Springer Nature&lt;/li>
&lt;li>&lt;strong>ISSN:&lt;/strong> 2349-5103 (Print), 2199-5796 (Online)&lt;/li>
&lt;/ul>
&lt;h2 id="authors">Authors&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://coderscompass.org/authors/vaishnudebi-dutta/">Vaishnudebi Dutta&lt;/a> (Department of Mathematics, Birla Institute of Technology, Mesra, Ranchi)&lt;/li>
&lt;li>&lt;a href="https://orcid.org/0000-0003-0882-2669">Abhinav Tandon&lt;/a> (Corresponding Author, Department of Mathematics, Birla Institute of Technology, Mesra, Ranchi)&lt;/li>
&lt;/ul>
&lt;h2 id="keywords">Keywords&lt;/h2>
&lt;p>Riparian vegetation, Agriculture, Mathematical model, Differential equation, Stability analysis, Sensitivity analysis&lt;/p>
&lt;h2 id="access-the-publication">Access the Publication&lt;/h2>
&lt;p>The paper is available through the &lt;a href="https://doi.org/10.1007/s40819-022-01471-6">DOI link&lt;/a> on Springer. It contains the complete mathematical derivations, proofs, phase portraits, time-series graphs, and sensitivity analysis bar charts.&lt;/p></content:encoded><category>research</category><category>publications</category><category>academic</category><category>ecology</category><category>mathematical-modelling</category><category>differential-equations</category><category>mathematics</category></item><item><title>Probability of Real Roots in a Quadratic Equation with Uniform(-θ,θ) Coefficients</title><link>https://coderscompass.org/articles/probability-real-roots-quadratic-iid-uniform-theta/</link><guid isPermaLink="true">https://coderscompass.org/articles/probability-real-roots-quadratic-iid-uniform-theta/</guid><pubDate>Fri, 12 Mar 2021 00:00:00 +0000</pubDate><dc:creator>Subhomoy Haldar</dc:creator><description>What's the chance a quadratic has real roots when coefficients are random? We find it's 62.7% using probability theory and Monte Carlo simulation.</description><content:encoded>&lt;h2 id="background">Background&lt;/h2>
&lt;p>I wrote this paper towards the end of my Integrated Master of Science (IMSc) in Mathematics and Computing at Birla Institute of Technology, Mesra. Working under the guidance of &lt;a href="https://orcid.org/0000-0003-3530-9027">Dr. Soubhik Chakraborty&lt;/a>, I came across an interesting problem that had seen some discussion in the early 20th century but had been largely forgotten since.&lt;/p>
&lt;p>The question is deceptively simple:&lt;/p>
&lt;blockquote>
&lt;p>If you pick random numbers for the coefficients of a quadratic equation, what’s the chance that it has real roots?&lt;/p>
&lt;/blockquote>
&lt;p>This turned out to be a wonderful exercise in probability theory. Beyond the mathematics itself, the goal was to show that there are still unexplored corners in well-trodden areas of mathematics waiting to be revisited.&lt;/p>
&lt;h2 id="the-problem-in-plain-english">The Problem in Plain English&lt;/h2>
&lt;p>Consider the quadratic equation $Ax^2 + Bx + C = 0$. We know from school that it has real roots when the discriminant $B^2 - 4AC$ is non-negative. It takes an interesting angle when we ask: what if $A$, $B$, and $C$ are random numbers drawn independently from the same uniform distribution?&lt;/p>
&lt;p>We looked specifically at the symmetric case where each coefficient comes from $U(-\theta, \theta)$, meaning any value between $-\theta$ and $+\theta$ is equally likely.&lt;/p>
&lt;h2 id="the-key-finding">The Key Finding&lt;/h2>
&lt;blockquote>
&lt;p>&lt;strong>The probability of obtaining real roots is approximately 62.7%.&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>This result comes from analysis of the probability distribution of $B^2$ and the conditions under which $B^2 \geq 4AC$. The calculation simplifies considerably when $AC \leq 0$ (which happens half the time), because then the discriminant is automatically non-negative.&lt;/p>
&lt;p>We verified this theoretical result experimentally through Monte Carlo simulation, running thousands of random trials to confirm the calculation.&lt;/p>
&lt;h2 id="abstract">Abstract&lt;/h2>
&lt;p>In this paper, we seek to find out the probability of obtaining real roots of a quadratic equation $Ax^2 + Bx + C = 0$, with $A \neq 0$, when the coefficients are independent, identically distributed uniform variates. The exact value of the roots can be obtained from the coefficients and the discriminant indicates if the roots are real or imaginary. Here, we consider the uniform distribution $U(-\theta, \theta)$ and find the probability of obtaining a real root to be 62.7%. This is done through simplification of the problem, analysis of the probability distribution of $B^2$ for both $U(-1, 1)$ and $U(0, 1)$, and final evaluation using conditional probability. Calculations are simplified by the fact that $B^2 \geq 4AC$ is always true when $AC \leq 0$. We leverage on the fact that the probability of obtaining real roots when coefficients are sampled from $U(0, \theta)$ is 25.4%. We verify the result experimentally through Monte Carlo simulation and present the desired supporting data accordingly.&lt;/p>
&lt;h2 id="publication-details">Publication Details&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Journal:&lt;/strong> Journal of Applied Mathematics and Computation&lt;/li>
&lt;li>&lt;strong>Volume:&lt;/strong> 5, Issue 1, Pages 48-55&lt;/li>
&lt;li>&lt;strong>Published:&lt;/strong> 12 March 2021&lt;/li>
&lt;li>&lt;strong>DOI:&lt;/strong> &lt;a href="https://doi.org/10.26855/jamc.2021.03.006">10.26855/jamc.2021.03.006&lt;/a>&lt;/li>
&lt;li>&lt;strong>Publisher:&lt;/strong> Hill Publishing Group Inc.&lt;/li>
&lt;li>&lt;strong>ISSN:&lt;/strong> 2576-0653 (Online)&lt;/li>
&lt;/ul>
&lt;h2 id="authors">Authors&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://coderscompass.org/authors/subhomoy-haldar/">Subhomoy Haldar&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://orcid.org/0000-0003-3530-9027">Dr. Soubhik Chakraborty&lt;/a> (Supervisor)&lt;/li>
&lt;/ul>
&lt;h2 id="keywords">Keywords&lt;/h2>
&lt;p>Quadratic equation, continuous uniform distribution, probability, Monte Carlo simulation&lt;/p>
&lt;h2 id="follow-up-work">Follow-up Work&lt;/h2>
&lt;p>This paper laid the groundwork for a more general result. In a &lt;a href="https://coderscompass.org/articles/probability-real-roots-quadratic-uniform-alpha-beta/">subsequent paper&lt;/a>, we extended the analysis to the case where coefficients come from $U(\alpha, \beta)$ for any real numbers $\alpha$ and $\beta$, removing the symmetry constraint. That work was published in the Journal of the Indian Society for Probability and Statistics in 2023.&lt;/p>
&lt;h2 id="access-the-publication">Access the Publication&lt;/h2>
&lt;p>The full paper is available as open access through the DOI link above. It contains the complete mathematical derivations, proofs, and simulation harness.&lt;/p></content:encoded><category>research</category><category>publications</category><category>academic</category><category>probability</category><category>mathematics</category><category>statistics</category></item></channel></rss>