<?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>Forem: Akshay</title>
    <description>The latest articles on Forem by Akshay (@coderx09).</description>
    <link>https://forem.com/coderx09</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%2F3901865%2F96d589fb-9574-4346-bc4d-ae87c36588ef.jpeg</url>
      <title>Forem: Akshay</title>
      <link>https://forem.com/coderx09</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/coderx09"/>
    <language>en</language>
    <item>
      <title>I Built a Free Privacy-Focused Bulk Image Compressor That Runs Entirely in Your Browser</title>
      <dc:creator>Akshay</dc:creator>
      <pubDate>Thu, 07 May 2026 06:50:05 +0000</pubDate>
      <link>https://forem.com/coderx09/i-built-a-free-privacy-focused-bulk-image-compressor-that-runs-entirely-in-your-browser-4enm</link>
      <guid>https://forem.com/coderx09/i-built-a-free-privacy-focused-bulk-image-compressor-that-runs-entirely-in-your-browser-4enm</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7y10l7nvwhp399qok7zb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7y10l7nvwhp399qok7zb.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I created a polished Medium-style version already. Here’s a DEV.to optimized version — more developer-focused, slightly more technical, cleaner formatting, and written in a style that performs well on DEV Community.&lt;/p&gt;




&lt;h2&gt;
  
  
  Compress massive images without uploading anything to a server
&lt;/h2&gt;

&lt;p&gt;Every developer eventually runs into this problem.&lt;/p&gt;

&lt;p&gt;You have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Huge product photos&lt;/li&gt;
&lt;li&gt;Design assets from Figma&lt;/li&gt;
&lt;li&gt;DSLR images&lt;/li&gt;
&lt;li&gt;Screenshots for documentation&lt;/li&gt;
&lt;li&gt;Client uploads that are absurdly large&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And suddenly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your CMS rejects uploads&lt;/li&gt;
&lt;li&gt;Your website becomes slow&lt;/li&gt;
&lt;li&gt;Your Git repository balloons in size&lt;/li&gt;
&lt;li&gt;Your email attachment limit explodes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you search for an “online image compressor”.&lt;/p&gt;

&lt;p&gt;Then comes the part nobody talks about:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You’re uploading potentially sensitive files to random third-party servers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I didn’t love that idea.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;ImageSquash Pro&lt;/strong&gt; — a completely client-side bulk image compressor that works directly inside the browser.&lt;/p&gt;

&lt;p&gt;No uploads.&lt;br&gt;
No backend.&lt;br&gt;
No analytics.&lt;br&gt;
No tracking.&lt;/p&gt;

&lt;p&gt;Just drag, drop, compress, and download.&lt;/p&gt;


&lt;h1&gt;
  
  
  🔥 Why I Built It
&lt;/h1&gt;

&lt;p&gt;A client once sent me around &lt;strong&gt;20 RAW product images&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The folder size?&lt;/p&gt;
&lt;h2&gt;
  
  
  ~1.2 GB
&lt;/h2&gt;

&lt;p&gt;They needed optimized versions for the web immediately.&lt;/p&gt;

&lt;p&gt;Most online tools failed because they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;had file limits&lt;/li&gt;
&lt;li&gt;required payment for batch processing&lt;/li&gt;
&lt;li&gt;froze on large images&lt;/li&gt;
&lt;li&gt;destroyed image quality&lt;/li&gt;
&lt;li&gt;uploaded everything to their servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So instead of fighting existing tools, I decided to build one optimized for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;privacy&lt;/li&gt;
&lt;li&gt;speed&lt;/li&gt;
&lt;li&gt;large batch processing&lt;/li&gt;
&lt;li&gt;simplicity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That became &lt;strong&gt;ImageSquash Pro&lt;/strong&gt;.&lt;/p&gt;


&lt;h1&gt;
  
  
  ⚡ What Makes It Different
&lt;/h1&gt;

&lt;p&gt;Most image compressors work like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Upload → Server Processing → Download
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ImageSquash works like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser → Local Processing → Download
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything happens directly on your machine using browser APIs.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;p&gt;✅ Your files never leave your computer&lt;br&gt;
✅ No internet required after initial page load&lt;br&gt;
✅ Compression happens locally on your CPU&lt;br&gt;
✅ No waiting for uploads&lt;br&gt;
✅ No privacy concerns&lt;/p&gt;

&lt;p&gt;You can literally disconnect your WiFi and the app still works.&lt;/p&gt;


&lt;h1&gt;
  
  
  🖼️ Features
&lt;/h1&gt;
&lt;h2&gt;
  
  
  📦 Bulk Compression
&lt;/h2&gt;

&lt;p&gt;Compress dozens of images at once.&lt;/p&gt;

&lt;p&gt;No annoying “one file at a time” workflow.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔒 Fully Private
&lt;/h2&gt;

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

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

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

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

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


&lt;h2&gt;
  
  
  🎛️ Adjustable Compression
&lt;/h2&gt;

&lt;p&gt;Choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebP&lt;/li&gt;
&lt;li&gt;JPEG&lt;/li&gt;
&lt;li&gt;PNG&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And customize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;quality&lt;/li&gt;
&lt;li&gt;dimensions&lt;/li&gt;
&lt;li&gt;compression preset&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📊 Compression Statistics
&lt;/h2&gt;

&lt;p&gt;See:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;original size&lt;/li&gt;
&lt;li&gt;compressed size&lt;/li&gt;
&lt;li&gt;savings percentage&lt;/li&gt;
&lt;li&gt;total reduction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In real time.&lt;/p&gt;


&lt;h2&gt;
  
  
  📁 ZIP Export
&lt;/h2&gt;

&lt;p&gt;Download the entire batch as a ZIP file.&lt;/p&gt;

&lt;p&gt;One click.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⌨️ Keyboard Shortcuts
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl + Enter → Compress All
Ctrl + D → Download ZIP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🛠️ Tech Stack
&lt;/h1&gt;

&lt;p&gt;The project is intentionally simple.&lt;/p&gt;

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

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

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

&lt;p&gt;Just browser APIs.&lt;/p&gt;
&lt;h2&gt;
  
  
  Built With
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;HTML5 Canvas API&lt;/li&gt;
&lt;li&gt;FileReader API&lt;/li&gt;
&lt;li&gt;JSZip&lt;/li&gt;
&lt;li&gt;Vanilla JavaScript&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  🧠 Core Compression Logic
&lt;/h1&gt;

&lt;p&gt;Here’s the simplified version:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;canvas&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;targetWidth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;targetHeight&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetHeight&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toBlob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// compressed image blob&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image/webp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mf"&gt;0.35&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser handles resizing and re-encoding completely locally.&lt;/p&gt;

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




&lt;h1&gt;
  
  
  📉 Real Compression Results
&lt;/h1&gt;

&lt;p&gt;One test batch:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Original&lt;/th&gt;
&lt;th&gt;Compressed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.62 GB&lt;/td&gt;
&lt;td&gt;4.21 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Single images around &lt;strong&gt;80MB&lt;/strong&gt; often compress down to roughly &lt;strong&gt;200KB&lt;/strong&gt; depending on settings.&lt;/p&gt;

&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;websites&lt;/li&gt;
&lt;li&gt;portfolios&lt;/li&gt;
&lt;li&gt;blogs&lt;/li&gt;
&lt;li&gt;ecommerce&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;web apps&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🔐 Why Privacy Matters
&lt;/h1&gt;

&lt;p&gt;A surprising number of image tools upload files silently.&lt;/p&gt;

&lt;p&gt;That’s risky when working with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;client assets&lt;/li&gt;
&lt;li&gt;confidential documents&lt;/li&gt;
&lt;li&gt;medical files&lt;/li&gt;
&lt;li&gt;legal paperwork&lt;/li&gt;
&lt;li&gt;internal company screenshots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted a tool where privacy wasn’t just a policy.&lt;/p&gt;

&lt;p&gt;I wanted privacy enforced by architecture.&lt;/p&gt;

&lt;p&gt;With ImageSquash:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The safest upload is the one that never happens.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  🚀 Live Demo
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://tutorialsandroid.github.io/image-squash-pro/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  💻 GitHub Repository
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/TutorialsAndroid/image-squash-pro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📌 Future Improvements
&lt;/h1&gt;

&lt;p&gt;Things I’d love to add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AVIF support&lt;/li&gt;
&lt;li&gt;HEIC support&lt;/li&gt;
&lt;li&gt;Web Workers for background compression&lt;/li&gt;
&lt;li&gt;Drag-to-reorder batches&lt;/li&gt;
&lt;li&gt;GPU acceleration experiments&lt;/li&gt;
&lt;li&gt;Folder upload support&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🤝 Open Source
&lt;/h1&gt;

&lt;p&gt;Contributions are welcome.&lt;/p&gt;

&lt;p&gt;If you have ideas, optimizations, or feature suggestions, feel free to open an issue or submit a PR.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;I originally built this as a utility for myself.&lt;/p&gt;

&lt;p&gt;But it became something much more useful:&lt;/p&gt;

&lt;p&gt;A fast, lightweight, privacy-focused tool that solves a real problem without forcing users to trust a random server.&lt;/p&gt;

&lt;p&gt;And honestly, I think more web apps should work this way.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a Modern Android Toast Library that works properly on Android 11+ (with icons, colors &amp; Version Catalog support)</title>
      <dc:creator>Akshay</dc:creator>
      <pubDate>Tue, 28 Apr 2026 11:41:55 +0000</pubDate>
      <link>https://forem.com/coderx09/i-built-a-modern-android-toast-library-that-works-properly-on-android-11-with-icons-colors--4f0</link>
      <guid>https://forem.com/coderx09/i-built-a-modern-android-toast-library-that-works-properly-on-android-11-with-icons-colors--4f0</guid>
      <description>&lt;h1&gt;
  
  
  🚀 I built a Modern Android Toast Library that works properly on Android 11+ (with icons, colors &amp;amp; Version Catalog support)
&lt;/h1&gt;

&lt;p&gt;Android’s default &lt;code&gt;Toast&lt;/code&gt; customization stopped working reliably after &lt;strong&gt;Android 11 (API 30)&lt;/strong&gt;.&lt;br&gt;
Setting background colors directly on Toast views is now restricted — which makes many old solutions break.&lt;/p&gt;

&lt;p&gt;So I built a lightweight modern alternative:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Toast Library&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It provides:&lt;/p&gt;

&lt;p&gt;✅ Success / Error / Info / Default variants&lt;br&gt;
🎨 Colored rounded backgrounds&lt;br&gt;
🧩 Built-in vector icons&lt;br&gt;
📍 Gravity control (TOP / CENTER / BOTTOM)&lt;br&gt;
📦 JitPack installation&lt;br&gt;
🧰 Version Catalog support (latest Android Studio)&lt;br&gt;
⚡ Lightweight &amp;amp; dependency-free&lt;/p&gt;


&lt;h1&gt;
  
  
  📦 Installation (JitPack)
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Step 1 — Add JitPack repository
&lt;/h2&gt;

&lt;p&gt;Inside &lt;code&gt;settings.gradle.kts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;pluginManagement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;repositories&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;google&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;mavenCentral&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;maven&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://jitpack.io"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;dependencyResolutionManagement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;repositoriesMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RepositoriesMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FAIL_ON_PROJECT_REPOS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;repositories&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;google&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;mavenCentral&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;maven&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://jitpack.io"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ⭐ Recommended: Version Catalog setup (Latest Android Studio)
&lt;/h1&gt;

&lt;p&gt;Inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="err"&gt;gradle/libs.versions.toml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[versions]&lt;/span&gt;
&lt;span class="py"&gt;toastlib&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"v2.0.0"&lt;/span&gt;

&lt;span class="nn"&gt;[libraries]&lt;/span&gt;
&lt;span class="py"&gt;toastlib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;module&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"com.github.TutorialsAndroid:Toast-Library"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;version.ref&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"toastlib"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gradle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;libs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toastlib&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Alternative: Direct dependency
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.github.TutorialsAndroid:Toast-Library:v2.0.0"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🚀 Usage Examples
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Success Toast
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ToastLib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Saved successfully"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Error Toast
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ToastLib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Something went wrong"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Info Toast
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ToastLib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Welcome back!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Default Toast
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ToastLib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;show&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Default toast"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📍 Custom Position Example
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ToastLib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;show&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"Top message"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;ToastLib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ToastType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INFO&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;Gravity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TOP&lt;/span&gt;
&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📱 Why this library exists
&lt;/h1&gt;

&lt;p&gt;Older approaches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;toast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getView&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setBackgroundColor&lt;/span&gt;&lt;span class="o"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;no longer work consistently on modern Android versions.&lt;/p&gt;

&lt;p&gt;This library solves that using:&lt;/p&gt;

&lt;p&gt;✔ custom layouts&lt;br&gt;
✔ vector icons&lt;br&gt;
✔ Material-style backgrounds&lt;br&gt;
✔ Android 11+ compatibility&lt;/p&gt;




&lt;h1&gt;
  
  
  📦 GitHub Repo
&lt;/h1&gt;

&lt;p&gt;⭐ Check it out here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TutorialsAndroid/Toast-Library" rel="noopener noreferrer"&gt;https://github.com/TutorialsAndroid/Toast-Library&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback and contributions welcome!&lt;/p&gt;




&lt;h1&gt;
  
  
  🛣 Roadmap
&lt;/h1&gt;

&lt;p&gt;Next updates coming soon:&lt;/p&gt;

&lt;p&gt;✨ toast animations&lt;br&gt;
✨ builder pattern API&lt;br&gt;
✨ dark mode support&lt;br&gt;
✨ custom icon support&lt;/p&gt;




&lt;p&gt;If this helps your Android projects, consider giving the repo a ⭐&lt;/p&gt;

</description>
      <category>android</category>
      <category>java</category>
      <category>mobiledev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Introducing KAlert.js — A lightweight animated alert dialog library for JavaScript</title>
      <dc:creator>Akshay</dc:creator>
      <pubDate>Tue, 28 Apr 2026 07:41:27 +0000</pubDate>
      <link>https://forem.com/coderx09/introducing-kalertjs-a-lightweight-animated-alert-dialog-library-for-javascript-595g</link>
      <guid>https://forem.com/coderx09/introducing-kalertjs-a-lightweight-animated-alert-dialog-library-for-javascript-595g</guid>
      <description>&lt;h1&gt;
  
  
  Introducing KAlert.js — A Lightweight Modern Alert Dialog Library for JavaScript 🚀
&lt;/h1&gt;

&lt;p&gt;While working on my frontend projects, I often needed a clean and modern alternative to the default browser alert dialogs.&lt;/p&gt;

&lt;p&gt;The native browser alert:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is functional, but it looks outdated and isn't customizable.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;KAlert.js&lt;/strong&gt; — a lightweight, animated, Promise-based alert dialog library that works instantly via CDN with zero setup required.&lt;/p&gt;




&lt;h1&gt;
  
  
  ✨ Features
&lt;/h1&gt;

&lt;p&gt;KAlert.js provides:&lt;/p&gt;

&lt;p&gt;✅ Animated modal dialogs&lt;br&gt;
✅ Promise-based confirm dialogs&lt;br&gt;
✅ Font Awesome icon support (auto-loaded)&lt;br&gt;
✅ Blur background overlay&lt;br&gt;
✅ Success / error / warning / info alert types&lt;br&gt;
✅ Zero dependencies&lt;br&gt;
✅ CDN-ready usage&lt;br&gt;
✅ Lightweight and fast&lt;/p&gt;


&lt;h1&gt;
  
  
  📦 Install via CDN (No setup required)
&lt;/h1&gt;

&lt;p&gt;Just include one script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/gh/TutorialsAndroid/KAlert@v1.1.1/kalertdialog.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it.&lt;/p&gt;

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




&lt;h1&gt;
  
  
  🚀 Basic Usage Example
&lt;/h1&gt;

&lt;p&gt;Show a success alert:&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;KAlert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Saved successfully!&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;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other supported alert types:&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;success&lt;/span&gt;
&lt;span class="nx"&gt;error&lt;/span&gt;
&lt;span class="nx"&gt;warning&lt;/span&gt;
&lt;span class="nx"&gt;info&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&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;KAlert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Something went wrong!&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;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ✅ Confirm Dialog Example (Promise-Based)
&lt;/h1&gt;

&lt;p&gt;Unlike traditional confirm dialogs, KAlert uses a modern Promise API:&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;KAlert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Delete this file?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User confirmed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User cancelled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes it easier to integrate into modern JavaScript workflows.&lt;/p&gt;




&lt;h1&gt;
  
  
  🎨 Alert Types Available
&lt;/h1&gt;

&lt;p&gt;KAlert currently supports:&lt;/p&gt;

&lt;p&gt;🟢 success&lt;br&gt;
🔴 error&lt;br&gt;
🟡 warning&lt;br&gt;
🔵 info&lt;/p&gt;

&lt;p&gt;Each alert includes animated UI and Font Awesome icons automatically.&lt;/p&gt;




&lt;h1&gt;
  
  
  💡 Why I Built This Library
&lt;/h1&gt;

&lt;p&gt;Many alert dialog libraries are powerful but often:&lt;/p&gt;

&lt;p&gt;• too large&lt;br&gt;
• require configuration&lt;br&gt;
• need multiple imports&lt;br&gt;
• depend on frameworks&lt;/p&gt;

&lt;p&gt;KAlert.js focuses on simplicity:&lt;/p&gt;

&lt;p&gt;One script.&lt;br&gt;
Instant usage.&lt;br&gt;
Clean UI.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧪 Live Example
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;KAlert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome to KAlert!&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;info&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;KAlert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Continue?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📂 GitHub Repository
&lt;/h1&gt;

&lt;p&gt;You can check out the project here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TutorialsAndroid/KAlert" rel="noopener noreferrer"&gt;https://github.com/TutorialsAndroid/KAlert&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, suggestions, and contributions are welcome!&lt;/p&gt;




&lt;h1&gt;
  
  
  🛠 Roadmap
&lt;/h1&gt;

&lt;p&gt;Planned features for upcoming versions:&lt;/p&gt;

&lt;p&gt;• custom dialog titles&lt;br&gt;
• input prompt dialogs&lt;br&gt;
• dark mode support&lt;br&gt;
• theme customization&lt;br&gt;
• button text customization&lt;/p&gt;




&lt;p&gt;If you’re building frontend projects and want a clean alert dialog alternative without extra setup, give &lt;strong&gt;KAlert.js&lt;/strong&gt; a try.&lt;/p&gt;

&lt;p&gt;I’d love to hear your feedback 🙂&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
