<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Knowledge Base (Posts about browser)</title><link>https://bgstack15.ddns.net/blog/</link><description></description><atom:link href="https://bgstack15.ddns.net/blog/categories/browser.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2025 &lt;a href="mailto:bgstack15@gmail.com"&gt;bgstack15&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-SA"
style="border-width:0; margin-bottom:12px;"
src="https://bgstack15.ddns.net/.images/l_by-sa_4.0_88x31.png"&gt;&lt;/a&gt;</copyright><lastBuildDate>Sun, 13 Apr 2025 13:03:55 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Librewolf 136.0 upgrade problems</title><link>https://bgstack15.ddns.net/blog/posts/2025/04/05/librewolf-136-0-upgrade-problems/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;During OS updates for April, I ran into a problem with Librewolf. This was for Librewolf 136.0, but it also happened back with 135.0 and I was able to revert when I upgraded to that. I decided I needed to solve the problems, because now they were multiple.&lt;/p&gt;
&lt;p&gt;The first problem is that the new librewolf settings/prefs in the package file somehow set the "delete my history" checkbox even if it was unselected previously. So the first time you close the browser after upgrading to 136.0 (or 135.0), it deletes all your history, including links, cookies, and saved logins. I wanted to keep mine, and I was aware of this problem so I was able to uncheck those and keep going.&lt;/p&gt;
&lt;p&gt;The second problem was that the search suggestions were not working as intended/(configured?). I want to type in a fragment of a url, such as "mtui" and I want it to suggest any open tabs with that expression in the url, or from my history. It didn't show any. The fix was complicated, but understandable.&lt;/p&gt;
&lt;h3&gt;The fix&lt;/h3&gt;
&lt;p&gt;I set up a new profile (by copying in a known good/blank one I've established in the past). Then I ran the browser, made sure the "delete my history" settings were unchecked. Then close the browser, and copy in these files to the new profile:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cd ~/.librewolf-off-2025-03-30/3ig9z5jv.default-release-1.off-2025-03-30-v136.0
cp -pi places.sqlite cookies.sqlite storage.sqlite sessionstore.jsonlz4 favicons.sqlite credentialstate.sqlite logins.json logins-backup.json cert9.db key4.db ~/.librewolf/liwjg22ii/
cp -pr chrome/ ~/.librewolf/liwjg22ii/
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That last directory is for my &lt;a href="https://bgstack15.ddns.net/blog/posts/2023/04/10/firefox-111.0-fix-puzzle-piece-in-toolbar/"&gt;userChrome fixes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And then starting up Librewolf, and it worked. I lost my &lt;a href="https://bgstack15.ddns.net/blog/posts/2022/08/17/infcloud-auto-login-my-way/"&gt;localStorage&lt;/a&gt; for one site but that was easy to re-add.&lt;/p&gt;
&lt;p&gt;Hm, I guess I didn't keep it simple on this one, sorry.&lt;/p&gt;
&lt;h5&gt;Additional notes&lt;/h5&gt;
&lt;p&gt;For &lt;code&gt;prefs.js&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;privacy.resistFingerprinting.exemptedDomains *.amazon.com,*.themoviedb.org,*.freefilesync.org,freefilesync.org,finance.yahoo.com
&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;References&lt;/h2&gt;
&lt;h3&gt;Weblinks&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/codeberg.org/librewolf/issues/issues/2222"&gt;#2222 - Search bar is not working for regular queries or quick search engine - librewolf/issues - Codeberg.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/support.mozilla.org/en-US/questions/1278499"&gt;Address bar doesn't search history | Firefox Support Forum | Mozilla Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/codeberg.org/librewolf/issues/issues/2326"&gt;#2326 - Address bar search suggestion suddenly not working despite being enabled - librewolf/issues - Codeberg.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/www.reddit.com/r/LibreWolf/comments/nsi4c6/autocomplete_in_search_bar_doesnt_work/"&gt;Autocomplete in search bar doesn't work? : r/LibreWolf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/old.reddit.com/r/LibreWolf/comments/13tutlr/disable_resistfingerprinting_on_specific_websites/"&gt;Disable ResistFingerprinting on specific websites? : LibreWolf&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><category>browser</category><category>troubleshooting</category><category>updates</category><guid>https://bgstack15.ddns.net/blog/posts/2025/04/05/librewolf-136-0-upgrade-problems/</guid><pubDate>Sat, 05 Apr 2025 13:27:00 GMT</pubDate></item><item><title>Sample colorized icon in desktop notification from browser</title><link>https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;I am considering adding desktop notifications to my fork of InfCloud, and to do that I had to learn how to send desktop notifications. MDN did not disappoint!&lt;/p&gt;
&lt;p&gt;You'll see that I do some very basic find-button logic to add the click function. Of course this is boilerplate and won't look exactly the same whenever I get around to adding it to InfCloud/CalDAVZap.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/files/2023/11/listings/notifications.html.html"&gt;files/2023/11/listings/notifications.html&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2023/11/listings/notifications.html"&gt;(Source)&lt;/a&gt;&lt;/p&gt;&lt;div class="code"&gt;&lt;table class="codetable"&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-1"&gt;&lt;code data-line-number=" 1"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-2"&gt;&lt;code data-line-number=" 2"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;header&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-3"&gt;&lt;code data-line-number=" 3"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;title&amp;gt;Example page&amp;lt;/title&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-4"&gt;&lt;code data-line-number=" 4"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;script src="notifications.js"&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-5"&gt;&lt;code data-line-number=" 5"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-6"&gt;&lt;code data-line-number=" 6"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;/header&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-7"&gt;&lt;code data-line-number=" 7"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;body&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-8"&gt;&lt;code data-line-number=" 8"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;h1&amp;gt;example&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-9"&gt;&lt;code data-line-number=" 9"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;Lorem ipsum, etc.
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-10"&gt;&lt;code data-line-number="10"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;button&amp;gt;Notify me!&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-11"&gt;&lt;code data-line-number="11"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-12"&gt;&lt;code data-line-number="12"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;footer&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-13"&gt;&lt;code data-line-number="13"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;/footer&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-14"&gt;&lt;code data-line-number="14"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;a href="https://bgstack15.ddns.net/blog/files/2023/11/listings/notifications.js.html"&gt;files/2023/11/listings/notifications.js&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2023/11/listings/notifications.js"&gt;(Source)&lt;/a&gt;&lt;div class="code"&gt;&lt;table class="codetable"&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-1"&gt;&lt;code data-line-number="  1"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;// vim: set et ts=3 sw=3 sts=3:
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-2"&gt;&lt;code data-line-number="  2"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;// Startdate: 2023-11-09 18:36
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-3"&gt;&lt;code data-line-number="  3"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;// Purpose: Reference implementation for sending a notification with a colorized image from this server
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-4"&gt;&lt;code data-line-number="  4"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;// Reference:
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-5"&gt;&lt;code data-line-number="  5"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;//    https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API/Using_the_Notifications_API
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-6"&gt;&lt;code data-line-number="  6"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;//    https://www.w3docs.com/snippets/html/how-to-display-base64-images-in-html.html
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-7"&gt;&lt;code data-line-number="  7"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;//    https://stackoverflow.com/questions/28450471/convert-inline-svg-to-base64-string
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-8"&gt;&lt;code data-line-number="  8"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-9"&gt;&lt;code data-line-number="  9"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;const img = "/calendar/images/banner_calendar.svg";
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-10"&gt;&lt;code data-line-number=" 10"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;const notification_attempts = 10;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-11"&gt;&lt;code data-line-number=" 11"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;const notification_ms = 200;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-12"&gt;&lt;code data-line-number=" 12"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;// Due to how browsers/css work with colors, you can pass #000000 or web safe color names.
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-13"&gt;&lt;code data-line-number=" 13"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;var colors = Array("red","orange","yellow","green","blue","purple","black","white","brown");
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-14"&gt;&lt;code data-line-number=" 14"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-15"&gt;&lt;code data-line-number=" 15"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;function colorizeSvg(inSvg, oldColor, newColor) {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-16"&gt;&lt;code data-line-number=" 16"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   // In case we have to do more than `s//g` in the future.
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-17"&gt;&lt;code data-line-number=" 17"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   return inSvg.replaceAll(oldColor, newColor);
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-18"&gt;&lt;code data-line-number=" 18"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;}
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-19"&gt;&lt;code data-line-number=" 19"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-20"&gt;&lt;code data-line-number=" 20"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;function SendColorizedNotification(_title, _body, _icon, _tag, _color) {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-21"&gt;&lt;code data-line-number=" 21"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   // given _icon as path on server, get contents and adjust the main color in it to desired color.
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-22"&gt;&lt;code data-line-number=" 22"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   // The 585858 is the specific color of the calendar.svg we intend to replace.
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-23"&gt;&lt;code data-line-number=" 23"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   const xhr = new XMLHttpRequest();
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-24"&gt;&lt;code data-line-number=" 24"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   xhr.open("GET",_icon);
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-25"&gt;&lt;code data-line-number=" 25"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   xhr.onload = () =&amp;gt; {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-26"&gt;&lt;code data-line-number=" 26"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      newSvg = colorizeSvg(xhr.responseText,"#585858",_color);
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-27"&gt;&lt;code data-line-number=" 27"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      encodedData = window.btoa(newSvg); // turn it into the base64 stream
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-28"&gt;&lt;code data-line-number=" 28"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      encodedData = "data:image/svg+xml;base64," + encodedData; // prepend the type of stream
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-29"&gt;&lt;code data-line-number=" 29"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      SendNotification(_title, _body, encodedData, _tag, _color);
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-30"&gt;&lt;code data-line-number=" 30"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   }
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-31"&gt;&lt;code data-line-number=" 31"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   xhr.send();
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-32"&gt;&lt;code data-line-number=" 32"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;}
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-33"&gt;&lt;code data-line-number=" 33"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-34"&gt;&lt;code data-line-number=" 34"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;function SendNotification(_title, _body, _icon, _tag) {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-35"&gt;&lt;code data-line-number=" 35"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   // From: https://developer.mozilla.org/en-US/docs/Web/API/notification
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-36"&gt;&lt;code data-line-number=" 36"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   if (!("Notification" in window)) {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-37"&gt;&lt;code data-line-number=" 37"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // Check if the browser supports notifications
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-38"&gt;&lt;code data-line-number=" 38"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      alert("This browser does not support desktop notification");
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-39"&gt;&lt;code data-line-number=" 39"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   } else if (Notification.permission === "granted") {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-40"&gt;&lt;code data-line-number=" 40"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // Check whether notification permissions have already been granted;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-41"&gt;&lt;code data-line-number=" 41"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // if so, create a notification
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-42"&gt;&lt;code data-line-number=" 42"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      const notification = new Notification(String(_title), { tag: _tag, body: _body, icon: _icon });
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-43"&gt;&lt;code data-line-number=" 43"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // …
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-44"&gt;&lt;code data-line-number=" 44"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   } else if (Notification.permission !== "denied") {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-45"&gt;&lt;code data-line-number=" 45"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // We need to ask the user for permission
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-46"&gt;&lt;code data-line-number=" 46"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      Notification.requestPermission().then((permission) =&amp;gt; {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-47"&gt;&lt;code data-line-number=" 47"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         // If the user accepts, let's create a notification
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-48"&gt;&lt;code data-line-number=" 48"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         if (permission === "granted") {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-49"&gt;&lt;code data-line-number=" 49"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            const notification = new Notification(String(_title), { tag: _tag, body: _body, icon: _icon });
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-50"&gt;&lt;code data-line-number=" 50"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            // …
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-51"&gt;&lt;code data-line-number=" 51"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         }
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-52"&gt;&lt;code data-line-number=" 52"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      });
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-53"&gt;&lt;code data-line-number=" 53"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   }
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-54"&gt;&lt;code data-line-number=" 54"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   // At last, if the user has denied notifications, and you
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-55"&gt;&lt;code data-line-number=" 55"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   // want to be respectful there is no need to bother them anymore.
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-56"&gt;&lt;code data-line-number=" 56"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;}
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-57"&gt;&lt;code data-line-number=" 57"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-58"&gt;&lt;code data-line-number=" 58"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;function SendNotificationManyTimes(_title, _body, _icon, _tag) {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-59"&gt;&lt;code data-line-number=" 59"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   // From: https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API/Using_the_Notifications_API
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-60"&gt;&lt;code data-line-number=" 60"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   if (Notification?.permission === "granted") {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-61"&gt;&lt;code data-line-number=" 61"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // If the user agreed to get notified
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-62"&gt;&lt;code data-line-number=" 62"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // Let's try to send ten notifications
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-63"&gt;&lt;code data-line-number=" 63"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      let i = 0;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-64"&gt;&lt;code data-line-number=" 64"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // Using an interval cause some browsers (including Firefox) are blocking notifications if there are too much in a certain time.
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-65"&gt;&lt;code data-line-number=" 65"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      const interval = setInterval(() =&amp;gt; {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-66"&gt;&lt;code data-line-number=" 66"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         // Thanks to the tag, we should only see the "Hi! 9" notification
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-67"&gt;&lt;code data-line-number=" 67"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         const n = new Notification(String(_title), { tag: _tag, body: _body, icon: _icon });
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-68"&gt;&lt;code data-line-number=" 68"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         //const n = new Notification(`Hi! breakfast ${i}`, { tag: "soManyNotification", body: "this is body?", icon: img });
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-69"&gt;&lt;code data-line-number=" 69"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         if (i === (notification_attempts-1)) {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-70"&gt;&lt;code data-line-number=" 70"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            clearInterval(interval);
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-71"&gt;&lt;code data-line-number=" 71"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         }
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-72"&gt;&lt;code data-line-number=" 72"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         i++;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-73"&gt;&lt;code data-line-number=" 73"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      }, notification_ms);
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-74"&gt;&lt;code data-line-number=" 74"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   } else if (Notification &amp;amp;&amp;amp; Notification.permission !== "denied") {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-75"&gt;&lt;code data-line-number=" 75"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // If the user hasn't told if they want to be notified or not
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-76"&gt;&lt;code data-line-number=" 76"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // Note: because of Chrome, we are not sure the permission property
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-77"&gt;&lt;code data-line-number=" 77"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // is set, therefore it's unsafe to check for the "default" value.
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-78"&gt;&lt;code data-line-number=" 78"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      Notification.requestPermission().then((status) =&amp;gt; {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-79"&gt;&lt;code data-line-number=" 79"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         // If the user said okay
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-80"&gt;&lt;code data-line-number=" 80"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         if (status === "granted") {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-81"&gt;&lt;code data-line-number=" 81"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            let i = 0;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-82"&gt;&lt;code data-line-number=" 82"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            // Using an interval cause some browsers (including Firefox) are blocking notifications if there are too much in a certain time.
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-83"&gt;&lt;code data-line-number=" 83"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            const interval = setInterval(() =&amp;gt; {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-84"&gt;&lt;code data-line-number=" 84"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;               // Thanks to the tag, we should only see the "Hi! 9" notification
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-85"&gt;&lt;code data-line-number=" 85"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;               const n = new Notification(String(_title), { tag: _tag, body: _body, icon: _icon });
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-86"&gt;&lt;code data-line-number=" 86"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;               if (i === (notification_attempts-1)) {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-87"&gt;&lt;code data-line-number=" 87"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                  clearInterval(interval);
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-88"&gt;&lt;code data-line-number=" 88"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;               }
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-89"&gt;&lt;code data-line-number=" 89"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;               i++;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-90"&gt;&lt;code data-line-number=" 90"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            }, notification_ms);
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-91"&gt;&lt;code data-line-number=" 91"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         } else {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-92"&gt;&lt;code data-line-number=" 92"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            // Otherwise, we can fallback to a regular modal alert
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-93"&gt;&lt;code data-line-number=" 93"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            alert(String(_title)+": "+String(_body));
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-94"&gt;&lt;code data-line-number=" 94"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;         }
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-95"&gt;&lt;code data-line-number=" 95"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      });
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-96"&gt;&lt;code data-line-number=" 96"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   } else {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-97"&gt;&lt;code data-line-number=" 97"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      // If the user refuses to get notified, we can fallback to a regular modal alert
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-98"&gt;&lt;code data-line-number=" 98"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      alert(String(_title)+": "+String(_body));
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-99"&gt;&lt;code data-line-number=" 99"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   }
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-100"&gt;&lt;code data-line-number="100"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;}
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-101"&gt;&lt;code data-line-number="101"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-102"&gt;&lt;code data-line-number="102"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;function getRandomColor() {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-103"&gt;&lt;code data-line-number="103"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   return colors[Math.floor(Math.random()*colors.length)];
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-104"&gt;&lt;code data-line-number="104"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;}
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-105"&gt;&lt;code data-line-number="105"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-106"&gt;&lt;code data-line-number="106"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;window.addEventListener("load", () =&amp;gt; {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-107"&gt;&lt;code data-line-number="107"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   const button = document.querySelector("button");
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-108"&gt;&lt;code data-line-number="108"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   button.addEventListener("click", () =&amp;gt; {
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-109"&gt;&lt;code data-line-number="109"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;      SendColorizedNotification("sample calendar appointment","in 10 minutes",img,"",getRandomColor());
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-110"&gt;&lt;code data-line-number="110"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;   });
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/#-111"&gt;&lt;code data-line-number="111"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;});
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</description><category>browser</category><category>desktop</category><category>javascript</category><category>notifications</category><guid>https://bgstack15.ddns.net/blog/posts/2023/11/11/sample-colorized-icon-in-desktop-notification-from-browser/</guid><pubDate>Sat, 11 Nov 2023 14:28:50 GMT</pubDate></item><item><title>Firefox 111.0: fix puzzle piece in toolbar</title><link>https://bgstack15.ddns.net/blog/posts/2023/04/10/firefox-111.0-fix-puzzle-piece-in-toolbar/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;Starting in Firefox 109.0, we could use a line in the &lt;code&gt;prefs.js&lt;/code&gt; (or &lt;code&gt;about:config&lt;/code&gt;) to remove the annoying puzzle piece.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;user_pref("extensions.unifiedExtensions.enable", false);
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;However, starting in Firefox 111.0 the Mozilla people started ignoring this pref. The brilliant folks over at &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/www.askvg.com/disable-or-remove-extensions-button-from-firefox-toolbar/#comment-2760226"&gt;askvg.com&lt;/a&gt; solved this one though!&lt;/p&gt;
&lt;p&gt;You have take a few steps for this solution.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Set &lt;code&gt;about:config&lt;/code&gt; value &lt;code&gt;toolkit.legacyUserProfileCustomizations.stylesheets&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Visit the profile directory (available from &lt;code&gt;about:support&lt;/code&gt;, button "Open Directory") and make sub-directory &lt;code&gt;chrome&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Make file &lt;code&gt;chrome/userChrome.css&lt;/code&gt; with contents:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;#unified-extensions-button, #unified-extensions-button &amp;gt; .toolbarbutton-icon{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Restart Firefox.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I don't plan on ever using Chrome, but wow, the Mozilla people make me want to look for something else.&lt;/p&gt;
&lt;p&gt;This is the first time I've ever needed to modify userChrome.css. Ever since 2006, I have never needed it!&lt;/p&gt;</description><category>browser</category><category>firefox</category><category>userchrome</category><guid>https://bgstack15.ddns.net/blog/posts/2023/04/10/firefox-111.0-fix-puzzle-piece-in-toolbar/</guid><pubDate>Mon, 10 Apr 2023 12:34:39 GMT</pubDate></item><item><title>Mbbmlib improvements because of firefox changes</title><link>https://bgstack15.ddns.net/blog/posts/2023/04/06/mbbmlib-improvements-because-of-firefox-changes/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;A while back I wrote about my &lt;a href="https://bgstack15.ddns.net/blog/posts/2021/01/05/export-firefox-and-other-mozilla-based-browser-bookmarks-without-firefox/"&gt;project that exports Firefox bookmarks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Due to changes between LibreWolf 109.0 and 110.0, I have now updated the &lt;a href="https://bgstack15.ddns.net/blog/cgit/mbbmlib/"&gt;source&lt;/a&gt; to work with the latest schema for bookmarks and how icons are connected to them. I also removed Newmoon support, because I don't use that browser for primary usage where I save bookmarks that need to be shared/bupped.&lt;/p&gt;
&lt;p&gt;I actually use specific SELECT statements now, instead of &lt;code&gt;SELECT *&lt;/code&gt;, so I grab only the columns that matter, and the results are predicable and the code is therefore more readable.&lt;/p&gt;</description><category>bookmarks</category><category>browser</category><category>firefox</category><category>python</category><guid>https://bgstack15.ddns.net/blog/posts/2023/04/06/mbbmlib-improvements-because-of-firefox-changes/</guid><pubDate>Thu, 06 Apr 2023 12:35:25 GMT</pubDate></item><item><title>disabling webrtc temporarily</title><link>https://bgstack15.ddns.net/blog/posts/2023/03/17/disabling-webrtc-temporarily/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;To facilitate a proxy setting to prevent IP address leakage, disable WebRTC with &lt;code&gt;about:config&lt;/code&gt; setting:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;media.peerconnection.enabled = false
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can check with &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/whoer.net/"&gt;https://whoer.net&lt;/a&gt;&lt;/p&gt;</description><category>browser</category><category>proxy</category><category>web</category><category>webrtc</category><guid>https://bgstack15.ddns.net/blog/posts/2023/03/17/disabling-webrtc-temporarily/</guid><pubDate>Fri, 17 Mar 2023 12:43:42 GMT</pubDate></item><item><title>ssh_config: new option in Devuan, March 2023</title><link>https://bgstack15.ddns.net/blog/posts/2023/03/05/ssh-config-new-option-in-devuan-march-2023/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;From the apt-listchanges message for this month:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;openssh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;9.2&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unstable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;urgency&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;medium&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;OpenSSH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;9.2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;includes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;changes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;that&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;may&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;affect&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;existing&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;configurations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EnableEscapeCommandline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ssh_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;option&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;that&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;controls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;whether&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;escape&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sequence&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;that&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;provides&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Among&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;things&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;could&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;additional&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;forwards&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;at&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;This&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;option&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;defaults&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;"no"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;disabling&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;that&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;was&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Turning&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;off&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;allows&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;platforms&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;that&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;support&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sandboxing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currently&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;only&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;OpenBSD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stricter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sandbox&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- Colin Watson &amp;lt;cjwatson@debian.org&amp;gt;  Wed, 08 Feb 2023 10:36:06 +0000&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So I had to run this on all Devuan systems, to keep my ssh client command-line enabled.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;sudo updateval -a -v /etc/ssh/ssh_config '^\s*EnableEscapeCommandline.*' 'EnableEscapeCommandline yes'
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Where &lt;a href="https://bgstack15.ddns.net/blog/cgit/bgscripts/tree/src/usr/bin/updateval"&gt;updateval&lt;/a&gt; is from my bgscripts-core package.&lt;/p&gt;</description><category>browser</category><category>proxy</category><category>socks</category><category>ssh</category><category>web</category><guid>https://bgstack15.ddns.net/blog/posts/2023/03/05/ssh-config-new-option-in-devuan-march-2023/</guid><pubDate>Sun, 05 Mar 2023 13:54:19 GMT</pubDate></item><item><title>socks proxy command</title><link>https://bgstack15.ddns.net/blog/posts/2023/03/01/socks-proxy-command/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;Run this command.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh -D 8880 &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;USER&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;@proxyserver -n -f -N
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Set socks proxy in browser settings.&lt;/p&gt;</description><category>browser</category><category>proxy</category><category>socks</category><category>ssh</category><category>web</category><guid>https://bgstack15.ddns.net/blog/posts/2023/03/01/socks-proxy-command/</guid><pubDate>Wed, 01 Mar 2023 14:29:10 GMT</pubDate></item><item><title>Wikipedia: use usable layout</title><link>https://bgstack15.ddns.net/blog/posts/2023/02/01/wikipedia-use-usable-layout/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;Wikipedia updated its layout, and it now makes less sense than before. To use the sensible design it has been for over a decade, you can add this url parameter: &lt;code&gt;?useskin=vector&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Alternatively, you can use the Firefox extension &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/classic-wikipedia/"&gt;Classic mode for Wikipedia&lt;/a&gt;, or just suck it up and press the multiple buttons it takes to widen the new layout, but that still hides the table of contents. The old view is the only way to get that classic TOC object.&lt;/p&gt;
&lt;p&gt;Reference&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.ghacks.net/2023/01/25/how-to-restore-wikipedias-old-design/"&gt;How to restore Wikipedia's old design - gHacks Tech News&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/classic-wikipedia/"&gt;Classic mode for Wikipedia&lt;/a&gt; Firefox extension&lt;/li&gt;
&lt;/ol&gt;</description><category>browser</category><category>web</category><category>wikipedia</category><guid>https://bgstack15.ddns.net/blog/posts/2023/02/01/wikipedia-use-usable-layout/</guid><pubDate>Wed, 01 Feb 2023 13:45:30 GMT</pubDate></item><item><title>Why I stopped using Palemoon</title><link>https://bgstack15.ddns.net/blog/posts/2023/01/28/why-i-stopped-using-palemoon/</link><dc:creator>bgstack15</dc:creator><description>&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;I stopped using Palemoon web browser this last year, 2022. It was a decent browser for a while but eventually slid into irrelevancy, and this is ignoring the toxicity of the community. It started out as a more sane Firefox 20 or so, and ended up as an obsolete Firefox 20. (Numbers are generalizations and useful for imparting approximate understanding and humor only.)&lt;/p&gt;
&lt;p&gt;And yes, I'm out of technical topics which is why it's time for a chat about old news. Plus, somebody asked and I didn't want to drown the individual so the best place is here.&lt;/p&gt;
&lt;h3&gt;Main reasons&lt;/h3&gt;
&lt;p&gt;The primary reason I stopped using Palemoon web browser is because it stopped working on enough websites that I had to always keep a second browser open. It also suffered from instability for quite a few months and it would freeze the whole system for a few seconds at a time. I never submitted a bug because I didn't know how to document or bring it up. Plus, I always compile it myself and upstream always claimed you're on your own for that situation.&lt;/p&gt;
&lt;p&gt;Google Voice used to use a dedicated plugin that you could use to place voice calls. When Google Voice switched to WebRTC, palemoon stopped being usable for that, and that is a primary use of that for me. Yes, it's absurd to use a web browser for everything under the sun. But yes, it's still absurd that this one browser doesn't keep up with the rest it wants people to use it as an alternative to.&lt;/p&gt;
&lt;h3&gt;Secondary reasons&lt;/h3&gt;
&lt;p&gt;The upstream development community used to be extremely toxic. It's now only slightly toxic, with the removal of the most malicious person I've ever interacted with on the Internet (including multiplayer video game players). I could make do by mostly avoiding the offending developer, but because he held such high status until his malevolent confrontations with the other upstream devs which lead to alleged vandalism of the palemoon servers, I couldn't actually hide his posts on the forum from my view.&lt;/p&gt;
&lt;p&gt;This person also called me offensive terms because I stopped maintaining the Fedora-ized build of Palemoon. I had stopped using Fedora GNU/Linux as a daily driver and could no longer validate the built assets, so I didn't want to advertise things that I built but couldn't dogfood. Thinking through that process didn't occur to the most offensive developer, but that's OK. He missed things all the time and the world keeps going around him.&lt;/p&gt;
&lt;p&gt;I was banned from the upstream forum for a few days once for calling out his toxicity and supporting some newb that had asked a stereotypically-noobie question. In normal places that wouldn't get you in trouble, but the upstream devs have their own, misanthropic opinions about things, as previously discussed.&lt;/p&gt;
&lt;p&gt;Only when the chief developer was personally affected by the toxicity and malevolent behavior of the most offensive developer did he tone down his stupidity and give a mild apology.&lt;/p&gt;
&lt;p&gt;Debian Unstable, for which I'm too utterly dependent because I target Devuan Unstable, does not have a solution for the ancient python2 build dependency of the palemoon application. Debian Unstable just removed python2, and folks smarter than me haven't solved this one [in public] yet. I suppose it would be too much to ask to get upstream to use python3. If I wrote this article in a few more month's time without any changes to the situation, this right here would be reason #1.&lt;/p&gt;
&lt;h3&gt;Minor reasons&lt;/h3&gt;
&lt;p&gt;I swear that once my Palemoon crashed and it merged the history of a private browsing window with my permanent browsing history. Of course there's the smallest likelihood that it wasn't actually a private browsing window, but that is a very small chance.&lt;/p&gt;
&lt;p&gt;The silliness with shuffling the upstream scm links rapidly between 4 releases' worth of time didn't help, but I'm guilty of brief experimentations too. I just try really, really hard to avoid doing it to production.&lt;/p&gt;
&lt;p&gt;I'm not even mad about the gtk2-is-primary thing; I think gtk2 is quite fine. Unfortunately, I don't run the world and too many places are starting to drop gtk2.&lt;/p&gt;
&lt;h4&gt;Extensions&lt;/h4&gt;
&lt;p&gt;Thankfully, I never cared about noscript. I didn't really care about Adblock Plus or whatever that Palemoon officially recommended, and uBlock Origin [legacy] worked well enough and I didn't tell anyone I used it.&lt;/p&gt;
&lt;h2&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;I use LibreWolf and Firefox now. I need to get back into Waterfox Classic.&lt;/p&gt;</description><category>browser</category><category>palemoon</category><guid>https://bgstack15.ddns.net/blog/posts/2023/01/28/why-i-stopped-using-palemoon/</guid><pubDate>Sat, 28 Jan 2023 14:14:57 GMT</pubDate></item><item><title>LibreWolf 98.0 packages: problems resolved!</title><link>https://bgstack15.ddns.net/blog/posts/2022/03/30/librewolf-98.0-packages-problems-resolved/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2022/03/26/status-of-librewolf-98.0-packages/"&gt;Last time&lt;/a&gt; I had a problem with building the rpm for LibreWolf 98.0.&lt;/p&gt;
&lt;p&gt;The research about the PGO was the hint I needed. When I &lt;a href="https://gitlab.com/librewolf-community/browser/fedora/-/commit/60765225ddcabcfb8861c62d4f2094037538e5d2"&gt;disabled PGO&lt;/a&gt; in the build, the application compiles in half the time, and works way better! I haven't even experienced a dead tab at all yet.&lt;/p&gt;
&lt;p&gt;I don't understand how &lt;a href="https://firefox-source-docs.mozilla.org/build/buildsystem/pgo.html"&gt;Profile Guided Optimization&lt;/a&gt; is supposed to help, when disabling it makes everything work better and compile faster. But what do I know?&lt;/p&gt;</description><category>browser</category><category>compile</category><category>librewolf</category><category>mozilla</category><guid>https://bgstack15.ddns.net/blog/posts/2022/03/30/librewolf-98.0-packages-problems-resolved/</guid><pubDate>Wed, 30 Mar 2022 12:37:58 GMT</pubDate></item></channel></rss>