<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Akshay</title>
    <description>The latest articles on DEV Community by Akshay (@coderx09).</description>
    <link>https://dev.to/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>DEV Community: Akshay</title>
      <link>https://dev.to/coderx09</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/coderx09"/>
    <language>en</language>
    <item>
      <title>KAlertDialog: A Beautiful Material Alert Dialog Library for Android</title>
      <dc:creator>Akshay</dc:creator>
      <pubDate>Wed, 20 May 2026 06:31:37 +0000</pubDate>
      <link>https://dev.to/coderx09/kalertdialog-a-beautiful-material-alert-dialog-library-for-android-5dgc</link>
      <guid>https://dev.to/coderx09/kalertdialog-a-beautiful-material-alert-dialog-library-for-android-5dgc</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%2Fzzw0lhikm6fosrq09i4q.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%2Fzzw0lhikm6fosrq09i4q.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  KAlertDialog: A Beautiful Material Alert Dialog Library for Android
&lt;/h1&gt;

&lt;p&gt;Dialogs are one of the most common UI components in Android apps.&lt;/p&gt;

&lt;p&gt;We use them for confirmations, errors, success messages, loading states, input forms, warnings, and many other user interactions.&lt;/p&gt;

&lt;p&gt;But the default Android &lt;code&gt;AlertDialog&lt;/code&gt; can feel very basic when you are building a modern production app.&lt;/p&gt;

&lt;p&gt;That is why I built &lt;strong&gt;KAlertDialog&lt;/strong&gt; — a beautiful, customizable, Material-style alert dialog library for Android.&lt;/p&gt;

&lt;p&gt;GitHub Repository:&lt;br&gt;
&lt;a href="https://github.com/TutorialsAndroid/KAlertDialog" rel="noopener noreferrer"&gt;https://github.com/TutorialsAndroid/KAlertDialog&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What is KAlertDialog?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;KAlertDialog&lt;/strong&gt; is an Android library that helps developers create beautiful alert dialogs with very little code.&lt;/p&gt;

&lt;p&gt;It supports multiple dialog types such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Success dialogs&lt;/li&gt;
&lt;li&gt;Error dialogs&lt;/li&gt;
&lt;li&gt;Warning dialogs&lt;/li&gt;
&lt;li&gt;Normal message dialogs&lt;/li&gt;
&lt;li&gt;Progress/loading dialogs&lt;/li&gt;
&lt;li&gt;Input field dialogs&lt;/li&gt;
&lt;li&gt;Custom image dialogs&lt;/li&gt;
&lt;li&gt;URL image dialogs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is designed for Android developers who want clean, modern, and customizable dialogs without writing custom layouts again and again.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;While building Android apps, I noticed that dialogs are used everywhere.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Showing a success message after saving data&lt;/li&gt;
&lt;li&gt;Showing an error when something fails&lt;/li&gt;
&lt;li&gt;Asking confirmation before deleting something&lt;/li&gt;
&lt;li&gt;Displaying a progress loader while an API request is running&lt;/li&gt;
&lt;li&gt;Taking user input in a small popup&lt;/li&gt;
&lt;li&gt;Showing custom images inside dialogs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of creating custom XML layouts for each case, I wanted a reusable library that makes this easy.&lt;/p&gt;

&lt;p&gt;That idea became &lt;strong&gt;KAlertDialog&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Add Maven Central and JitPack in your project repositories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="k"&gt;repositories&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;mavenCentral&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;maven&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="s1"&gt;'https://jitpack.io'&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add the dependency in your app-level &lt;code&gt;build.gradle&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="k"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'io.github.tutorialsandroid:kalertdialog:20.5.11'&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'com.github.TutorialsAndroid:progressx:v6.0.19'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Basic Usage
&lt;/h2&gt;

&lt;p&gt;Creating a simple dialog is very easy.&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Here's a message!"&lt;/span&gt;&lt;span class="o"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With content text:&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Here's a message!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"It's pretty, isn't it?"&lt;/span&gt;&lt;span class="o"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is all you need to show a clean alert dialog.&lt;/p&gt;




&lt;h2&gt;
  
  
  Success Dialog
&lt;/h2&gt;

&lt;p&gt;Use a success dialog when an operation completes successfully.&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SUCCESS_TYPE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Good job!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You clicked the button!"&lt;/span&gt;&lt;span class="o"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can be used after:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Form submission&lt;/li&gt;
&lt;li&gt;Payment success&lt;/li&gt;
&lt;li&gt;Profile update&lt;/li&gt;
&lt;li&gt;File upload&lt;/li&gt;
&lt;li&gt;Data save operation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Error Dialog
&lt;/h2&gt;

&lt;p&gt;Use an error dialog when something goes wrong.&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ERROR_TYPE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Oops..."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API failures&lt;/li&gt;
&lt;li&gt;Validation errors&lt;/li&gt;
&lt;li&gt;Login errors&lt;/li&gt;
&lt;li&gt;Network issues&lt;/li&gt;
&lt;li&gt;Payment failures&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Warning Dialog
&lt;/h2&gt;

&lt;p&gt;Warning dialogs are useful before performing destructive or sensitive actions.&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;WARNING_TYPE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Are you sure?"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Won't be able to recover this file!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfirmClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Yes, delete it!"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also attach a click listener:&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;WARNING_TYPE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Are you sure?"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Won't be able to recover this file!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfirmClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Yes, delete it!"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sDialog&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;sDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dismissWithAnimation&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;})&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showCancelButton&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCancelClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cancel"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sDialog&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;sDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cancel&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;})&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Progress Dialog
&lt;/h2&gt;

&lt;p&gt;KAlertDialog also supports progress dialogs.&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="nc"&gt;KAlertDialog&lt;/span&gt; &lt;span class="n"&gt;pDialog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PROGRESS_TYPE&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;pDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProgressHelper&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;setBarColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#A5DC86"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;pDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Loading"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;pDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCancelable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;pDialog&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful when your app is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loading data&lt;/li&gt;
&lt;li&gt;Calling an API&lt;/li&gt;
&lt;li&gt;Uploading a file&lt;/li&gt;
&lt;li&gt;Processing a request&lt;/li&gt;
&lt;li&gt;Waiting for Firebase/database operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also customize the progress helper dynamically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Input Field Dialog
&lt;/h2&gt;

&lt;p&gt;KAlertDialog supports input dialogs too.&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="nc"&gt;KAlertDialog&lt;/span&gt; &lt;span class="n"&gt;dialog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INPUT_TYPE&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setInputFieldHint&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Write message"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setInputFieldText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Edit Text"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfirmClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OK"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kAlertDialog&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;kAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dismissWithAnimation&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;inputText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInputText&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="nc"&gt;Toast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;makeText&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="n"&gt;inputText&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Toast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;LENGTH_SHORT&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="o"&gt;});&lt;/span&gt;
&lt;span class="n"&gt;dialog&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="n"&gt;dialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getWindow&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;clearFlags&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;WindowManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;LayoutParams&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FLAG_NOT_FOCUSABLE&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="nc"&gt;WindowManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;LayoutParams&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FLAG_ALT_FOCUSABLE_IM&lt;/span&gt;
&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The latest version supports setting default text inside the input field using:&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;dialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setInputFieldText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is helpful when users need to edit an existing value.&lt;/p&gt;




&lt;h2&gt;
  
  
  Custom Image Dialog
&lt;/h2&gt;

&lt;p&gt;You can show a custom drawable image inside a dialog.&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CUSTOM_IMAGE_TYPE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sweet!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Here's a custom image."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCustomImage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;custom_img&lt;/span&gt;&lt;span class="o"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brand illustrations&lt;/li&gt;
&lt;li&gt;Achievement popups&lt;/li&gt;
&lt;li&gt;Custom app messages&lt;/li&gt;
&lt;li&gt;Empty states&lt;/li&gt;
&lt;li&gt;Promotional dialogs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  URL Image Dialog
&lt;/h2&gt;

&lt;p&gt;You can also show an image from a URL.&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;URL_IMAGE_TYPE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"KAlertDialog"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Here's a custom image."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setURLImage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"put your image url"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IMAGE_BIG&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfirmClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OK"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Supported display types include:&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IMAGE_BIG&lt;/span&gt;
&lt;span class="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IMAGE_CIRCLE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Dark Mode Support
&lt;/h2&gt;

&lt;p&gt;KAlertDialog supports auto dark mode.&lt;/p&gt;

&lt;p&gt;You can also tint vector drawables when the app is running in night mode.&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CUSTOM_IMAGE_TYPE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sweet!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Here's a custom image."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCustomImage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;vector_drawable&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setDrawableTintOnNightMode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;red&lt;/span&gt;&lt;span class="o"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps the dialog look good in both light and dark themes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Custom Button Drawable
&lt;/h2&gt;

&lt;p&gt;The latest update also adds support for custom drawable backgrounds for confirm and cancel buttons.&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NORMAL_TYPE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Lorem Ipsum"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Lorem Ipsum is simply dummy text of the printing and typesetting industry."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfirmClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OK"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCancelClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cancel"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;confirmButtonDrawable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;red_button_background&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cancelButtonDrawable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;button_background&lt;/span&gt;&lt;span class="o"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes it easier to match dialog buttons with your app branding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Change Font
&lt;/h2&gt;

&lt;p&gt;You can apply custom fonts to the title.&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NORMAL_TYPE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Lorem Ipsum"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleFontAssets&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fonts/os.ttf"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Lorem Ipsum is simply dummy text of the printing and typesetting industry."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfirmClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OK"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also change the content font:&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NORMAL_TYPE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Lorem Ipsum"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Lorem Ipsum is simply dummy text of the printing and typesetting industry."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentFont&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;font&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sf&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfirmClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OK"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Change Text Colors
&lt;/h2&gt;

&lt;p&gt;You can customize title and content colors.&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="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;yourColorName&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;yourColorName&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also customize button colors:&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="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;confirmButtonColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;colorPrimary&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cancelButtonColor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;colorAccent&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And button text colors:&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="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfirmClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OK"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clickListener&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCancelClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CANCEL"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clickListener&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Change Content Alignment
&lt;/h2&gt;

&lt;p&gt;KAlertDialog allows you to control content text alignment.&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="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentTextAlignment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TEXT_ALIGNMENT_VIEW_START&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;START&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For center alignment:&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="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentTextAlignment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TEXT_ALIGNMENT_CENTER&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;CENTER&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is helpful when your app needs different text layouts for different dialog types.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hide Confirm or Cancel Button
&lt;/h2&gt;

&lt;p&gt;You can hide confirm or cancel buttons when needed.&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CUSTOM_IMAGE_TYPE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sweet!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Here's a custom image."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCustomImage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;custom_img&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showConfirmButton&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showCancelButton&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Change Alert Type Dynamically
&lt;/h2&gt;

&lt;p&gt;You can change the dialog type after a user action.&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KAlertDialog&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="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;WARNING_TYPE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Are you sure?"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Won't be able to recover this file!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showCancelButton&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCancelClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No, cancel"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sDialog&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
                &lt;span class="n"&gt;sDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Your imaginary file is safe :)"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showCancelButton&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfirmClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OK"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;changeAlertType&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ERROR_TYPE&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfirmClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Yes, delete it!"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sDialog&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
                &lt;span class="n"&gt;sDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTitleText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Deleted!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showCancelButton&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContentText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfirmClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OK"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;changeAlertType&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;KAlertDialog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SUCCESS_TYPE&lt;/span&gt;&lt;span class="o"&gt;))&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful for confirmation flows where you want the dialog to update after the user clicks a button.&lt;/p&gt;




&lt;h2&gt;
  
  
  Main Features
&lt;/h2&gt;

&lt;p&gt;KAlertDialog includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Material-style alert dialogs&lt;/li&gt;
&lt;li&gt;AndroidX support&lt;/li&gt;
&lt;li&gt;Auto dark mode&lt;/li&gt;
&lt;li&gt;Success dialog&lt;/li&gt;
&lt;li&gt;Error dialog&lt;/li&gt;
&lt;li&gt;Warning dialog&lt;/li&gt;
&lt;li&gt;Progress dialog&lt;/li&gt;
&lt;li&gt;Input field dialog&lt;/li&gt;
&lt;li&gt;Custom image dialog&lt;/li&gt;
&lt;li&gt;URL image dialog&lt;/li&gt;
&lt;li&gt;Custom fonts&lt;/li&gt;
&lt;li&gt;Custom title and content colors&lt;/li&gt;
&lt;li&gt;Custom button colors&lt;/li&gt;
&lt;li&gt;Custom button drawables&lt;/li&gt;
&lt;li&gt;Custom button text colors&lt;/li&gt;
&lt;li&gt;Vector drawable tinting in night mode&lt;/li&gt;
&lt;li&gt;Title and content alignment&lt;/li&gt;
&lt;li&gt;Dynamic alert type change&lt;/li&gt;
&lt;li&gt;Confirm and cancel listeners&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When Should You Use It?
&lt;/h2&gt;

&lt;p&gt;You can use KAlertDialog when your Android app needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better looking alert dialogs&lt;/li&gt;
&lt;li&gt;Reusable dialog components&lt;/li&gt;
&lt;li&gt;Fast implementation&lt;/li&gt;
&lt;li&gt;Customizable buttons&lt;/li&gt;
&lt;li&gt;Dark mode support&lt;/li&gt;
&lt;li&gt;Input popup support&lt;/li&gt;
&lt;li&gt;Progress/loading dialogs&lt;/li&gt;
&lt;li&gt;Clean Java API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is useful for both small apps and production-level Android projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  GitHub Repository
&lt;/h2&gt;

&lt;p&gt;You can find the complete source code and documentation here:&lt;/p&gt;

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

&lt;p&gt;If you find it useful, please consider giving it a star on GitHub.&lt;br&gt;
It helps the project reach more Android developers.&lt;/p&gt;


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

&lt;p&gt;KAlertDialog was created to make Android dialogs more beautiful, simple, and customizable.&lt;/p&gt;

&lt;p&gt;Instead of spending time creating custom dialog layouts for every use case, developers can use KAlertDialog to quickly add polished dialogs to their apps.&lt;/p&gt;

&lt;p&gt;If you are building Android apps in Java and want a modern alert dialog library, give KAlertDialog a try.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'io.github.tutorialsandroid:kalertdialog:20.5.11'&lt;/span&gt;
&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'com.github.TutorialsAndroid:progressx:v6.0.19'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Happy coding 🚀&lt;/p&gt;

</description>
      <category>android</category>
      <category>java</category>
      <category>opensource</category>
      <category>mobile</category>
    </item>
    <item>
      <title>I Built Windows11Alert — A Windows Utility That Sends Telegram Alerts When My PC Turns On</title>
      <dc:creator>Akshay</dc:creator>
      <pubDate>Mon, 18 May 2026 07:43:55 +0000</pubDate>
      <link>https://dev.to/coderx09/i-built-windows11alert-a-windows-utility-that-sends-telegram-alerts-when-my-pc-turns-on-51d4</link>
      <guid>https://dev.to/coderx09/i-built-windows11alert-a-windows-utility-that-sends-telegram-alerts-when-my-pc-turns-on-51d4</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%2F16bpibe2lvv115ibh34d.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%2F16bpibe2lvv115ibh34d.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes the best projects are not huge.&lt;/p&gt;

&lt;p&gt;Sometimes they are small utilities that solve one specific problem really well.&lt;/p&gt;

&lt;p&gt;I wanted a simple way to know when my Windows PC turns on, restarts, or was previously shut down. I did not want a heavy monitoring dashboard or an enterprise-level monitoring tool. I just wanted a clean Telegram notification with useful details.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Windows11Alert&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is a lightweight Windows utility that sends Telegram alerts when a PC starts. It also detects the previous shutdown or restart event from Windows Event Logs and reports it on the next startup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TutorialsAndroid/Windows11Alert/releases/download/v1.0.0/Windows11Alert_Setup.exe" rel="noopener noreferrer"&gt;Download Now&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub repository:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;p&gt;Latest release:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/TutorialsAndroid/Windows11Alert/releases/latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What Windows11Alert does
&lt;/h2&gt;

&lt;p&gt;Windows11Alert runs automatically when Windows starts and sends a Telegram message with system details.&lt;/p&gt;

&lt;p&gt;It can report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PC name&lt;/li&gt;
&lt;li&gt;Windows username&lt;/li&gt;
&lt;li&gt;Local IP address&lt;/li&gt;
&lt;li&gt;Public IP address&lt;/li&gt;
&lt;li&gt;Date and time&lt;/li&gt;
&lt;li&gt;Boot time&lt;/li&gt;
&lt;li&gt;OS version&lt;/li&gt;
&lt;li&gt;Processor&lt;/li&gt;
&lt;li&gt;Architecture&lt;/li&gt;
&lt;li&gt;RAM details&lt;/li&gt;
&lt;li&gt;Previous shutdown/restart event&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The basic flow looks 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;Windows starts
        ↓
Windows11Alert runs automatically
        ↓
It checks Windows Event Logs
        ↓
It sends previous shutdown/restart details
        ↓
It sends current startup details
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Example Telegram message
&lt;/h2&gt;

&lt;p&gt;The Telegram message looks something 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;🟢 PC Turned On

🖥️ PC Name: DEV2
👤 User: HP-User1

🌐 Local IP: 192.168.0.5
🌍 Public IP: xxx.xxx.xxx.xxx

📅 Date &amp;amp; Time: 2026-05-16 15:30:12
⏱️ Boot Time: 2026-05-16 15:29:40

💻 OS: Windows 11
🔢 OS Version: 10.0.xxxxx
⚙️ Processor: Intel64 Family...
🏗️ Architecture: AMD64
🧠 RAM: 15.78 GB Total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a previous shutdown or restart is detected, the app sends another message with details from the Windows Event Log.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;The original idea was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Send me a Telegram message whenever my PC turns on.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That part was easy.&lt;/p&gt;

&lt;p&gt;Then I wanted to add a shutdown alert.&lt;/p&gt;

&lt;p&gt;At first, I tried sending a Telegram message during shutdown itself. I tested multiple approaches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task Scheduler shutdown trigger
Group Policy shutdown script
Hidden window shutdown detection
WM_QUERYENDSESSION
WM_ENDSESSION
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some methods worked when tested manually, but failed during actual shutdown.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because Windows may close network services very quickly during shutdown. That means the app might detect shutdown but still fail to send the Telegram message before the network closes.&lt;/p&gt;

&lt;p&gt;So I changed the approach.&lt;/p&gt;

&lt;p&gt;Instead of trying to send the shutdown alert during shutdown, the app reads Windows Event Logs on the next startup and reports the previous shutdown/restart event.&lt;/p&gt;

&lt;p&gt;This made the system much more reliable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;p&gt;This project uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Python
Telegram Bot API
Windows Registry
Windows Event Logs
PyInstaller
Inno Setup
python-dotenv
psutil
requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python handles the core logic.&lt;/p&gt;

&lt;p&gt;Telegram Bot API sends the messages.&lt;/p&gt;

&lt;p&gt;PyInstaller converts the Python script into a standalone Windows executable.&lt;/p&gt;

&lt;p&gt;Inno Setup creates the installer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Telegram bot setup
&lt;/h2&gt;

&lt;p&gt;Telegram is a great option for quick alert systems.&lt;/p&gt;

&lt;p&gt;To use Windows11Alert, the user needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
TELEGRAM_CHAT_ID=your_telegram_chat_id_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can create a Telegram bot using &lt;strong&gt;BotFather&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Telegram.&lt;/li&gt;
&lt;li&gt;Search for &lt;code&gt;BotFather&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Send:
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Create your bot.&lt;/li&gt;
&lt;li&gt;Copy the bot token.&lt;/li&gt;
&lt;li&gt;Send a message to your bot.&lt;/li&gt;
&lt;li&gt;Open:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.telegram.org/botYOUR_BOT_TOKEN/getUpdates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Find your &lt;code&gt;chat.id&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Keeping credentials safer with &lt;code&gt;.env&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;One important thing I wanted to avoid was hardcoding the bot token in the Python file.&lt;/p&gt;

&lt;p&gt;Hardcoding secrets is dangerous because if the project is pushed to GitHub, the token can leak.&lt;/p&gt;

&lt;p&gt;So Windows11Alert uses a &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TELEGRAM_BOT_TOKEN=your_bot_token
TELEGRAM_CHAT_ID=your_chat_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the &lt;code&gt;.env&lt;/code&gt; file is ignored in Git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.env
build/
dist/
Output/
__pycache__/
*.spec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps credentials out of the repository.&lt;/p&gt;

&lt;p&gt;Of course, &lt;code&gt;.env&lt;/code&gt; is not perfect security. If something is stored on a local machine, the local user or admin can read it. But it is much better than hardcoding secrets into source code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Auto-start using Windows Registry
&lt;/h2&gt;

&lt;p&gt;To make the app run automatically when Windows starts, I used this registry path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Python script adds itself to startup using the &lt;code&gt;winreg&lt;/code&gt; module.&lt;/p&gt;

&lt;p&gt;This means the app starts automatically whenever the current Windows user logs in.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reading shutdown events from Windows Event Logs
&lt;/h2&gt;

&lt;p&gt;The app checks Windows System Event Logs for shutdown and restart events.&lt;/p&gt;

&lt;p&gt;Some useful event IDs are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1074 - Planned shutdown/restart initiated by user or process
6006 - Event Log service stopped, usually clean shutdown
6008 - Unexpected shutdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of depending on live shutdown-time Telegram sending, Windows11Alert checks these events after the PC starts again.&lt;/p&gt;

&lt;p&gt;That makes the shutdown/restart detection more reliable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Packaging the app with PyInstaller
&lt;/h2&gt;

&lt;p&gt;After the Python script was ready, I converted it into an EXE.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyinstaller &lt;span class="nt"&gt;--onefile&lt;/span&gt; &lt;span class="nt"&gt;--noconsole&lt;/span&gt; &lt;span class="nt"&gt;--icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;icons/alert.ico &lt;span class="nt"&gt;--name&lt;/span&gt; Windows11Alert Windows11Alert.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dist/Windows11Alert.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also created a separate uninstaller utility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyinstaller &lt;span class="nt"&gt;--onefile&lt;/span&gt; &lt;span class="nt"&gt;--noconsole&lt;/span&gt; &lt;span class="nt"&gt;--icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;icons/uninstaller.ico &lt;span class="nt"&gt;--name&lt;/span&gt; uninstaller uninstaller.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Creating a Windows installer with Inno Setup
&lt;/h2&gt;

&lt;p&gt;After building the EXE, I used Inno Setup to create a proper Windows installer.&lt;/p&gt;

&lt;p&gt;The installer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copies Windows11Alert.exe to Program Files
Asks for Telegram Bot Token and Chat ID
Creates the .env file locally
Adds the app to Windows startup
Creates shortcuts
Handles uninstall cleanup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This made the project feel like an actual Windows application instead of just a Python script.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project structure
&lt;/h2&gt;

&lt;p&gt;The final project structure looks 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;TELEGRAMPCALERT/
│
├── icons/
│   ├── alert.ico
│   └── uninstaller.ico
│
├── Windows11Alert.py
├── uninstaller.py
├── Windows11Alert_Setup.iss
├── README.md
├── .gitignore
│
├── build/
├── dist/
└── Output/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generated folders like &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;dist&lt;/code&gt;, and &lt;code&gt;Output&lt;/code&gt; are ignored from GitHub.&lt;/p&gt;




&lt;h2&gt;
  
  
  GitHub release
&lt;/h2&gt;

&lt;p&gt;I created a GitHub release and attached the installer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Windows11Alert_Setup.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes it easy for anyone to download and install the app.&lt;/p&gt;

&lt;p&gt;Release page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/TutorialsAndroid/Windows11Alert/releases/latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;This project taught me a lot about how Windows behaves during startup and shutdown.&lt;/p&gt;

&lt;p&gt;The biggest lesson was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do not depend on network operations during shutdown.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if a shutdown script works manually, it may fail during actual shutdown because Windows is already closing services.&lt;/p&gt;

&lt;p&gt;Reading shutdown events on the next startup is a much more reliable approach.&lt;/p&gt;

&lt;p&gt;I also learned that building a complete desktop utility is not only about writing the Python code.&lt;/p&gt;

&lt;p&gt;A polished tool also needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Installer
Uninstaller
Startup registration
Credential handling
Logs
Documentation
Release assets
GitHub README
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Windows11Alert has some limitations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;It is Windows-only
Instant shutdown-time Telegram alerts are not guaranteed
Unexpected power loss may not always create a clean shutdown event
Telegram credentials are stored locally
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For personal monitoring, this setup works well.&lt;/p&gt;

&lt;p&gt;For production or enterprise-level monitoring, a proper background service and backend-based architecture would be better.&lt;/p&gt;




&lt;h2&gt;
  
  
  Future improvements
&lt;/h2&gt;

&lt;p&gt;Some ideas I may add later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;System tray icon
Encrypted local config
Telegram test button during setup
Discord webhook support
Email alert support
Daily summary report
Windows service version
Better installer UI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Download
&lt;/h2&gt;

&lt;p&gt;You can download the latest Windows installer here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/TutorialsAndroid/Windows11Alert/releases/latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Contributions are welcome
&lt;/h2&gt;

&lt;p&gt;Contributions, suggestions, and bug reports are welcome.&lt;/p&gt;

&lt;p&gt;You can help by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Opening issues
Suggesting features
Improving documentation
Refactoring code
Adding notification platforms
Improving installer/uninstaller behavior
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Windows11Alert started as a small Python experiment, but it became a complete Windows utility with Telegram integration, startup monitoring, Windows Event Log reading, EXE packaging, installer support, and uninstall cleanup.&lt;/p&gt;

&lt;p&gt;It is a good reminder that practical projects do not always need to be huge.&lt;/p&gt;

&lt;p&gt;Sometimes a useful tool is just a small idea executed properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows11Alert tells you when your PC starts and what happened before it did.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>microsoft</category>
      <category>telegram</category>
      <category>automation</category>
    </item>
    <item>
      <title>How I Built a Native Video Compressor for 30 GB+ Files Using FFmpeg and Electron</title>
      <dc:creator>Akshay</dc:creator>
      <pubDate>Wed, 13 May 2026 09:51:14 +0000</pubDate>
      <link>https://dev.to/coderx09/how-i-built-a-native-video-compressor-for-30-gb-files-using-ffmpeg-and-electron-3do7</link>
      <guid>https://dev.to/coderx09/how-i-built-a-native-video-compressor-for-30-gb-files-using-ffmpeg-and-electron-3do7</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%2Fdnghcllft6pog65xziec.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%2Fdnghcllft6pog65xziec.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Online video compressors are great — until you hit a &lt;strong&gt;35 GB file&lt;/strong&gt; and watch the upload bar crawl to 1% before timing out.&lt;/p&gt;

&lt;p&gt;I needed a tool that could handle raw production footage without ever sending it over the network.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;VideoSquash Pro&lt;/strong&gt; — a free, open-source desktop app that runs &lt;strong&gt;FFmpeg natively&lt;/strong&gt; on your Windows machine.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk through the architecture, the tech stack, and how you can use or contribute to the project.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture at a Glance
&lt;/h2&gt;

&lt;p&gt;The app consists of three main layers:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Electron
&lt;/h3&gt;

&lt;p&gt;Electron hosts the UI using HTML, CSS, and JavaScript.&lt;/p&gt;

&lt;p&gt;It also manages the native child process that runs FFmpeg in the background.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. FFmpeg Binary
&lt;/h3&gt;

&lt;p&gt;FFmpeg is the real compression engine.&lt;/p&gt;

&lt;p&gt;Instead of relying on browser-based encoding, VideoSquash Pro spawns a native FFmpeg binary with precise arguments based on the selected settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. IPC Bridge
&lt;/h3&gt;

&lt;p&gt;The IPC bridge streams real-time progress from FFmpeg to the renderer using Electron’s &lt;code&gt;ipcMain&lt;/code&gt;, &lt;code&gt;ipcRenderer&lt;/code&gt;, and preload setup.&lt;/p&gt;

&lt;p&gt;This allows the UI to stay responsive while FFmpeg works in the background.&lt;/p&gt;

&lt;p&gt;All processing happens offline.&lt;/p&gt;

&lt;p&gt;No internet connection is needed after the initial download.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Can Control
&lt;/h2&gt;

&lt;p&gt;The UI provides an industry-standard preset system plus full manual control over every FFmpeg parameter.&lt;/p&gt;

&lt;p&gt;Developers will appreciate that it does not hide the complexity.&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="c1"&gt;// Example of the FFmpeg spawn process, simplified&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-y&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;-i&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;inputPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-c:v&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;libx264&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;-crf&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;30&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;-vf&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;scale='min(1920,iw)':'min(1920,ih)':force_original_aspect_ratio=decrease&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;-c:a&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;aac&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;-b:a&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;128k&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;-movflags&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;+faststart&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="nx"&gt;outputPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;proc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ffmpegPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data&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="nx"&gt;data&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;// Parse progress data and send it to the renderer&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The app supports control over:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Codec&lt;/li&gt;
&lt;li&gt;CRF quality&lt;/li&gt;
&lt;li&gt;Resolution&lt;/li&gt;
&lt;li&gt;Output format&lt;/li&gt;
&lt;li&gt;Audio settings&lt;/li&gt;
&lt;li&gt;Compression presets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;p&gt;Give beginners easy presets, but still give developers real control.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-Time Progress Tracking
&lt;/h2&gt;

&lt;p&gt;One thing I did not want was a fake progress bar.&lt;/p&gt;

&lt;p&gt;So VideoSquash Pro uses &lt;code&gt;ffprobe&lt;/code&gt; to get the exact duration of the input video.&lt;/p&gt;

&lt;p&gt;Then, while FFmpeg is running, the app parses FFmpeg’s structured progress output and reads values like &lt;code&gt;out_time_ms&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That value is compared against the total duration to calculate a real percentage from 0 to 100.&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;progress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentTimeMs&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;totalDurationMs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives users a progress bar that actually represents the compression process.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Not FFmpeg.wasm?
&lt;/h2&gt;

&lt;p&gt;FFmpeg.wasm is amazing for browser-based video tools.&lt;/p&gt;

&lt;p&gt;But for very large files, it has serious limitations.&lt;/p&gt;

&lt;p&gt;Browser-based FFmpeg runs inside WebAssembly memory limits, which makes it unsuitable for huge files like 10 GB, 30 GB, or 50 GB videos.&lt;/p&gt;

&lt;p&gt;Native FFmpeg is different.&lt;/p&gt;

&lt;p&gt;It streams directly from disk.&lt;/p&gt;

&lt;p&gt;It does not load the entire video into RAM.&lt;/p&gt;

&lt;p&gt;That is the main reason VideoSquash Pro can handle very large files without crashing the browser or hitting memory limits.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Try It
&lt;/h2&gt;

&lt;p&gt;You can download the pre-built Windows installer from the latest release:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TutorialsAndroid/video-squash-pro/releases/latest" rel="noopener noreferrer"&gt;https://github.com/TutorialsAndroid/video-squash-pro/releases/latest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or you can clone the repo and run it locally.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/TutorialsAndroid/video-squash-pro.git
&lt;span class="nb"&gt;cd &lt;/span&gt;video-squash-pro
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will need to provide your own &lt;code&gt;ffmpeg.exe&lt;/code&gt; and &lt;code&gt;ffprobe.exe&lt;/code&gt; inside the &lt;code&gt;assets/&lt;/code&gt; folder if you are building it manually.&lt;/p&gt;

&lt;p&gt;The entire source code is open source and MIT licensed.&lt;/p&gt;

&lt;p&gt;Pull requests are welcome.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;I am planning to add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Persistent preset saving&lt;/li&gt;
&lt;li&gt;Hardware acceleration for Intel QSV and NVIDIA NVENC&lt;/li&gt;
&lt;li&gt;Automatic file queuing&lt;/li&gt;
&lt;li&gt;Multi-threaded compression&lt;/li&gt;
&lt;li&gt;macOS and Linux builds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of these features interest you, or if you have other ideas, feel free to open an issue or drop a comment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Landing page:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://tutorialsandroid.github.io/video-squash-pro/" rel="noopener noreferrer"&gt;https://tutorialsandroid.github.io/video-squash-pro/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repo:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/TutorialsAndroid/video-squash-pro" rel="noopener noreferrer"&gt;https://github.com/TutorialsAndroid/video-squash-pro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download Installer:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/TutorialsAndroid/video-squash-pro/releases/latest" rel="noopener noreferrer"&gt;https://github.com/TutorialsAndroid/video-squash-pro/releases/latest&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you have ever hit a wall with online video compressors, give &lt;strong&gt;VideoSquash Pro&lt;/strong&gt; a try.&lt;/p&gt;

&lt;p&gt;And if you are a developer, I would love to hear your thoughts on the architecture.&lt;/p&gt;

&lt;p&gt;Drop a comment below.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dev.to Tags
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;electron&lt;/code&gt; &lt;code&gt;ffmpeg&lt;/code&gt; &lt;code&gt;opensource&lt;/code&gt; &lt;code&gt;javascript&lt;/code&gt; &lt;code&gt;desktop&lt;/code&gt; &lt;code&gt;windows&lt;/code&gt; &lt;code&gt;productivity&lt;/code&gt;&lt;/p&gt;

</description>
      <category>ffmpeg</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>windows</category>
    </item>
    <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://dev.to/coderx09/i-built-a-free-privacy-focused-bulk-image-compressor-that-runs-entirely-in-your-browser-4enm</link>
      <guid>https://dev.to/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://dev.to/coderx09/i-built-a-modern-android-toast-library-that-works-properly-on-android-11-with-icons-colors--4f0</link>
      <guid>https://dev.to/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://dev.to/coderx09/introducing-kalertjs-a-lightweight-animated-alert-dialog-library-for-javascript-595g</link>
      <guid>https://dev.to/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>
