<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://sbmesh.com/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    
    <title>SBMESH Blog</title>
    <link>https://sbmesh.com/</link>
    <atom:link href="https://sbmesh.com/feed.xml" rel="self" type="application/rss+xml" />
    <description>Audio developer, musician, Linux enthusiast.</description>
    <language>en</language>
    <item>
      <title>SunClock Sunrise Sunset Calculator for Linux</title>
      <link>https://sbmesh.com/blog/posts/2026-05-21-sunclock-sunrise-sunset-calculator-for-linux/</link><description>&lt;p&gt;&lt;a href=&quot;https://sbmesh.com/assets/img/Screenshot_2026-05-21_20-23-52.png&quot;&gt;&lt;img src=&quot;https://sbmesh.com/assets/img/Screenshot_2026-05-21_20-23-52.png&quot; alt=&quot;SunClock 1&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For years I used the &lt;a href=&quot;https://www.sunrisesunset.com/sun.asp&quot;&gt;Sunrise Sunset Calculator for Windows&lt;/a&gt; — a lightweight desktop tool that sits quietly in your system tray and tells you exactly when the sun rises and sets...&lt;/p&gt;
&lt;p&gt;When I switched to Linux full-time, I missed it. Nothing quite filled the same niche — lightweight, always visible, no internet required. So I built &lt;strong&gt;SunClock&lt;/strong&gt;: a single-file Python/GTK app that does the same job natively on Linux.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sbmesh.com/assets/img/Screenshot_2026-05-21_20-24-10.png&quot;&gt;&lt;img src=&quot;https://sbmesh.com/assets/img/Screenshot_2026-05-21_20-24-10.png&quot; alt=&quot;SunClock 2&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What It Does&lt;/h2&gt;
&lt;p&gt;SunClock lives in your system tray. During the day it shows a sun icon; after sunset it switches to the current moon phase emoji. Hover over it at any time and you get a tooltip like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sunrise 5:02am  Sunset 9:14pm  |  Sunset in 3.2 hrs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Click the icon (or right-click for the menu) and a detailed info panel opens showing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sunrise and sunset times&lt;/strong&gt; for today and tomorrow&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Three twilight phases&lt;/strong&gt; — civil (96°), nautical (102°), and astronomical (108°) — for both dawn and dusk&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solar noon&lt;/strong&gt; — when the sun is at its highest point&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total daylight hours&lt;/strong&gt; and additional twilight hours&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moon phase&lt;/strong&gt; with name, emoji, and illumination percentage (e.g. &lt;em&gt;Waxing Gibbous — 73.4% lit&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All calculations happen locally. No network calls, no account, no telemetry.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;How It Works&lt;/h2&gt;
&lt;h3&gt;Solar maths&lt;/h3&gt;
&lt;p&gt;Sun times are calculated using the &lt;strong&gt;NOAA solar algorithm&lt;/strong&gt; — the same approach used by weather services and observatories. The core steps are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Convert the calendar date to a &lt;strong&gt;Julian Day Number&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Compute the sun&#39;s &lt;strong&gt;declination&lt;/strong&gt; (how far north or south of the equator it sits) and the &lt;strong&gt;equation of time&lt;/strong&gt; (the difference between mean solar time and apparent solar time)&lt;/li&gt;
&lt;li&gt;Solve the &lt;strong&gt;hour angle&lt;/strong&gt; for a given zenith angle — 90.833° for sunrise/sunset (accounting for atmospheric refraction and the sun&#39;s disc radius), 96° for civil twilight, 102° for nautical, 108° for astronomical&lt;/li&gt;
&lt;li&gt;Convert back to local clock time using the city&#39;s UTC offset&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Moon calculations&lt;/h3&gt;
&lt;p&gt;Moon phase uses a dual-path approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Primary:&lt;/strong&gt; &lt;a href=&quot;https://rhodesmill.org/pyephem/&quot;&gt;python-pyephem&lt;/a&gt; — a Python binding to the ELP2000/VSOP87 planetary theory, accurate to within seconds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fallback:&lt;/strong&gt; A 20-term Meeus ephemeris implemented in pure Python, accurate to within about ±0.6% illumination&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The app detects which is available at startup and silently uses whichever it finds.&lt;/p&gt;
&lt;h3&gt;DST handling&lt;/h3&gt;
&lt;p&gt;Rather than relying on the system timezone (which can be unreliable for multi-city comparisons), SunClock stores each city&#39;s &lt;strong&gt;standard UTC offset&lt;/strong&gt; and applies DST rules internally:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;North American DST&lt;/strong&gt; — 2nd Sunday in March → 1st Sunday in November (+1 hour)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;European DST&lt;/strong&gt; — last Sunday in March → last Sunday in October (+1 hour)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixed offset&lt;/strong&gt; — cities like Phoenix AZ, Singapore, or Dubai that don&#39;t observe DST&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Per-city DST flags mean you can compare, say, London in summer (BST, UTC+1) against Toronto (EDT, UTC−4) and get accurate times for both simultaneously.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;City Coverage&lt;/h2&gt;
&lt;p&gt;SunClock ships with &lt;strong&gt;53 cities&lt;/strong&gt; across six regions, with &lt;strong&gt;London, UK&lt;/strong&gt; as the default:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Region&lt;/th&gt;
&lt;th&gt;Cities&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Europe&lt;/td&gt;
&lt;td&gt;London, Paris, Berlin, Rome, Madrid, Amsterdam, Stockholm, Athens, Moscow, Istanbul&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;North America&lt;/td&gt;
&lt;td&gt;New York, Chicago, Los Angeles, Miami, Houston, Seattle, Denver, Phoenix, Anchorage, Honolulu, Mexico City&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canada&lt;/td&gt;
&lt;td&gt;Thunder Bay, Toronto, Ottawa, Montreal, Halifax, St. John&#39;s, Winnipeg, Regina, Saskatoon, Calgary, Edmonton, Vancouver, Whitehorse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;South America&lt;/td&gt;
&lt;td&gt;São Paulo, Buenos Aires, Bogotá, Lima&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Middle East &amp;amp; Africa&lt;/td&gt;
&lt;td&gt;Dubai, Riyadh, Cairo, Lagos, Nairobi, Johannesburg&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asia &amp;amp; Pacific&lt;/td&gt;
&lt;td&gt;Mumbai, New Delhi, Beijing, Shanghai, Tokyo, Seoul, Hong Kong, Singapore, Bangkok, Jakarta, Sydney, Melbourne, Auckland&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;You can also add, edit, or remove cities via the right-click menu — just enter a name, latitude/longitude, UTC offset, and DST region.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;h3&gt;Requirements&lt;/h3&gt;
&lt;p&gt;SunClock is tested on &lt;strong&gt;Arch Linux / CachyOS&lt;/strong&gt; with XFCE but works on any GTK 3 desktop (GNOME, KDE, MATE, etc.).&lt;/p&gt;
&lt;p&gt;Install the dependencies:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Arch / CachyOS / Manjaro
sudo pacman -S python-gobject python-cairo python-pyephem

# Debian / Ubuntu
sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-3.0 python3-ephem
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;python-pyephem&lt;/code&gt; (&lt;code&gt;python3-ephem&lt;/code&gt;) is optional but recommended — it gives higher-accuracy moon data. The app falls back gracefully without it.&lt;/p&gt;
&lt;h3&gt;Download&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://sbmesh.com/files/sun.zip&quot;&gt;https://sbmesh.com/files/sun.zip&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Install to your system&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This copies &lt;code&gt;sunclock&lt;/code&gt; to &lt;code&gt;~/.local/bin/&lt;/code&gt;, adds a &lt;code&gt;.desktop&lt;/code&gt; entry to &lt;code&gt;~/.local/share/applications/&lt;/code&gt;, and creates an autostart entry so it launches automatically when you log in.&lt;/p&gt;
&lt;p&gt;After installing, you can launch it from your application menu or just log out and back in.&lt;/p&gt;
&lt;h3&gt;Uninstall&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;rm ~/.local/bin/sunclock
rm ~/.local/share/applications/sunclock.desktop
rm ~/.config/autostart/sunclock.desktop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Configuration is stored at &lt;code&gt;~/.config/sunclock/config.json&lt;/code&gt; — delete this too if you want a clean slate.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Resetting to Defaults&lt;/h2&gt;
&lt;p&gt;If you want to switch your active city to London (or reload the full default city list), delete the config file and restart:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;rm ~/.config/sunclock/config.json
python3 sunclock.py
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;Technical Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single file&lt;/strong&gt; — the entire application is &lt;code&gt;sunclock.py&lt;/code&gt; (~800 lines), with no external assets or build step&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;60-second refresh&lt;/strong&gt; — times update every minute via &lt;code&gt;GLib.timeout_add_seconds&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cairo-rendered tray icon&lt;/strong&gt; — the sun glyph is drawn programmatically; no image files required&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moon emoji rendered with Pango/PangoCairo&lt;/strong&gt; — uses Noto Color Emoji if installed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Config&lt;/strong&gt; — &lt;code&gt;~/.config/sunclock/config.json&lt;/code&gt; stores your city list and active selection; hand-editable&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
</description><pubDate>Wed, 20 May 2026 20:00:00 -0400</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2026-05-21-sunclock-sunrise-sunset-calculator-for-linux/</guid>
    </item>
    <item>
      <title>foo_jumpin foobar2000 Component</title>
      <link>https://sbmesh.com/blog/posts/2026-05-16-foojumpin-foobar2000-component/</link><description>&lt;p&gt;&amp;quot;Jump In&amp;quot; is a foobar2000 component that advances to the next track and immediately seeks to a user-configured, optionally randomized time offset (e.g., jumping into a track at 12 seconds instead of the beginning).&lt;/p&gt;
&lt;p&gt;I basically wanted to skip quiet intros and jump right into the beats.&lt;/p&gt;
&lt;p&gt;Playback &amp;gt; Jump In (Next Track)&lt;/p&gt;
&lt;p&gt;Edit: You can now tag a file with JUMPIN and value &amp;quot;0&amp;quot; and it will play the file at the very beginning.. foo_jumpin ignores the file.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sbmesh.com/files/foo_jumpin.zip&quot;&gt;https://sbmesh.com/files/foo_jumpin.zip&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Fri, 15 May 2026 20:00:00 -0400</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2026-05-16-foojumpin-foobar2000-component/</guid>
    </item>
    <item>
      <title>What I Had to Do to Get Cycling &#39;74 Max 9 Running on Linux CachyOS</title>
      <link>https://sbmesh.com/blog/posts/2026-01-03-what-i-had-to-do-to-get-cycling-74-max-9-running-on-linux-cachyos/</link><description>&lt;p&gt;What I Had to Do to Get Cycling &#39;74 Max 9 Running on GNU/Linux/CachyOS:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Create a clean 64-bit prefix:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;WINEARCH=win64 WINEPREFIX=$HOME/Games/max9 wineboot -u
WINEPREFIX=$HOME/Games/max9 winetricks -q vcrun2022 corefonts gdiplus
WINEPREFIX=$HOME/Games/max9 winetricks -q dxvk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Install Max:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;WINEPREFIX=$HOME/Games/max9 wine Max912_251211_07b9c4c.msi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Launch Max:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;WINEPREFIX=$HOME/Games/max9 &#92;
__GLX_VENDOR_LIBRARY_NAME=nvidia &#92;
__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/10_nvidia.json &#92;
wine &amp;quot;$HOME/Games/max9/drive_c/Program Files/Cycling &#39;74/Max 9/Max.exe&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Create launcher script:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir -p ~/bin
cat &amp;gt; ~/bin/max9.sh &amp;lt;&amp;lt;EOF
#!/bin/bash
WINEPREFIX=$HOME/Games/max9 &#92;
__GLX_VENDOR_LIBRARY_NAME=nvidia &#92;
__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/10_nvidia.json &#92;
wine &amp;quot;$HOME/Games/max9/drive_c/Program Files/Cycling &#39;74/Max 9/Max.exe&amp;quot;
EOF
chmod +x ~/bin/max9.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://sbmesh.com/assets/img/2026-01-03-205348_1920x1080_scrot.png&quot;&gt;&lt;img src=&quot;https://sbmesh.com/assets/img/2026-01-03-205348_1920x1080_scrot.png&quot; alt=&quot;Max 9 running on Linux CachyOS&quot;&gt;&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Fri, 02 Jan 2026 19:00:00 -0500</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2026-01-03-what-i-had-to-do-to-get-cycling-74-max-9-running-on-linux-cachyos/</guid>
    </item>
    <item>
      <title>Radon Risk in Thunder Bay</title>
      <link>https://sbmesh.com/blog/posts/2025-10-28-radon-risk-in-thunder-bay/</link><description>&lt;h1&gt;An Assessment of Residential Radon Potential in Thunder Bay Communities Proximate to Lake Superior&lt;/h1&gt;
&lt;h2&gt;Section 1: Understanding the Radon Risk: A Primer for the Thunder Bay Resident&lt;/h2&gt;
&lt;p&gt;This section provides a foundational understanding of radon, outlining the nature of the hazard, its significant health implications, and the Canadian regulatory context that guides public health actions. This information is essential for interpreting the local data specific to Thunder Bay and making informed decisions regarding home safety.&lt;/p&gt;
&lt;h3&gt;1.1 The Invisible Hazard: Defining Radon and Its Pathways&lt;/h3&gt;
&lt;p&gt;Radon is a naturally occurring radioactive gas that is imperceptible to human senses; it is colorless, odorless, and tasteless.1 It is generated through the natural, radioactive decay of uranium, an element found in trace amounts in virtually all rock and soil on Earth.3 As uranium breaks down, it forms a series of decay products, one of which is radium, which in turn decays to produce radon gas.&lt;/p&gt;
&lt;p&gt;The primary and most significant source of radon in residential settings is the soil gas that exists in the ground beneath and around a home&#39;s foundation.6 While certain building materials, such as granite, stone, brick, and cement, are derived from the earth and can contain uranium, they are not considered a significant source of radon in Canadian homes.8 A 2010 study by Health Canada on 33 common types of granite found that none released significant levels of radon.9 Therefore, the focus of risk assessment and mitigation must be on the interaction between a building and the underlying geology.&lt;/p&gt;
&lt;p&gt;Because radon is a gas, it can move freely through pore spaces in soil and fractures in rock. It enters buildings through any available opening where the structure is in contact with the ground. Common entry points include 6:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cracks in foundation walls and concrete floor slabs.&lt;/li&gt;
&lt;li&gt;Construction joints, such as where the floor slab meets the foundation wall.&lt;/li&gt;
&lt;li&gt;Gaps around service penetrations for utilities like water pipes, sewer lines, and electrical conduits.&lt;/li&gt;
&lt;li&gt;Openings in the floor, such as floor drains and sump pits.&lt;/li&gt;
&lt;li&gt;The hollow cores of concrete block walls.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is a critical misconception that only older, drafty homes are at risk. Any building, regardless of age or construction style—new or old, well-sealed or drafty, with or without a basement—has the potential to accumulate high levels of radon.2 The amount of radon that enters and accumulates is a complex function of the local geology, the home&#39;s specific construction, and the pressure dynamics between the building and the surrounding soil.&lt;/p&gt;
&lt;h3&gt;1.2 Health Implications of Long-Term Exposure&lt;/h3&gt;
&lt;p&gt;The health risks associated with radon are serious and well-documented. The International Agency for Research on Cancer (IARC), a part of the World Health Organization, classifies radon as a Group 1 carcinogen, meaning it is definitively known to cause cancer in humans.11&lt;/p&gt;
&lt;p&gt;When radon gas is inhaled, it undergoes further radioactive decay in the lungs, releasing alpha particles. These high-energy particles can damage the DNA of the cells lining the respiratory tract.11 Over a prolonged period of exposure, this cellular damage can lead to the development of lung cancer. The overall risk to an individual is a function of three primary factors: the concentration of radon in the air, the duration of exposure, and the individual&#39;s smoking habits.12&lt;/p&gt;
&lt;p&gt;Radon exposure is the leading cause of lung cancer for people who have never smoked and the second leading cause overall, after smoking.11 Health Canada estimates that approximately 16% of all lung cancer deaths in the country—more than 3,000 deaths each year—are attributable to radon exposure in the home.4&lt;/p&gt;
&lt;p&gt;The risk is dramatically amplified for individuals who smoke. The combination of radon exposure and tobacco smoke creates a synergistic effect, meaning the combined risk is much greater than the sum of the individual risks. For example, data from the Ontario Lung Association indicates that a smoker exposed to high radon levels may have a 1 in 3 chance of developing lung cancer, compared to a 1 in 10 chance for a smoker not exposed to high radon.14 This makes radon awareness and mitigation especially critical for households with smokers.&lt;/p&gt;
&lt;h3&gt;1.3 The Canadian Regulatory Framework&lt;/h3&gt;
&lt;p&gt;In Canada, the approach to radon is guided by a framework developed by Health Canada in collaboration with the Federal Provincial Territorial Radiation Protection Committee (FPTRPC).15&lt;/p&gt;
&lt;p&gt;The Canadian guideline for radon in indoor air is an action level of 200 becquerels per cubic metre (Bq/m³).12 A becquerel is a unit of radioactivity, representing one radioactive decay per second. Thus, a concentration of 200 Bq/m³ means that in every cubic metre of air, 200 radon atoms are decaying and emitting radiation every second. This guideline applies to the average annual concentration in the &amp;quot;normal occupancy area&amp;quot; of a building—any space where a person spends more than four hours per day, such as a finished basement, bedroom, or living room.6&lt;/p&gt;
&lt;p&gt;It is crucial to understand that the 200 Bq/m³ guideline is not a demarcation of safety but rather an action level. Health Canada explicitly states that there is no level of radon that is considered risk-free.15 This position is based on the scientific consensus that any exposure to a carcinogen carries some level of risk. The guideline represents a level at which the risk is considered unacceptable from a public health perspective, and remedial action is strongly recommended. This approach is consistent with the internationally recognized ALARA (As Low As Reasonably Achievable) principle, which encourages individuals to reduce their exposure to radiation as much as is practicably possible, even if levels are already below the guideline.6 This contrasts with other jurisdictions; for example, the United States has an action level of 4 pCi/L (≈148 Bq/m³), while the World Health Organization recommends a reference level between 100 and 300 Bq/m³.11&lt;/p&gt;
&lt;p&gt;The urgency for taking corrective action is directly related to the measured radon concentration 6:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;For levels between 200 Bq/m³ and 600 Bq/m³:&lt;/strong&gt; Health Canada recommends that homeowners take corrective action within two years.12&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For levels above 600 Bq/m³:&lt;/strong&gt; Corrective action should be taken within one year.12&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the province of Ontario, radon has been integrated into the building and warranty framework. The Ontario Building Code now requires builders of new homes to incorporate radon-preventative measures, such as a soil gas barrier and a properly sealed foundation.12 Furthermore, the Tarion New Home Warranty program provides significant protection for new homeowners. Elevated radon levels exceeding the Health Canada guideline are considered a major structural defect, and Tarion may cover the costs of professional mitigation, up to a limit of $50,000, for homes within the first seven years of their warranty.12 This classification elevates the issue from a homeowner maintenance concern to a recognized construction liability, providing a powerful recourse for new buyers and underscoring the importance of proper radon-resistant construction techniques.&lt;/p&gt;
&lt;h2&gt;Section 2: The Geological Underpinnings of Radon in the Lakehead Region&lt;/h2&gt;
&lt;p&gt;The elevated radon potential in Thunder Bay is not a random phenomenon but a direct consequence of the region&#39;s ancient and complex geology. The city&#39;s location on the Canadian Shield, combined with specific local rock formations rich in uranium, creates a persistent and widespread source for radon gas. Understanding this geological context is fundamental to comprehending the scale and distribution of the radon risk across the city and surrounding areas.&lt;/p&gt;
&lt;h3&gt;2.1 A Legacy of the Canadian Shield: The Regional Source Rock&lt;/h3&gt;
&lt;p&gt;Thunder Bay is situated on the Superior Province of the Canadian Shield, which is the largest and one of the oldest stable blocks of the Earth&#39;s crust, known geologically as an Archean craton.18 This geological province is renowned for its vast mineral resources, a legacy of billions of years of geological processes.18 The bedrock in the Thunder Bay area is exceptionally old, with Archean Era rocks dated to approximately 2.7 billion years.19&lt;/p&gt;
&lt;p&gt;The local geology is a complex mosaic of rock types. The city lies at a significant geological boundary between the very old (&amp;gt;2.5 billion years) granite and metamorphic rocks of the Archean Shield and overlying, younger (1.8 to 1.1 billion years old) layers of sedimentary and igneous rock.20 The Archean basement consists primarily of granite, gneiss (a type of metamorphic rock), and greenstone volcanic belts.19&lt;/p&gt;
&lt;p&gt;Granite is a key rock type in this context. As a naturally occurring igneous rock formed from the cooling of magma, granite universally contains trace amounts of naturally occurring radioactive elements, including uranium and thorium.8 The decay of these elements is the ultimate source of radon gas. While Health Canada has determined that granite used as a building material (e.g., countertops) is not a significant source of indoor radon, the vast expanse of uranium-bearing granitic and metamorphic rock underlying the region serves as a powerful, large-scale source for radon generation.9&lt;/p&gt;
&lt;h3&gt;2.2 Identifying High-Potential Formations and Uranium Occurrences&lt;/h3&gt;
&lt;p&gt;Geological surveys of the North Central Region of Ontario have identified specific formations and subprovinces in and around Thunder Bay that have a particularly high potential for uranium, and therefore, high radon production.&lt;/p&gt;
&lt;p&gt;Two areas are explicitly identified as having the highest potential for uranium deposits: the Nipigon Basin area and the areas underlain by the Gunflint and Rove Formations.22 The Gunflint Formation, part of a larger sequence known as the Animikie Group, is a prominent geological feature in the region, stretching from Thunder Bay into the Mesabi Iron Range in Minnesota.19 It is composed of banded iron formation rocks, chert, and shale.19 Critically, this formation has been dated using Uranium-Lead (U-Pb) radiometric techniques to an age of approximately 1.88 billion years, a process that directly confirms the presence of the parent uranium isotopes necessary for radon generation.23&lt;/p&gt;
&lt;p&gt;Furthermore, the Quetico Subprovince, a major geological belt within the Superior Province, is documented as having an anomalously high background concentration of uranium, making it an important regional source rock for radon that can migrate into adjacent areas.22 An inventory of mineral occurrences in the region has cataloged numerous specific uranium deposits, many of which are high-grade vein-type deposits associated with the unconformity (the ancient erosional surface) between the Proterozoic and Archean rocks.22 These documented occurrences provide concrete evidence that the raw geological ingredient for a significant radon problem—uranium—is widespread throughout the region&#39;s bedrock. The elevated radon levels measured in local homes are, therefore, a direct and predictable outcome of this specific geological endowment.&lt;/p&gt;
&lt;h3&gt;2.3 From Bedrock to Basement: Radon Transport and Emanation&lt;/h3&gt;
&lt;p&gt;The presence of uranium-bearing rock is only the first part of the equation. For radon to pose a risk, it must be able to travel from its source in the bedrock to the surface and into buildings. The geological history of the Thunder Bay region has created an efficient transport system for this gas.&lt;/p&gt;
&lt;p&gt;The area sits at the edge of the Mid-Continent Rift System, an ancient tectonic feature where the North American continent began to pull apart approximately 1.1 billion years ago.20 This process stretched and broke the hard, brittle rocks of the Canadian Shield, creating a network of deep-seated geological faults and fractures.20 These structural features act as natural conduits or &amp;quot;superhighways&amp;quot; for radon gas, allowing it to bypass less permeable layers of rock and soil and move more readily toward the surface.26 The association of high-grade uranium occurrences with fault and shear zones further highlights the role of these structures in concentrating and transporting radon&#39;s parent elements.22&lt;/p&gt;
&lt;p&gt;Once the radon reaches the near-surface environment, the final stage of its journey is through the soil, which is composed of weathered material from the underlying bedrock. The physical properties of this soil, such as its permeability (how easily gas can pass through it), grain size, and moisture content, play a critical role in determining how much radon is released (emanated) from the soil particles and how quickly it is transported.27 For instance, fine-grained, clay-rich soils can sometimes inhibit radon transport, but they can also trap the gas, especially when saturated with water, leading to a buildup of pressure that can force radon into a home.31 The structural geology (faults) and the surficial geology (soil type) are therefore just as important as the chemical geology (uranium content) in determining the ultimate radon risk at a specific location. This helps explain why radon levels can vary significantly over short distances, as a house built over a fracture zone may have a much higher radon ingress potential than a neighboring house on solid, unfractured bedrock.&lt;/p&gt;
&lt;h2&gt;Section 3: A Hyperlocal Analysis of Radon Concentrations in Thunder Bay&lt;/h2&gt;
&lt;p&gt;While the regional geology establishes a high potential for radon, public health studies provide the crucial data on actual indoor concentrations, revealing where this potential is being realized. The data for Thunder Bay demonstrates a clear and concerning trend of elevated radon levels that are not only significantly higher than provincial and national averages but also vary dramatically from one neighborhood to the next. This hyperlocal distribution of risk is a key finding for residents, particularly those living near the Lake Superior shoreline.&lt;/p&gt;
&lt;h3&gt;3.1 The City-Wide Anomaly: Contextualizing the Data&lt;/h3&gt;
&lt;p&gt;A pivotal study conducted during the winter of 2014-2015 by the Thunder Bay District Health Unit (TBDHU) provides the most detailed local picture of residential radon. The study distributed 468 long-term test kits to homes across the city.33 The results showed that, on average, 16% of homes in Thunder Bay had radon concentrations exceeding Health Canada&#39;s action guideline of 200 Bq/m³.5&lt;/p&gt;
&lt;p&gt;To put this figure in perspective, the 16% prevalence rate is more than three times higher than the Ontario provincial average of 4.6% and more than double the Canadian national average of 6.9% reported in a 2012 Health Canada survey.4 While a more recent 2024 national survey suggests the Canadian average has risen to approximately 17.8%, the 2015 finding for Thunder Bay was already indicative of a significant local anomaly.26 The TBDHU&#39;s own analysis of the earlier Health Canada data for its specific health region had already pointed to an elevated risk, finding that 12% of homes in the district were above the guideline, a rate 50% higher than the Ontario average at the time.33&lt;/p&gt;
&lt;p&gt;This trend of elevated radon is not confined to the city limits but appears to be amplified in the surrounding rural and semi-rural areas. A subsequent TBDHU study in 2018 found an astonishing 65% of tested homes in the neighboring municipality of Oliver Paipoonge exceeded the guideline.5 Similarly, 17% of homes in Marathon, a community on the shore of Lake Superior, were found to be above the action level.5 This pattern suggests a gradient of increasing risk in less densely developed areas, a finding consistent with the 2015 Thunder Bay study, which noted that radon prevalence increased in the more rural parts of the city.36&lt;/p&gt;
&lt;h3&gt;3.2 A Ward-by-Ward Breakdown: Identifying the Hotspots&lt;/h3&gt;
&lt;p&gt;The most striking finding of the 2015 TBDHU study was the extreme variation in radon prevalence among the city&#39;s seven municipal wards. The risk is far from uniform, with some neighborhoods exhibiting rates comparable to the highest-risk areas in Canada, while others show virtually no issue. This demonstrates that a resident&#39;s risk is more accurately predicted by their specific ward than by the city&#39;s overall average.&lt;/p&gt;
&lt;p&gt;The study identified several distinct high-risk zones 5:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;High-Risk Wards:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;McIntyre Ward:&lt;/strong&gt; Exhibited the highest prevalence, with 43% of tested homes measuring above 200 Bq/m³.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Neebing Ward:&lt;/strong&gt; Showed a similarly alarming rate, with 30% of homes exceeding the guideline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Red River Ward:&lt;/strong&gt; Had 15% of homes above the action level.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Current River Ward:&lt;/strong&gt; Had 13% of homes above the action level.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moderate- to Low-Risk Wards:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;McKellar Ward:&lt;/strong&gt; 6% of homes tested above the guideline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Northwood Ward:&lt;/strong&gt; 3% to 5% of homes tested above the guideline (reports vary slightly).14&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Westfort Ward:&lt;/strong&gt; Remarkably, 0% of the homes tested in this ward were found to have elevated radon levels.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This dramatic disparity means that public health messaging based on the 16% city average would dangerously understate the risk for a resident in McIntyre Ward (where the chance of having high radon was nearly 1 in 2 in the study) while simultaneously overstating it for a resident in Westfort Ward. Effective risk communication and public health interventions in Thunder Bay must therefore be geographically targeted at the ward level.&lt;/p&gt;
&lt;h3&gt;3.3 Focus on the Waterfront: Correlating Risk with Proximity to Lake Superior&lt;/h3&gt;
&lt;p&gt;By cross-referencing the ward-level radon data with municipal maps, a clear geographical pattern emerges that directly addresses the question of radon potential near Lake Superior.38 The analysis confirms that wards with significant shoreline or proximity to the lake are among the highest-risk areas in the city.&lt;/p&gt;
&lt;p&gt;The following table synthesizes the 2015 TBDHU study data with the geographical location of each ward, highlighting the correlation between radon risk and proximity to Lake Superior.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;City Ward&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Homes Tested&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;% with Radon &amp;gt; 200 Bq/m³&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Geographical Location &amp;amp; Proximity to Lake Superior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;McIntyre&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;82&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;43%&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Northern, semi-rural ward located near the lake&#39;s northern shoreline.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Neebing&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;47&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;30%&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Southern, semi-rural ward with shoreline and proximity to the lake.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Red River&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;79&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;15%&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Northeastern ward with extensive direct shoreline on Thunder Bay.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Current River&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;68&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;13%&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;North-central ward with direct shoreline on Thunder Bay.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;McKellar&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;63&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;6%&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Central ward, set back from the immediate shoreline but still in the eastern half of the city.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Northwood&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;75&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;3-5%&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Central-western ward, located further inland from the lake.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Westfort&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;54&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;0%&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Southwestern ward, located furthest inland from the high-risk shoreline areas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Data Sources: 14&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The data clearly illustrates that the wards directly on or near the Lake Superior shoreline (Current River, Red River, McIntyre, Neebing) all exhibit elevated radon prevalence, well above provincial and national averages. In contrast, the wards located further inland and to the west (Northwood, Westfort) show progressively lower risk, culminating in the 0% prevalence found in the most inland southwestern ward, Westfort.&lt;/p&gt;
&lt;p&gt;This distinct spatial pattern, with a clear northeast-to-southwest gradient of decreasing risk, strongly suggests a direct link to the underlying geology discussed in Section 2. It is highly probable that the boundaries of the high-radon wards align with the surface expression of the high-uranium-potential geological formations, such as the Gunflint and Rove Formations. The public health data serves as a surface-level reflection of the subterranean geological map, providing a powerful, unified explanation for the observed radon distribution.&lt;/p&gt;
&lt;h2&gt;Section 4: Environmental Dynamics: The Lake Effect and Other Influences&lt;/h2&gt;
&lt;p&gt;The underlying geology provides the source of radon, but the amount that ultimately enters and accumulates in a home is heavily influenced by a complex interplay of environmental and building-specific factors. For communities near Lake Superior, the lake itself creates a unique microclimate that can significantly amplify the mechanisms of radon intrusion. This section explores how the &amp;quot;lake effect,&amp;quot; combined with soil conditions and housing characteristics, can create a &amp;quot;perfect storm&amp;quot; for elevated indoor radon levels.&lt;/p&gt;
&lt;h3&gt;4.1 Lake Superior&#39;s Climatic Influence on Building Physics&lt;/h3&gt;
&lt;p&gt;Lake Superior, due to its immense size and thermal mass, exerts a powerful moderating influence on the local climate. This &amp;quot;lake effect&amp;quot; results in cooler air temperatures near the shore during the summer and relatively warmer temperatures in the fall and early winter compared to areas further inland.39 This climatic influence can extend up to 16 kilometers from the shoreline.39 While this effect is well-known for its impact on weather, it also has direct consequences for the physics of buildings along the coast.&lt;/p&gt;
&lt;p&gt;A primary mechanism driving radon entry into homes is the &lt;strong&gt;thermal stack effect&lt;/strong&gt;.41 During the heating season, the warm air inside a house is less dense than the cold air outside. This warm air rises and escapes through small openings in the upper levels of the home (e.g., attics, window frames). This outflow of air creates a slight negative pressure, or vacuum, in the lower levels of the house, particularly the basement. This pressure differential causes the house to act like a chimney, actively drawing in replacement air from the surrounding environment. A significant portion of this replacement air is pulled directly from the soil through the foundation, bringing soil gas—and any radon it contains—with it.&lt;/p&gt;
&lt;p&gt;The proximity to Lake Superior can amplify this effect. During the cold heating season, when radon testing is most effective and levels are typically highest, the air temperatures near the lake are often colder and denser than those further inland.40 This creates a larger temperature and pressure difference between the heated interior of a lakeside home and the outside air. A larger differential powers a stronger and more persistent stack effect, meaning the house &amp;quot;sucks&amp;quot; harder on the surrounding soil, potentially increasing the rate of radon infiltration compared to an identical home in a warmer, inland location.42&lt;/p&gt;
&lt;h3&gt;4.2 The Role of Soil, Water, and Ice&lt;/h3&gt;
&lt;p&gt;The condition of the ground surrounding a home&#39;s foundation is another critical variable. Precipitation, soil moisture, and ground frost play a significant role in controlling radon transport.&lt;/p&gt;
&lt;p&gt;When the ground becomes saturated with water from heavy rain or snowmelt, the pore spaces between soil particles fill with water. This creates a barrier that is much less permeable to gas than dry soil, effectively inhibiting radon&#39;s ability to escape harmlessly into the atmosphere.43 Similarly, a layer of dense, wet snow or frozen ground in winter can create a &amp;quot;capping effect,&amp;quot; sealing the ground surface.32&lt;/p&gt;
&lt;p&gt;This capping action traps radon gas in the soil beneath and around the home&#39;s foundation, causing its concentration and pressure to build up. With its primary upward escape route blocked, the pressurized soil gas follows the path of least resistance to a lower-pressure area. This path is often directly into the home&#39;s basement, which is simultaneously creating a low-pressure zone via the stack effect.42 The combination of these two phenomena—the ground &amp;quot;pushing&amp;quot; radon due to the capping effect and the house &amp;quot;pulling&amp;quot; radon due to the stack effect—creates a powerful mechanism for radon intrusion. Given the potential for heavy lake-effect snow and saturated soils in the spring and fall, lakeside communities in Thunder Bay are particularly susceptible to this amplified push-pull dynamic.&lt;/p&gt;
&lt;h3&gt;4.3 The Built Environment: The Final Determinant&lt;/h3&gt;
&lt;p&gt;While geology and climate create the potential for high radon, the final concentration inside a specific home is ultimately determined by the characteristics of the building itself.41 Two houses built side-by-side on the same soil can have vastly different radon levels due to variations in construction and maintenance.&lt;/p&gt;
&lt;p&gt;Key building factors include the type of foundation (e.g., full basement, slab-on-grade, crawl space), the integrity of the foundation (the number and size of cracks and openings), how well penetrations for pipes and utilities are sealed, and the overall ventilation rate of the home.2&lt;/p&gt;
&lt;p&gt;The TBDHU study&#39;s finding that homes built between the 1990s and early 2000s had the highest radon levels is particularly instructive.27 This period corresponds to a time when construction practices were increasingly focused on creating more airtight, energy-efficient homes to reduce heating costs. While effective for energy conservation, this increased airtightness also reduces the natural rate of air exchange with the outdoors. If the rate of radon entry remains constant, but the rate of removal through ventilation decreases, the radon gas will accumulate to a higher equilibrium concentration inside the home. These homes were built after the push for energy efficiency but before the widespread adoption of radon-specific preventative measures in the Ontario Building Code, placing them in a potential &amp;quot;sweet spot&amp;quot; for radon accumulation.&lt;/p&gt;
&lt;p&gt;The following table summarizes the key factors that converge to influence radon levels in lakeside environments like Thunder Bay.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Influencing Factor&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Mechanism&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Typical Effect on Indoor Radon&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Uranium-Rich Geology&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Source of radon gas through radioactive decay.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Increases the baseline radon potential of the soil.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Geological Faults&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Provide high-permeability pathways for gas transport.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Facilitates efficient movement of radon from bedrock to the surface.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Lake-Cooled Air (Winter)&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Increases indoor-outdoor temperature differential.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Amplifies the thermal stack effect, increasing the &amp;quot;pull&amp;quot; of radon into the home.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Winter Heating&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Creates warm, rising air inside the home.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Drives the thermal stack effect, creating negative pressure in the basement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Saturated/Frozen Soil&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Creates a low-permeability &amp;quot;cap&amp;quot; on the ground surface.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Traps radon in the soil, increasing pressure and the &amp;quot;push&amp;quot; of radon into the home.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Foundation Cracks/Gaps&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Provide direct entry points for soil gas.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Allows radon to bypass the solid foundation and enter the building.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Low Home Ventilation&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Reduces the rate of air exchange with the outdoors.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Allows radon that enters to accumulate to higher concentrations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Data Synthesis from: 20&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In conclusion, the elevated risk in Thunder Bay&#39;s lakeside communities is not attributable to a single factor. It is the result of a synergistic system where high-potential geology provides the source, the unique lake-influenced climate and soil conditions create a powerful push-pull intrusion mechanism, and the specific characteristics of each home determine its ultimate vulnerability.&lt;/p&gt;
&lt;h2&gt;Section 5: A Practical Guide to Radon Testing and Mitigation in Thunder Bay&lt;/h2&gt;
&lt;p&gt;Given the documented high radon potential and significant hyperlocal variability in Thunder Bay, moving from analysis to action is critical for protecting resident health. Because radon levels can differ dramatically even between adjacent homes, the only way to determine the risk in any specific building is to conduct a test.5 This section provides a practical, locally-focused guide for residents on how to test their homes, interpret the results, and take effective remedial action if necessary.&lt;/p&gt;
&lt;h3&gt;5.1 Empowering Homeowners Through Testing&lt;/h3&gt;
&lt;p&gt;Testing for radon is a simple and inexpensive process that can be undertaken by homeowners themselves or by hiring a certified professional.&lt;/p&gt;
&lt;h4&gt;Long-Term Testing is the Standard&lt;/h4&gt;
&lt;p&gt;Radon levels in a home are not static; they fluctuate constantly due to changes in weather, temperature, and ventilation patterns.1 A short-term test of a few days may not capture the true average exposure. For this reason, Health Canada strongly recommends conducting a &lt;strong&gt;long-term test for a minimum of three months (91 days)&lt;/strong&gt;.1 This duration is sufficient to average out short-term fluctuations and provide a reliable estimate of a home&#39;s annual average radon concentration, which is the basis for the Canadian guideline.9 The ideal time to conduct this testing is during the &lt;strong&gt;heating season (fall and winter)&lt;/strong&gt;, as homes are typically more sealed, and the stack effect is strongest, leading to the highest and most representative radon concentrations.1&lt;/p&gt;
&lt;h4&gt;Local Do-It-Yourself (DIY) Testing Options&lt;/h4&gt;
&lt;p&gt;Several accessible and affordable options are available for residents in the Thunder Bay area:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EcoSuperior Environmental Programs:&lt;/strong&gt; This local organization is a primary resource for radon testing. They sell long-term alpha track detector kits for $50, a price that includes the device, instructions, and the subsequent laboratory analysis fees.14 Kits can be ordered online for pickup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Public Library Loan Programs:&lt;/strong&gt; In a progressive public health initiative, several libraries in Northwestern Ontario, including all branches of the &lt;strong&gt;Thunder Bay Public Library&lt;/strong&gt;, offer digital radon detectors for loan to library card holders.16 These electronic monitors provide real-time and average readings, offering a convenient way for residents to screen their homes. Other participating libraries include those in Oliver Paipoonge, Nipigon, Red Rock, Dorion, and Marathon.16&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware and Building Supply Stores:&lt;/strong&gt; Long-term test kits can also be purchased at some local hardware stores or online from various certified organizations.12&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When placing a test device, it is crucial to follow the instructions carefully. The device should be placed in the lowest level of the home that is regularly occupied for four or more hours per day (e.g., a basement family room or bedroom) and left undisturbed for the entire testing period.6&lt;/p&gt;
&lt;h4&gt;Hiring a Measurement Professional&lt;/h4&gt;
&lt;p&gt;For residents who prefer a professional service, the alternative is to hire a measurement professional certified by the &lt;strong&gt;Canadian National Radon Proficiency Program (C-NRPP)&lt;/strong&gt;.12 These professionals are trained in proper testing protocols to ensure accurate and reliable results.&lt;/p&gt;
&lt;h3&gt;5.2 Interpreting Your Results and Taking Action&lt;/h3&gt;
&lt;p&gt;Once a long-term test is complete and the results are received from the lab, they should be compared to the Health Canada guideline.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If the result is below 200 Bq/m³&lt;/strong&gt;: No immediate action is required. However, given the ALARA principle, homeowners may still consider simple measures to further reduce levels. It is also good practice to re-test every few years or after any major renovations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If the result is between 200 Bq/m³ and 600 Bq/m³&lt;/strong&gt;: Remedial action should be taken within two years.12&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If the result is above 600 Bq/m³&lt;/strong&gt;: Remedial action should be taken within one year.12&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is important to remember that even very high radon levels can be successfully reduced. A high test result is not a reason to panic but a clear signal to take corrective action.49 Radon mitigation systems are highly effective, often reducing indoor levels by over 80-90%, and can typically be installed in less than a day at a reasonable cost, generally ranging from $500 to $3,000.27&lt;/p&gt;
&lt;h3&gt;5.3 Professional Solutions: Mitigation in the Lakehead&lt;/h3&gt;
&lt;p&gt;When radon levels are found to be above the guideline, the most common and reliable solution is the installation of an &lt;strong&gt;Active Soil Depressurization (ASD)&lt;/strong&gt; system, also known as Sub-Slab Depressurization (SSD).9 This method involves inserting a small pipe through the foundation floor into the soil or gravel layer beneath. This pipe is connected to a fan, usually located in the attic or outside the home, which runs continuously. The fan creates a permanent low-pressure field under the foundation, constantly drawing radon-laden soil gas from beneath the home and safely venting it above the roofline before it has a chance to enter the living space.9&lt;/p&gt;
&lt;p&gt;While sealing major cracks in the foundation and ensuring a sealed lid on sump pits are important supplementary measures, they are rarely sufficient on their own to solve a significant radon problem.2 An ASD system is the gold standard for effective, long-term radon reduction.&lt;/p&gt;
&lt;p&gt;To ensure a mitigation system is designed and installed correctly and effectively, it is essential to hire a &lt;strong&gt;C-NRPP certified mitigation professional&lt;/strong&gt;.9 These contractors have the training and diagnostic tools to determine the best location for the suction point and the appropriate fan size for the home&#39;s specific conditions.&lt;/p&gt;
&lt;h3&gt;Table 2: Directory of Radon Testing and Mitigation Resources in Thunder Bay&lt;/h3&gt;
&lt;p&gt;The following is a directory of local and regional resources for obtaining test kits and professional services.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Resource Category&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Provider&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Contact Information&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Services Offered&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;DIY Test Kit Providers&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;EcoSuperior Environmental Programs&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;562 Red River Road, Thunder Bay, ON&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Sells C-NRPP approved long-term alpha track test kits ($50, includes lab fees). Provides public education and workshops. 16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Public Library Loan Programs&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Thunder Bay Public Libraries&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;All branches&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Loans digital radon detectors to library members for short-term screening. 16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Oliver Paipoonge Public Libraries&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Murillo &amp;amp; Rosslyn Branches&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Loans digital radon detectors. 16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;C-NRPP Certified Professionals&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Canada Radon&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;(807) 788-3245&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;mailto:info@canadaradon.com&quot;&gt;info@canadaradon.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;EXP Services Inc.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;(807) 623-9495&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;mailto:kristof.karpiuk@exp.com&quot;&gt;kristof.karpiuk@exp.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;First General Services&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;(807) 623-1276&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;mailto:mark.johnson@firstgeneral.ca&quot;&gt;mark.johnson@firstgeneral.ca&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Northern Home Designs&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;(807) 344-4567&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;mailto:northernhomedesigns@shaw.ca&quot;&gt;northernhomedesigns@shaw.ca&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Radon Safe Northwest Ltd.&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;(807) 626-3049&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;mailto:stjarre@tbaytel.net&quot;&gt;stjarre@tbaytel.net&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;SASI Water&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;(807) 622-8880&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;mailto:andrew@sasi.ca&quot;&gt;andrew@sasi.ca&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;TBT Engineering&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;(807) 624-5160&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;mailto:dsteele@tbte.ca&quot;&gt;dsteele@tbte.ca&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Stantec&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;(807) 626-5640&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;mailto:hwilson@tgcl.ca&quot;&gt;hwilson@tgcl.ca&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;em&gt;Note: The list of certified professionals is subject to change. Always verify current certification status through the C-NRPP website.&lt;/em&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Section 6: Concluding Analysis and Strategic Recommendations&lt;/h2&gt;
&lt;p&gt;This report has synthesized geological data, public health studies, and environmental science to construct a comprehensive risk profile for residential radon in Thunder Bay, with a specific focus on communities proximate to Lake Superior. The evidence points to a clear and significant public health concern that requires targeted awareness and action from residents and policymakers.&lt;/p&gt;
&lt;h3&gt;6.1 Synthesized Risk Profile for Residents Near Lake Superior&lt;/h3&gt;
&lt;p&gt;The potential for elevated indoor radon levels in homes located within several blocks of the Lake Superior shoreline in Thunder Bay is significantly higher than provincial and former national averages. This conclusion is based on a convergence of multiple, compounding risk factors that create a uniquely challenging environment.&lt;/p&gt;
&lt;p&gt;The heightened risk is not attributable to a single cause but is the result of a synergistic system comprising three primary elements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Geological Predisposition:&lt;/strong&gt; The city is founded upon the ancient, mineral-rich bedrock of the Canadian Shield. Specific geological units underlying the region, notably the Quetico Subprovince and the Gunflint and Rove Formations, are known to have high background levels of uranium, the ultimate source of radon gas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Climatic Amplification:&lt;/strong&gt; The microclimate created by Lake Superior directly influences the physics of radon intrusion. During the long heating season, colder lakeside air temperatures can amplify the thermal stack effect, causing homes to draw more forcefully on the surrounding soil. Simultaneously, lake-effect precipitation can lead to saturated or frozen ground, creating a &amp;quot;capping effect&amp;quot; that traps radon and increases subsurface gas pressure. This combination creates a powerful &amp;quot;push-pull&amp;quot; mechanism that drives radon into basements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Built Environment:&lt;/strong&gt; The final indoor concentration is determined by a home&#39;s specific construction, age, and maintenance. The extreme hyperlocal variability observed in the TBDHU study—with prevalence rates ranging from 43% in McIntyre Ward to 0% in Westfort Ward—underscores that while the environment creates the potential, the house itself determines the final exposure level.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The data from the 2015 TBDHU study confirms this risk is most pronounced in the wards with direct shoreline or a semi-rural character near the lake: &lt;strong&gt;McIntyre, Neebing, Red River, and Current River&lt;/strong&gt;. Residents in these areas face a demonstrably higher probability of living in a home with radon concentrations that exceed the Canadian action guideline. Due to this extreme variability, predictive risk mapping is insufficient for individual decision-making. Therefore, &lt;strong&gt;individual home testing is not merely a recommendation but an essential health and safety measure for all residents in these high-potential areas.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;6.2 Recommendations for Homeowners, Buyers, and Renters&lt;/h3&gt;
&lt;p&gt;Based on this analysis, the following actions are recommended for residents and stakeholders in Thunder Bay:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;For Current Homeowners:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test Your Home:&lt;/strong&gt; All homeowners, particularly those residing in the high-risk wards (McIntyre, Neebing, Red River, Current River) or in homes built between the 1980s and the early 2000s, should conduct a long-term radon test (minimum three months) during the heating season.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mitigate if Necessary:&lt;/strong&gt; If test results exceed 200 Bq/m³, contract a C-NRPP certified mitigation professional to install a radon reduction system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inform Yourself:&lt;/strong&gt; Utilize local resources like EcoSuperior and the Thunder Bay District Health Unit to learn more about radon risks and solutions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For Prospective Home Buyers:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Make Radon Testing a Condition:&lt;/strong&gt; A long-term radon test should be considered a standard and non-negotiable condition in any offer to purchase a home in Thunder Bay, akin to a professional home inspection. If time is a constraint, a short-term test can be used for screening, followed by a long-term test post-occupancy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inquire About Existing Systems:&lt;/strong&gt; When viewing a property, ask if a radon mitigation system is already installed. If so, request documentation of its installation and post-mitigation test results to ensure it is functioning effectively.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For Renters and Landlords:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Collaborate on Testing:&lt;/strong&gt; Both tenants and landlords should be aware that high radon is a potential health hazard in rental properties. Public health units may respond to tenant complaints regarding high radon levels in a manner similar to other health hazards.33 Open communication and collaborative testing are encouraged.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Landlord Responsibility:&lt;/strong&gt; Landlords have a responsibility to provide a safe living environment, and addressing a confirmed high radon level falls within this purview.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For Public Policy and Health Agencies:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Continue Targeted Awareness:&lt;/strong&gt; The TBDHU and its partners should continue public awareness campaigns, using ward-specific data to communicate risk more effectively and motivate testing in the highest-risk neighborhoods.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Promote Testing at Point of Sale:&lt;/strong&gt; As recommended in the TBDHU&#39;s 2015 report, the City of Thunder Bay should strongly consider adopting a bylaw or policy that requires all new homes to be tested for radon prior to sale and encourages testing during all real estate transactions.33&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support Financial Accessibility:&lt;/strong&gt; All levels of government should explore programs to make radon testing and mitigation more financially accessible for low-income households, ensuring that financial constraints do not become a barrier to health and safety.33&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Works cited&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Health Canada Recommends Long-Term Radon Testing: Understanding the Gu - Ecosense, accessed on October 28, 2025, &lt;a href=&quot;https://ecosense.io/blogs/blog/health-canada-recommends-long-term-radon-testing-understanding-the-guidelines-and-device-options&quot;&gt;https://ecosense.io/blogs/blog/health-canada-recommends-long-term-radon-testing-understanding-the-guidelines-and-device-options&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon and Your Health - CDC, accessed on October 28, 2025, &lt;a href=&quot;https://www.cdc.gov/radon/about/index.html&quot;&gt;https://www.cdc.gov/radon/about/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon in Homes, Schools and Buildings | US EPA, accessed on October 28, 2025, &lt;a href=&quot;https://www.epa.gov/radtown/radon-homes-schools-and-buildings&quot;&gt;https://www.epa.gov/radtown/radon-homes-schools-and-buildings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cross-Canada Survey of Radon Concentrations in Homes - Final Report, accessed on October 28, 2025, &lt;a href=&quot;https://www.canada.ca/en/health-canada/services/environmental-workplace-health/reports-publications/radiation/cross-canada-survey-radon-concentrations-homes-final-report-health-canada-2012.html&quot;&gt;https://www.canada.ca/en/health-canada/services/environmental-workplace-health/reports-publications/radiation/cross-canada-survey-radon-concentrations-homes-final-report-health-canada-2012.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon | Thunder Bay District Health Unit, accessed on October 28, 2025, &lt;a href=&quot;https://www.tbdhu.com/radon&quot;&gt;https://www.tbdhu.com/radon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Guide for radon measurements in homes - &lt;a href=&quot;http://Canada.ca&quot;&gt;Canada.ca&lt;/a&gt;, accessed on October 28, 2025, &lt;a href=&quot;https://www.canada.ca/en/health-canada/services/publications/health-risks-safety/guide-radon-measurements-residential-dwellings.html&quot;&gt;https://www.canada.ca/en/health-canada/services/publications/health-risks-safety/guide-radon-measurements-residential-dwellings.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon in Granite Countertops, accessed on October 28, 2025, &lt;a href=&quot;https://kansasradonprogram.org/sites/kansasradonprogram/files/Radon_in_Granite_Countertops_0.pdf&quot;&gt;https://kansasradonprogram.org/sites/kansasradonprogram/files/Radon_in_Granite_Countertops_0.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Granite Countertops and Radiation | US EPA, accessed on October 28, 2025, &lt;a href=&quot;https://www.epa.gov/radiation/granite-countertops-and-radiation&quot;&gt;https://www.epa.gov/radiation/granite-countertops-and-radiation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon - Reduction Guide for Canadians - &lt;a href=&quot;http://Canada.ca&quot;&gt;Canada.ca&lt;/a&gt;, accessed on October 28, 2025, &lt;a href=&quot;https://www.canada.ca/en/health-canada/services/environmental-workplace-health/reports-publications/radiation/radon-reduction-guide-canadians-health-canada.html&quot;&gt;https://www.canada.ca/en/health-canada/services/environmental-workplace-health/reports-publications/radiation/radon-reduction-guide-canadians-health-canada.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Understanding radon | Colorado Department of Public Health and Environment, accessed on October 28, 2025, &lt;a href=&quot;https://cdphe.colorado.gov/hm/understanding-radon&quot;&gt;https://cdphe.colorado.gov/hm/understanding-radon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon | Canadian Cancer Society, accessed on October 28, 2025, &lt;a href=&quot;https://cancer.ca/en/cancer-information/reduce-your-risk/know-your-environment/radon&quot;&gt;https://cancer.ca/en/cancer-information/reduce-your-risk/know-your-environment/radon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon in Your Home - Ottawa Public Health, accessed on October 28, 2025, &lt;a href=&quot;https://www.ottawapublichealth.ca/en/public-health-topics/radon-in-your-home.aspx&quot;&gt;https://www.ottawapublichealth.ca/en/public-health-topics/radon-in-your-home.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Thunder Bay District Health Unit finds high levels of radon in rural northwestern Ontario, accessed on October 28, 2025, &lt;a href=&quot;https://www.cbc.ca/news/canada/thunder-bay/radon-oliverpaipoonge-marathon-1.4895867&quot;&gt;https://www.cbc.ca/news/canada/thunder-bay/radon-oliverpaipoonge-marathon-1.4895867&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon - EcoSuperior, accessed on October 28, 2025, &lt;a href=&quot;https://www.ecosuperior.org/radon&quot;&gt;https://www.ecosuperior.org/radon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon guideline - &lt;a href=&quot;http://Canada.ca&quot;&gt;Canada.ca&lt;/a&gt;, accessed on October 28, 2025, &lt;a href=&quot;https://www.canada.ca/en/health-canada/services/health-risks-safety/radiation/radon/government-canada-radon-guideline.html&quot;&gt;https://www.canada.ca/en/health-canada/services/health-risks-safety/radiation/radon/government-canada-radon-guideline.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Testing for Radon - EcoSuperior, accessed on October 28, 2025, &lt;a href=&quot;https://www.ecosuperior.org/testing-for-radon&quot;&gt;https://www.ecosuperior.org/testing-for-radon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Find a Radon Test Kit in Ontario, accessed on October 28, 2025, &lt;a href=&quot;https://takeactiononradon.ca/provinces/ontario/&quot;&gt;https://takeactiononradon.ca/provinces/ontario/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mineral deposits in the western Superior Province, Ontario (Field Trip 9), accessed on October 28, 2025, &lt;a href=&quot;https://publications.gc.ca/collections/collection_2015/rncan-nrcan/M183-2-2164-eng.pdf&quot;&gt;https://publications.gc.ca/collections/collection_2015/rncan-nrcan/M183-2-2164-eng.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lake Superior Basin :: Lakehead Region Conservation Authority, accessed on October 28, 2025, &lt;a href=&quot;https://lakeheadca.com/events-education/geology/geology-lake-superior-basin&quot;&gt;https://lakeheadca.com/events-education/geology/geology-lake-superior-basin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Thunder Bay: Geology of the Lakehead region, accessed on October 28, 2025, &lt;a href=&quot;https://files.ontario.ca/ndmnrf-geotours-3/ndmnrf-geotours-thunder-bay-en-2021-12-13.pdf&quot;&gt;https://files.ontario.ca/ndmnrf-geotours-3/ndmnrf-geotours-thunder-bay-en-2021-12-13.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;What about radon and radioactivity in granite countertops? | US EPA, accessed on October 28, 2025, &lt;a href=&quot;https://www.epa.gov/radon/what-about-radon-and-radioactivity-granite-countertops&quot;&gt;https://www.epa.gov/radon/what-about-radon-and-radioactivity-granite-countertops&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Uranium Occurrences of the Thunder Bay-Nipigon ... - INIS-IAEA, accessed on October 28, 2025, &lt;a href=&quot;https://inis.iaea.org/collection/NCLCollectionStore/_Public/20/063/20063447.pdf&quot;&gt;https://inis.iaea.org/collection/NCLCollectionStore/_Public/20/063/20063447.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gunflint chert - Wikipedia, accessed on October 28, 2025, &lt;a href=&quot;https://en.wikipedia.org/wiki/Gunflint_chert&quot;&gt;https://en.wikipedia.org/wiki/Gunflint_chert&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The age of the Gunflint Formation, Ontario, Canada: Single zircon U-Pb age determinations from reworked volcanic ash - ResearchGate, accessed on October 28, 2025, &lt;a href=&quot;https://www.researchgate.net/publication/237169037_The_age_of_the_Gunflint_Formation_Ontario_Canada_Single_zircon_U-Pb_age_determinations_from_reworked_volcanic_ash&quot;&gt;https://www.researchgate.net/publication/237169037_The_age_of_the_Gunflint_Formation_Ontario_Canada_Single_zircon_U-Pb_age_determinations_from_reworked_volcanic_ash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OGS GeoData Listing for PEEVER - Geology Ontario, accessed on October 28, 2025, &lt;a href=&quot;https://www.geologyontario.mndm.gov.on.ca/mndmfiles/dl/data/records/OGSDataListing_PEEVER.html&quot;&gt;https://www.geologyontario.mndm.gov.on.ca/mndmfiles/dl/data/records/OGSDataListing_PEEVER.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cross-Canada Radon Survey, accessed on October 28, 2025, &lt;a href=&quot;https://crosscanadaradon.ca/survey/&quot;&gt;https://crosscanadaradon.ca/survey/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Some neighbourhoods more exposed to cancer-causing gas than others, accessed on October 28, 2025, &lt;a href=&quot;https://www.tbnewswatch.com/local-news/some-neighbourhoods-more-exposed-to-cancer-causing-gas-than-others-403385&quot;&gt;https://www.tbnewswatch.com/local-news/some-neighbourhoods-more-exposed-to-cancer-causing-gas-than-others-403385&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Soil radon measurements in the Canadian cities - PubMed, accessed on October 28, 2025, &lt;a href=&quot;https://pubmed.ncbi.nlm.nih.gov/22128363/&quot;&gt;https://pubmed.ncbi.nlm.nih.gov/22128363/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Geologic and climatic controls on the radon emanation coefficient - &lt;a href=&quot;http://USGS.gov&quot;&gt;USGS.gov&lt;/a&gt;, accessed on October 28, 2025, &lt;a href=&quot;https://www.usgs.gov/publications/geologic-and-climatic-controls-radon-emanation-coefficient&quot;&gt;https://www.usgs.gov/publications/geologic-and-climatic-controls-radon-emanation-coefficient&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(PDF) Geologic and climatic controls on the radon emanation coefficient - ResearchGate, accessed on October 28, 2025, &lt;a href=&quot;https://www.researchgate.net/publication/222853263_Geologic_and_climatic_controls_on_the_radon_emanation_coefficient&quot;&gt;https://www.researchgate.net/publication/222853263_Geologic_and_climatic_controls_on_the_radon_emanation_coefficient&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon emanation and soil moisture effects on airborne gamma-ray measurements, accessed on October 28, 2025, &lt;a href=&quot;https://inis.iaea.org/search/search.aspx?orig_q=RN:29021427&quot;&gt;https://inis.iaea.org/search/search.aspx?orig_q=RN:29021427&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Effects of weather and soil characteristics on temporal variations in soil-gas radon concentrations - &lt;a href=&quot;http://USGS.gov&quot;&gt;USGS.gov&lt;/a&gt;, accessed on October 28, 2025, &lt;a href=&quot;https://www.usgs.gov/index.php/publications/effects-weather-and-soil-characteristics-temporal-variations-soil-gas-radon&quot;&gt;https://www.usgs.gov/index.php/publications/effects-weather-and-soil-characteristics-temporal-variations-soil-gas-radon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Prevalence of High Residential Radon in Thunder Bay, Ontario, accessed on October 28, 2025, &lt;a href=&quot;https://www.tbdhu.com/sites/default/files/files/resource/2018-05/The%20Prevalence%20of%20High%20Level%20of%20Radon%20in%20Thunder%20Bay.pdf&quot;&gt;https://www.tbdhu.com/sites/default/files/files/resource/2018-05/The%20Prevalence%20of%20High%20Level%20of%20Radon%20in%20Thunder%20Bay.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Thunder Bay man surprised by high radon levels in his home (3 Photos), accessed on October 28, 2025, &lt;a href=&quot;https://www.tbnewswatch.com/local-news/thunder-bay-man-surprised-by-high-radon-levels-in-his-home-3-photos-1743732&quot;&gt;https://www.tbnewswatch.com/local-news/thunder-bay-man-surprised-by-high-radon-levels-in-his-home-3-photos-1743732&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;High Levels of Radon in Oliver Paipoonge and Marathon | Thunder Bay District Health Unit, accessed on October 28, 2025, &lt;a href=&quot;https://www.tbdhu.com/news/high-levels-of-radon-oliver-paipoonge-and-marathon&quot;&gt;https://www.tbdhu.com/news/high-levels-of-radon-oliver-paipoonge-and-marathon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TBDHU Invites Residents in Oliver Paipoonge and Marathon to Join Radon Study, accessed on October 28, 2025, &lt;a href=&quot;https://www.netnewsledger.com/2017/10/02/tbdhu-invites-residents-oliver-paipoonge-marathon-join-radon-study/&quot;&gt;https://www.netnewsledger.com/2017/10/02/tbdhu-invites-residents-oliver-paipoonge-marathon-join-radon-study/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Officials Surprised by High Radon Levels, accessed on October 28, 2025, &lt;a href=&quot;https://airthings.co.kr/officials-surprised-by-high-radon-levels/%ED%93%86oredirect=true.html&quot;&gt;https://airthings.co.kr/officials-surprised-by-high-radon-levels/%ED%93%86oredirect=true.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Maps - City of Thunder Bay, accessed on October 28, 2025, &lt;a href=&quot;https://www.thunderbay.ca/en/city-services/maps.aspx&quot;&gt;https://www.thunderbay.ca/en/city-services/maps.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Draft Report - Lakehead Region Conservation Authority, accessed on October 28, 2025, &lt;a href=&quot;https://lakeheadca.com/application/files/1516/6785/6327/Lakehead_Watershed_Characterization_Report.pdf&quot;&gt;https://lakeheadca.com/application/files/1516/6785/6327/Lakehead_Watershed_Characterization_Report.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lake Superior&#39;s summer cooling of shorelines and adjacent inland ..., accessed on October 28, 2025, &lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC10753639/&quot;&gt;https://pmc.ncbi.nlm.nih.gov/articles/PMC10753639/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Assessing the Impact of Housing Features and Environmental Factors on Home Indoor Radon Concentration Levels on the Navajo Nation - PubMed Central, accessed on October 28, 2025, &lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7215699/&quot;&gt;https://pmc.ncbi.nlm.nih.gov/articles/PMC7215699/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;When are radon levels highest? | Protect Environmental, accessed on October 28, 2025, &lt;a href=&quot;https://www.protectenvironmental.com/when-are-radon-levels-the-highest/&quot;&gt;https://www.protectenvironmental.com/when-are-radon-levels-the-highest/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How the Weather Affects Home Radon Levels, accessed on October 28, 2025, &lt;a href=&quot;https://www.festaradontech.com/blogs/news/how-the-weather-affects-home-radon-levels&quot;&gt;https://www.festaradontech.com/blogs/news/how-the-weather-affects-home-radon-levels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Long-Term Impacts of Weather Conditions on Indoor Radon ... - MDPI, accessed on October 28, 2025, &lt;a href=&quot;https://www.mdpi.com/2073-4433/13/1/92&quot;&gt;https://www.mdpi.com/2073-4433/13/1/92&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pmc.ncbi.nlm.nih.gov&quot;&gt;pmc.ncbi.nlm.nih.gov&lt;/a&gt;, accessed on October 28, 2025, &lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC11926057/#:~:text=Increased%20rainfall%20can%20lead%20to,et%20al.%2C%202010).&quot;&gt;https://pmc.ncbi.nlm.nih.gov/articles/PMC11926057/#:~:text=Increased%20rainfall%20can%20lead%20to,et%20al.%2C%202010).&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rise in Soil Moisture Sparks Urgent Radon Mitigation Across St. Louis - Norwood, accessed on October 28, 2025, &lt;a href=&quot;https://pr.norwoodtownnews.com/article/Rise-in-Soil-Moisture-Sparks-Urgent-Radon-Mitigation-Across-St-Louis?storyId=682fd667b78c060008671e7a&quot;&gt;https://pr.norwoodtownnews.com/article/Rise-in-Soil-Moisture-Sparks-Urgent-Radon-Mitigation-Across-St-Louis?storyId=682fd667b78c060008671e7a&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Air Sense Environmental on Radon and Climate Change: Is Rising Soil Moisture Increasing the Risk?, accessed on October 28, 2025, &lt;a href=&quot;https://airsenseenvironmental.com/air-sense-environmental-on-radon-and-climate-change-is-rising-soil-moisture-increasing-the-risk/&quot;&gt;https://airsenseenvironmental.com/air-sense-environmental-on-radon-and-climate-change-is-rising-soil-moisture-increasing-the-risk/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Prevalence of High Residential Radon in Two Communities within Thunder Bay District, accessed on October 28, 2025, &lt;a href=&quot;https://www.tbdhu.com/sites/default/files/files/resource/2018-11/The%20Prevalence%20of%20High%20Residential%20Radon%20in%20Two%20Communities%20within%20Thunder%20Bay%20District_0.pdf&quot;&gt;https://www.tbdhu.com/sites/default/files/files/resource/2018-11/The%20Prevalence%20of%20High%20Residential%20Radon%20in%20Two%20Communities%20within%20Thunder%20Bay%20District_0.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon: What you need to know - &lt;a href=&quot;http://Canada.ca&quot;&gt;Canada.ca&lt;/a&gt;, accessed on October 28, 2025, &lt;a href=&quot;https://www.canada.ca/en/health-canada/services/video/radon-what-you-need-to-know.html&quot;&gt;https://www.canada.ca/en/health-canada/services/video/radon-what-you-need-to-know.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Testing your home for radon - &lt;a href=&quot;http://Canada.ca&quot;&gt;Canada.ca&lt;/a&gt;, accessed on October 28, 2025, &lt;a href=&quot;https://www.canada.ca/en/health-canada/services/health-risks-safety/radiation/radon/testing-your-home.html&quot;&gt;https://www.canada.ca/en/health-canada/services/health-risks-safety/radiation/radon/testing-your-home.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon Test Kit | EcoSuperior Environmental Programs - Square, accessed on October 28, 2025, &lt;a href=&quot;https://ecosuperior.square.site/product/radon-test-kit/174&quot;&gt;https://ecosuperior.square.site/product/radon-test-kit/174&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radon Gas Testing Goes Digital - Your Thunder Bay, accessed on October 28, 2025, &lt;a href=&quot;https://yourthunderbay.ca/232408-2/&quot;&gt;https://yourthunderbay.ca/232408-2/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Order a Radon test kit, accessed on October 28, 2025, &lt;a href=&quot;https://takeactiononradon.ca/test-for-radon/radon-test-kits/&quot;&gt;https://takeactiononradon.ca/test-for-radon/radon-test-kits/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description><pubDate>Mon, 27 Oct 2025 20:00:00 -0400</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2025-10-28-radon-risk-in-thunder-bay/</guid>
    </item>
    <item>
      <title>Counter-Strike 1.6 Discord Bot</title>
      <link>https://sbmesh.com/blog/posts/2025-10-20-counter-strike-1-6-discord-bot/</link><description>&lt;h2&gt;Announcing: A Smart Two-Way Bridge for Counter-Strike 1.6 and Discord!&lt;/h2&gt;
&lt;p&gt;Ever wanted to see what’s happening on your classic Counter-Strike 1.6 server right from Discord? Or maybe let your Discord community chat with players in-game, even if they’re not at their PC?&lt;/p&gt;
&lt;p&gt;I’ve built a new Python bot that does just that, creating a seamless, two-way bridge between your CS 1.6 server and a designated Discord channel. It’s a lightweight, smart solution to keep your community connected.&lt;/p&gt;
&lt;h3&gt;What It Does: The Key Features&lt;/h3&gt;
&lt;p&gt;This isn’t just a simple log-dumper. It’s a smart bridge designed to be useful, not noisy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Smart Human Detection:&lt;/strong&gt; This is the best part. The bot stays quiet and &lt;strong&gt;suppresses all server messages&lt;/strong&gt; (like map changes or bot-only kills) when the server is empty. As soon as the &lt;strong&gt;first human player joins&lt;/strong&gt;, the bot wakes up and starts relaying all activity. When the last human leaves, it goes quiet again. No more spamming your Discord channel when no one is playing!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Two-Way Chat:&lt;/strong&gt; Messages from Discord are sent directly into the in-game chat. In-game messages (&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;say&lt;/p&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;p&gt;say_team&lt;/p&gt;
&lt;p&gt;) are relayed to Discord, complete with team icons (🔵/🔴) and even a &lt;strong&gt;tombstone emoji (🪦)&lt;/strong&gt; if the player is dead.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Full Game Event Reporting:&lt;/strong&gt; Get real-time updates for all important events:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Kills:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Player A killed Player B with an awp 💥&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Joins/Leaves:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;👋 Player C joined the server&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bomb Events:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;💣 The bomb has been planted!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Round/Win Events:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔄 Round started!&lt;/p&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;p&gt;🔴 Terrorists Win! (CT 5, T 2)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GeoIP Player Flags:&lt;/strong&gt; See where your players are from! The bot automatically looks up player IPs and assigns a country flag (e.g., 🇨🇦, 🇺🇸). Bots get a 🤖 icon, and any failed human lookups get a 🏳️.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How It Works&lt;/h3&gt;
&lt;p&gt;The bot is built on two simple principles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UDP Log Listener:&lt;/strong&gt; You configure your CS 1.6 server to send its logs in real-time to the bot (using the&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;logaddress_add&lt;/p&gt;
&lt;p&gt;command). The bot listens on a port (default:&lt;/p&gt;
&lt;p&gt;800&lt;/p&gt;
&lt;p&gt;8), parses these logs, and formats them for Discord.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Asynchronous RCON Client:&lt;/strong&gt; When a user types a message in your Discord channel, the bot uses RCON (the server’s remote-control protocol) to send a&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;say&lt;/p&gt;
&lt;p&gt;command to the game, broadcasting the message to all players.&lt;/p&gt;
&lt;h3&gt;How to Set Up Your Own Bridge&lt;/h3&gt;
&lt;p&gt;Ready to try it? You’ll need a server (a simple VPS or even a home machine) to run the Python script.&lt;/p&gt;
&lt;h4&gt;Step 1: Get the Script &amp;amp; Install Dependencies&lt;/h4&gt;
&lt;p&gt;First, save the Python code above as&lt;/p&gt;
&lt;p&gt;cs_discord_bridge.py&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;You’ll need Python 3 installed. Then, install the required Python libraries using pip:&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
pip install discord.py geoip2 tomli

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;*(Note:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tomli&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;is used as a fallback for&lt;/p&gt;
&lt;p&gt;tomllib&lt;/p&gt;
&lt;p&gt;on Python versions older than 3.11).*&lt;/p&gt;
&lt;h4&gt;Step 2: Get the GeoIP Database&lt;/h4&gt;
&lt;p&gt;For the country flag feature, you need to download the free GeoLite2 Country database from MaxMind.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://www.maxmind.com/en/geolite2/signup&quot;&gt;MaxMind GeoLite2 free database page&lt;/a&gt; and sign up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download the &lt;strong&gt;“GeoLite2-Country”&lt;/strong&gt; database (it will be a&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.mmdb&lt;/p&gt;
&lt;p&gt;file).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Place this file (e.g.,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GeoLite2-Country.mmdb&lt;/p&gt;
&lt;p&gt;) on your server in a location the bot can access.&lt;/p&gt;
&lt;h4&gt;Step 3: Create Your&lt;/h4&gt;
&lt;p&gt;config.toml&lt;/p&gt;
&lt;p&gt;Next, create a file named&lt;/p&gt;
&lt;p&gt;config.toml&lt;/p&gt;
&lt;p&gt;in the &lt;em&gt;same directory&lt;/em&gt; as your Python script. This is where you’ll put all your settings.&lt;/p&gt;
&lt;p&gt;Here is a template. &lt;strong&gt;You must fill in the required values.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ini, TOML&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
# --- Required Settings ---

# Your Discord Bot Token (get from Discord Developer Portal)
discord_token = &amp;quot;YOUR_BOT_TOKEN_HERE&amp;quot;

# The ID of the Discord channel you want to bridge
discord_channel_id = &amp;quot;YOUR_CHANNEL_ID_HERE&amp;quot;

# Your Counter-Strike 1.6 server&#39;s IP or hostname
cs_host = &amp;quot;12.34.56.78&amp;quot;

# Your Counter-Strike 1.6 server&#39;s RCON port (usually the same as game port)
cs_port = 27015

# Your server&#39;s RCON password (from server.cfg)
cs_rcon_password = &amp;quot;YOUR_RCON_PASSWORD_HERE&amp;quot;

# --- Optional Settings ---

# Path to the GeoIP database you downloaded in Step 2
geoip_db = &amp;quot;/path/to/GeoLite2-Country.mmdb&amp;quot;

# The IP address for the bot to listen on.
# &amp;quot;0.0.0.0&amp;quot; is usually correct to listen on all available IPs.
listen_host = &amp;quot;0.0.0.0&amp;quot;

# The port for the bot to listen for CS logs on.
# This MUST match what you set in Step 4.
listen_port = 8008

# Set to &#39;true&#39; to allow bot-on-bot kills and other bot-only
# activity to be posted even when no humans are on.
allow_bot_messages = false

# The prefix for bot commands in Discord (e.g., !players)
# The bridge will ignore messages starting with this.
discord_prefix = &amp;quot;!&amp;quot;

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;To get a Bot Token:&lt;/strong&gt; You need to create an “Application” in the &lt;a href=&quot;https://www.google.com/search?q=https://discord.com/developers/applications&quot;&gt;Discord Developer Portal&lt;/a&gt;. Create a Bot, and be sure to enable the &lt;strong&gt;Message Content Intent&lt;/strong&gt; under the “Bot” tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;To get a Channel ID:&lt;/strong&gt; In Discord, enable Developer Mode (Settings &amp;gt; Advanced), then right-click your channel and select “Copy ID”.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Step 4: Configure Your CS 1.6 Server&lt;/h4&gt;
&lt;p&gt;Now, tell your Counter-Strike server to send its logs to your bot.&lt;/p&gt;
&lt;p&gt;Add the following line to your server’s&lt;/p&gt;
&lt;p&gt;server.cfg&lt;/p&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;p&gt;autoexec.cfg&lt;/p&gt;
&lt;p&gt;. Replace&lt;/p&gt;
&lt;p&gt;BOT_SERVER_IP&lt;/p&gt;
&lt;p&gt;with the IP of the machine where your Python script is running, and make sure the port matches your&lt;/p&gt;
&lt;p&gt;listen_port&lt;/p&gt;
&lt;p&gt;from&lt;/p&gt;
&lt;p&gt;config.toml&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
log on
logaddress_add BOT_SERVER_IP:8008

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You will need to restart your server (or change maps) for this to take effect.&lt;/p&gt;
&lt;h4&gt;Step 5: Run the Bot!&lt;/h4&gt;
&lt;p&gt;You’re all set. Go to the directory with your script and config file and run:&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
python3 cs_discord_bridge.py

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If all goes well, you’ll see console messages indicating it has logged into Discord and is listening for logs. Now, when you join your server, you should see the activity pop up in your Discord channel!&lt;/p&gt;
&lt;p&gt;That’s it! You now have a smart, modern bridge to your classic CS 1.6 server. Feel free to grab the code and try it out.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sbmesh.com/bot.py&quot;&gt;https://sbmesh.com/bot.py&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
#!/usr/bin/env python3
&amp;quot;&amp;quot;&amp;quot;
cs_discord_bridge.py — Two-way Discord ↔ Counter-Strike 1.6 bridge
Features:
 - Chat relay (say, say_team) with tombstone for dead players
 - Join / leave (posts leave messages always)
 - Kill events (killer → victim, with flags, headshots)
 - Suicide / world kills
 - Bomb events (spawned, dropped, got, planted, defused, bombed) with 💣 emoji
 - Discord → CS chat via asynchronous RCON client
 - Consistent GeoIP flags (🤖 for bots, 🏳️ for failed human lookups)
 - Enhanced debugging for shell command execution
 - Round start/end and team win messages with scores
 - Map change messages suppressed until human detected, re-suppressed when all humans leave
 - Messages sent when human player (non-BOT SteamID) detected in logs
 - Message suppression for non-disconnect events when no humans

Listen port set to 8008 for CS logs.
&amp;quot;&amp;quot;&amp;quot;

import asyncio
import datetime
import os
import re
from typing import Optional
from io import BytesIO

try:
    import tomllib  # py311+
except ModuleNotFoundError:
    import tomli as tomllib

import discord
from discord.ext import commands
import geoip2.database

def cc_to_flag(cc: str) -&amp;gt; str:
    if not cc or len(cc) != 2:
        return &amp;quot;🏳️&amp;quot;  # White flag for failed GeoIP lookups for humans
    base = 127397
    return chr(ord(cc[0].upper()) + base) + chr(ord(cc[1].upper()) + base)

# --- Asynchronous RCON Client Class (UDP Version) ---
class RconClient:
    def __init__(self, host, port, password):
        self.host = host
        self.port = port
        self.password = password
        self.packet_size = 1024

    async def get_challenge(self):
        loop = asyncio.get_running_loop()
        on_done = loop.create_future()
        
        message = b&#39;&#92;xFF&#92;xFF&#92;xFF&#92;xFFgetchallenge&#92;n&#39;

        class ChallengeProtocol(asyncio.DatagramProtocol):
            def __init__(self):
                self.transport = None
                self.future = on_done

            def connection_made(self, transport):
                self.transport = transport
                self.transport.sendto(message)

            def datagram_received(self, data, addr):
                try:
                    challenge = data[5:].decode().split(&#39; &#39;)[1].strip()
                    self.future.set_result(challenge)
                except (IndexError, UnicodeDecodeError) as e:
                    self.future.set_exception(ValueError(f&amp;quot;Invalid challenge response: {e}&amp;quot;))
                finally:
                    self.transport.close()

            def error_received(self, exc):
                self.future.set_exception(exc)
                self.transport.close()
        
        try:
            transport, protocol = await loop.create_datagram_endpoint(
                ChallengeProtocol,
                remote_addr=(self.host, self.port)
            )
            return await asyncio.wait_for(on_done, timeout=5.0)
        except asyncio.TimeoutError:
            print(f&amp;quot;[{now_iso()}] RCON challenge request timed out.&amp;quot;)
        except Exception as e:
            print(f&amp;quot;[{now_iso()}] [ERROR] Getting RCON challenge: {e}&amp;quot;)
        return None

    async def send_command(self, command: str):
            challenge = await self.get_challenge()
            if not challenge:
                print(f&amp;quot;[{now_iso()}] Cannot send command, failed to get RCON challenge.&amp;quot;)
                return

            loop = asyncio.get_running_loop()
            on_done = loop.create_future()

            message_buffer = BytesIO()
            message_buffer.write(b&#39;&#92;xFF&#92;xFF&#92;xFF&#92;xFF&#39;)
            message_buffer.write(&#39;rcon &#39;.encode())
            message_buffer.write(challenge.encode())
            message_buffer.write(b&#39; &#39;)
            message_buffer.write(self.password.encode())
            message_buffer.write(b&#39; &#39;) # New line
            message_buffer.write(command.encode()) # New line
            message_buffer.write(b&#39;&#92;n&#39;)

            message_bytes = message_buffer.getvalue()

            class CommandProtocol(asyncio.DatagramProtocol):
                def __init__(self):
                    self.transport = None
                    self.future = on_done

                def connection_made(self, transport):
                    self.transport = transport
                    self.transport.sendto(message_bytes)
                    self.future.set_result(None)
                    self.transport.close()

                def error_received(self, exc):
                    self.future.set_exception(exc)
                    self.transport.close()

            try:
                transport, protocol = await loop.create_datagram_endpoint(
                    CommandProtocol,
                    remote_addr=(self.host, self.port)
                )
                await asyncio.wait_for(on_done, timeout=5.0)
                print(f&amp;quot;[{now_iso()}] Sent RCON command: {command}&amp;quot;)
            except asyncio.TimeoutError:
                print(f&amp;quot;[{now_iso()}] RCON command timed out.&amp;quot;)
            except Exception as e:
                print(f&amp;quot;[{now_iso()}] [ERROR] Sending RCON command: {e}&amp;quot;)

# --- Regexes ---
HL_SAY_REGEXES = [
    re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; say &amp;quot;(.*)&amp;quot;(?: &#92;(dead&#92;))?$&#39;),
    re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; say_team &amp;quot;(.*)&amp;quot;(?: &#92;(dead&#92;))?$&#39;),
]

CONNECT_REGEX = re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; connected, address &amp;quot;(.+?):(&#92;d+)&amp;quot;$&#39;)

JOIN_LEAVE_REGEXES = [
    re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; entered the game$&#39;),
    re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; disconnected(?: &#92;(reason &amp;quot;(.*?)&amp;quot;&#92;))?$&#39;),
    re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; joined team &amp;quot;(.*)&amp;quot;$&#39;),
]

KILL_REGEX = re.compile(
    r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; killed &amp;quot;(.+?)&amp;quot; with &amp;quot;(.*?)&amp;quot;(?: &#92;(headshot&#92;))?$&#39;
)

SUICIDE_REGEXES = [
    re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; committed suicide with &amp;quot;(.*?)&amp;quot;$&#39;),
    re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; killed self with &amp;quot;(.*?)&amp;quot;$&#39;),
]

BOMB_REGEX = re.compile(
    r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; triggered &amp;quot;(Spawned_With_The_Bomb|Dropped_The_The_Bomb|Got_The_Bomb|Planted_The_Bomb)&amp;quot;&#39;
)

TEAM_BOMB_REGEX = re.compile(
    r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: Team &amp;quot;(CT|TERRORIST)&amp;quot; triggered &amp;quot;(Bomb_Defused|Target_Bombed)&amp;quot; &#92;(CT &amp;quot;(&#92;d+)&amp;quot;&#92;) &#92;(T &amp;quot;(&#92;d+)&amp;quot;&#92;)&#39;
)

STEAM_VALIDATE_REGEX = re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; STEAM USERID validated$&#39;)

RCON_REGEX = re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: Rcon: &amp;quot;rcon (.+)&amp;quot; from &amp;quot;(.+)&amp;quot;$&#39;)

MAPCHANGE_REGEX = re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: Started map &amp;quot;(.+)&amp;quot; &#92;(CRC &amp;quot;.+&amp;quot;&#39;)

STARTED_MAP_REGEX = re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: Started map &amp;quot;(.+?)&amp;quot;&#39;)

ROUND_START_REGEX = re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: World triggered &amp;quot;Round_Start&amp;quot;$&#39;)
ROUND_END_REGEX = re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: World triggered &amp;quot;Round_End&amp;quot;$&#39;)
TEAM_WIN_REGEX = re.compile(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: Team &amp;quot;(CT|TERRORIST)&amp;quot; triggered &amp;quot;(CTs_Win|Terrorists_Win)&amp;quot; &#92;(CT &amp;quot;(&#92;d+)&amp;quot;&#92;) &#92;(T &amp;quot;(&#92;d+)&amp;quot;&#92;)$&#39;)

def now_iso():
    return datetime.datetime.now().astimezone().isoformat(timespec=&amp;quot;seconds&amp;quot;)

class HLLogUDP(asyncio.DatagramProtocol):
    def __init__(self, on_line):
        super().__init__()
        self.on_line = on_line

    def datagram_received(self, data: bytes, addr):
        try:
            text = data.decode(&#39;utf-8&#39;, errors=&#39;replace&#39;).strip()
        except Exception:
            text = repr(data)
        for line in text.splitlines():
            asyncio.create_task(self.on_line(line, addr))

class CSDiscordBridge:
    def __init__(self, cfg: dict):
        self.cfg = cfg
        intents = discord.Intents.default()
        intents.message_content = True
        intents.messages = True  # Ensure message intents are enabled
        self.bot = commands.Bot(command_prefix=cfg.get(&amp;quot;discord_prefix&amp;quot;, &amp;quot;!&amp;quot;), intents=intents)
        self.channel: Optional[discord.TextChannel] = None

        self.geoip_reader = None
        db_path = self.cfg.get(&amp;quot;geoip_db&amp;quot;, &amp;quot;/home/csserver/discord/GeoLite2-Country.mmdb&amp;quot;)
        try:
            self.geoip_reader = geoip2.database.Reader(db_path)
        except Exception as e:
            print(f&amp;quot;[{now_iso()}] [WARN] GeoIP not available: {e}&amp;quot;)
        self.player_flags = {}

        self.connected_players = {}
        self.has_human_player = False
        self.allow_bot_messages = cfg.get(&amp;quot;allow_bot_messages&amp;quot;, False)
        self.pending_map_change = None
        self.suppress_join_messages = False

        self.bot.event(self.on_ready)
        self.bot.event(self.on_message)

        self.rcon_client = RconClient(
            self.cfg[&amp;quot;cs_host&amp;quot;],
            int(self.cfg[&amp;quot;cs_port&amp;quot;]),
            self.cfg[&amp;quot;cs_rcon_password&amp;quot;]
        )

    async def on_ready(self):
        ch_id = int(self.cfg[&amp;quot;discord_channel_id&amp;quot;])
        try:
            self.channel = self.bot.get_channel(ch_id) or await self.bot.fetch_channel(ch_id)
            print(f&amp;quot;[{now_iso()}] Logged in as {self.bot.user}. Bridging to #{self.channel.name} ({self.channel.id})&amp;quot;)
        except Exception as e:
            print(f&amp;quot;[{now_iso()}] [ERROR] Failed to fetch Discord channel {ch_id}: {e}&amp;quot;)
            return
        
        await self._send_startup_commands()

        listen_host = self.cfg.get(&amp;quot;listen_host&amp;quot;, &amp;quot;0.0.0.0&amp;quot;)
        listen_port = int(self.cfg.get(&amp;quot;listen_port&amp;quot;, 8008))
        loop = asyncio.get_running_loop()
        print(f&amp;quot;[{now_iso()}] Listening for HL logs on {listen_host}:{listen_port}&amp;quot;)
        try:
            await loop.create_datagram_endpoint(
                lambda: HLLogUDP(self.handle_hl_line),
                local_addr=(listen_host, listen_port)
            )
        except Exception as e:
            print(f&amp;quot;[{now_iso()}] [ERROR] Failed to start UDP listener: {e}&amp;quot;)

    async def _send_startup_commands(self):
        print(f&amp;quot;[{now_iso()}] Sending RCON command to disable chat prefixes...&amp;quot;)
        await self.rcon_client.send_command(&#39;amx_chat_prefix &amp;quot;&amp;quot;&#39;)
        await self.rcon_client.send_command(&#39;cs_chat_prefix &amp;quot;&amp;quot;&#39;)
        await self.rcon_client.send_command(&#39;sv_say_prefix &amp;quot;&amp;quot;&#39;)

    async def on_message(self, message: discord.Message):
        print(f&amp;quot;[{now_iso()}] [DEBUG] Received Discord message: author={message.author}, channel={message.channel.id}, content={message.content}&amp;quot;)
        if message.author.bot:
            print(f&amp;quot;[{now_iso()}] [DEBUG] Ignoring message from bot: {message.author}&amp;quot;)
            return
        if not self.channel or message.channel.id != self.channel.id:
            print(f&amp;quot;[{now_iso()}] [DEBUG] Message from wrong channel: {message.channel.id}, expected {self.channel.id if self.channel else &#39;None&#39;}&amp;quot;)
            return

        prefix = self.cfg.get(&amp;quot;discord_prefix&amp;quot;, &amp;quot;!&amp;quot;)
        if message.content.startswith(prefix):
            print(f&amp;quot;[{now_iso()}] [DEBUG] Ignoring command with prefix: {message.content}&amp;quot;)
            return

        content = self._sanitize_discord(message.content)
        author = message.author.display_name
        
        line = f&#39;say (DISCORD) {author}: {content}&#39;
        print(f&amp;quot;[{now_iso()}] [DEBUG] Processing Discord message: {line} (has_human_player={self.has_human_player})&amp;quot;)
        await self._send_rcon_say(line)

    async def _send_rcon_say(self, command: str):
        limit = self.cfg.get(&amp;quot;say_length_limit&amp;quot;, 190)
        if len(command) &amp;gt; limit:
            command = command[:limit-1] + &amp;quot;…&amp;quot;
        
        print(f&amp;quot;[{now_iso()}] [DEBUG] Sending RCON command to CS: {command}&amp;quot;)
        await self.rcon_client.send_command(command)

    async def handle_hl_line(self, line: str, addr):
        if &amp;quot;Server cvar&amp;quot; in line:
            return
        print(f&amp;quot;[{now_iso()}] Received log: {line}&amp;quot;)

        # Strip potential garbage prefixes like ����log
        cleaned_line = line
        if line.startswith(&#39;&#92;ufffd&#92;ufffd&#92;ufffd&#92;ufffdlog&#39;):
            cleaned_line = line[8:].strip()
            print(f&amp;quot;[{now_iso()}] Stripped garbage prefix, cleaned log: {cleaned_line}&amp;quot;)

        log_start_match = re.search(r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}:&#39;, cleaned_line)
        if not log_start_match:
            print(f&amp;quot;[{now_iso()}] Unmatched log (no valid start): {cleaned_line}&amp;quot;)
            if &amp;quot;connected, address&amp;quot; in cleaned_line and self._parse_connected(cleaned_line):
                return
            return

        cleaned_line = cleaned_line[log_start_match.start():].strip()
        print(f&amp;quot;[{now_iso()}] Cleaned log: {cleaned_line}&amp;quot;)

        map_change = self._parse_mapchange(cleaned_line)
        if map_change:
            print(f&amp;quot;[{now_iso()}] Detected map change: {map_change}. Storing for later.&amp;quot;)
            self.pending_map_change = map_change
            self.suppress_join_messages = True
            await self._post_to_discord(map_change, force=True)
            return
        
        if self._parse_steam_validated(cleaned_line):
            return
            
        if self._parse_rcon(cleaned_line):
            return

        if self._parse_connected(cleaned_line):
            return

        joinleave = self._parse_join_leave(cleaned_line)
        if joinleave:
            print(f&amp;quot;[{now_iso()}] Parsed join/leave: {joinleave} (has_human_player={self.has_human_player})&amp;quot;)
            await self._post_to_discord(joinleave)
            return

        say, team_flag, payload = self._parse_say(cleaned_line)
        if say:
            print(f&amp;quot;[{now_iso()}] Parsed say (team={team_flag}): {payload} (has_human_player={self.has_human_player})&amp;quot;)
            await self._post_to_discord(payload)
            return

        kill = self._parse_kill(cleaned_line)
        if kill:
            print(f&amp;quot;[{now_iso()}] Parsed kill: {kill} (has_human_player={self.has_human_player})&amp;quot;)
            await self._post_to_discord(kill)
            return

        suicide = self._parse_suicide(cleaned_line)
        if suicide:
            print(f&amp;quot;[{now_iso()}] Parsed suicide: {suicide} (has_human_player={self.has_human_player})&amp;quot;)
            await self._post_to_discord(suicide)
            return

        bomb = self._parse_bomb(cleaned_line)
        if bomb:
            print(f&amp;quot;[{now_iso()}] Parsed bomb event: {bomb} (has_human_player={self.has_human_player})&amp;quot;)
            await self._post_to_discord(bomb)
            return

        if ROUND_START_REGEX.search(cleaned_line):
            payload = &amp;quot;🔄 Round started!&amp;quot;
            print(f&amp;quot;[{now_iso()}] Parsed round start: {payload} (has_human_player={self.has_human_player})&amp;quot;)
            self.suppress_join_messages = False
            await self._post_to_discord(payload)
            return
            
        if ROUND_END_REGEX.search(cleaned_line):
            payload = &amp;quot;🏁 Round ended!&amp;quot;
            print(f&amp;quot;[{now_iso()}] Parsed round end: {payload} (has_human_player={self.has_human_player})&amp;quot;)
            await self._post_to_discord(payload)
            return
            
        m = TEAM_WIN_REGEX.search(cleaned_line)
        if m:
            team, _, ct_score, t_score = m.groups()
            if team == &amp;quot;CT&amp;quot;:
                payload = f&amp;quot;🔵 **Counter-Terrorists Win!** (CT {ct_score}, T {t_score})&amp;quot;
            else:
                payload = f&amp;quot;🔴 **Terrorists Win!** (CT {ct_score}, T {t_score})&amp;quot;
            print(f&amp;quot;[{now_iso()}] Parsed team win: {payload} (has_human_player={self.has_human_player})&amp;quot;)
            await self._post_to_discord(payload)
            return
            
        print(f&amp;quot;[{now_iso()}] Unmatched log: {cleaned_line} (has_human_player={self.has_human_player})&amp;quot;)

    def _parse_mapchange(self, line: str) -&amp;gt; Optional[str]:
        m_mapchange = re.compile(
            r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: -------- Mapchange to (.+?) --------$&#39;
        ).search(line)
        m_started_map = re.compile(
            r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: Started map &amp;quot;(.+?)&amp;quot;&#39;
        ).search(line)

        map_name = None
        if m_mapchange:
            map_name = m_mapchange.group(1)
        elif m_started_map:
            map_name = m_started_map.group(1)

        if map_name:
            # snapshot current state before reset
            had_humans = self.has_human_player  

            # reset for the new map
            self.has_human_player = False
            self.connected_players = {}
            self.suppress_join_messages = True

            # Only announce if humans were present or bot messages are allowed
            if had_humans or self.allow_bot_messages:
                return f&amp;quot;🔄 Map changed to `{map_name}`&amp;quot;
            else:
                print(f&amp;quot;[{now_iso()}] Suppressing mapchange announcement ({map_name}) — no human players were online.&amp;quot;)
                return None

        return None

    def _parse_steam_validated(self, line: str) -&amp;gt; bool:
        m = STEAM_VALIDATE_REGEX.search(line)
        if m:
            name, steamid, team = m.groups()
            print(f&amp;quot;[{now_iso()}] Handling &#39;STEAM USERID validated&#39; for {name} ({steamid}).&amp;quot;)
            if steamid != &amp;quot;BOT&amp;quot;:
                if &amp;quot;STEAM_ID_PENDING&amp;quot; in self.connected_players:
                    pending_name = self.connected_players.pop(&amp;quot;STEAM_ID_PENDING&amp;quot;)
                    self.connected_players[steamid] = pending_name
                    if &amp;quot;STEAM_ID_PENDING&amp;quot; in self.player_flags:
                        self.player_flags[steamid] = self.player_flags.pop(&amp;quot;STEAM_ID_PENDING&amp;quot;)
                        print(f&amp;quot;[{now_iso()}] Transferred flag for {pending_name} from STEAM_ID_PENDING to {steamid}: {self.player_flags[steamid]}&amp;quot;)
            return True
        return False

    def _parse_rcon(self, line: str) -&amp;gt; bool:
        m = RCON_REGEX.search(line)
        if m:
            command, _ = m.groups()
            if not command.strip():  # Ignore incomplete RCON commands
                print(f&amp;quot;[{now_iso()}] [DEBUG] Ignored incomplete RCON command: {line}&amp;quot;)
                return True
            print(f&amp;quot;[{now_iso()}] Handled RCON command log: {command}&amp;quot;)
            return True
        return False

    def _parse_connected(self, line: str) -&amp;gt; bool:
        m = CONNECT_REGEX.search(line)
        if m:
            name, steamid, team, ip, port = m.groups()
            print(f&amp;quot;[{now_iso()}] [DEBUG] Matched CONNECT_REGEX for: {name} ({steamid}, IP {ip})&amp;quot;)
            if steamid == &amp;quot;BOT&amp;quot;:
                print(f&amp;quot;[{now_iso()}] Bot connected: {name} ({steamid})&amp;quot;)
                self.player_flags[steamid] = &amp;quot;🤖&amp;quot;
                print(f&amp;quot;[{now_iso()}] Assigned flag code for {name} ({steamid}): &#39;None&#39; -&amp;gt; &#39;🤖&#39;&amp;quot;)
                return True
            
            self.connected_players[steamid] = name
            self.has_human_player = True

            flag = &amp;quot;🏳️&amp;quot;
            country_code = None
            if self.geoip_reader:
                try:
                    response = self.geoip_reader.country(ip)
                    country_code = response.country.iso_code
                    if country_code:
                        flag = cc_to_flag(country_code)
                        print(f&amp;quot;[{now_iso()}] GeoIP lookup for {name} ({steamid}, IP {ip}): country code &#39;{country_code}&#39; -&amp;gt; flag &#39;{flag}&#39;&amp;quot;)
                    else:
                        print(f&amp;quot;[{now_iso()}] [WARN] No country code found for IP {ip}&amp;quot;)
                except Exception as e:
                    print(f&amp;quot;[{now_iso()}] [ERROR] GeoIP lookup failed for IP {ip}: {e}&amp;quot;)
            else:
                print(f&amp;quot;[{now_iso()}] [ERROR] GeoIP reader not initialized for {name} ({steamid})&amp;quot;)
            
            self.player_flags[steamid] = flag
            print(f&amp;quot;[{now_iso()}] Assigned flag code for {name} ({steamid}): &#39;{country_code or &#39;None&#39;}&#39; -&amp;gt; &#39;{flag}&#39;&amp;quot;)
            print(f&amp;quot;[{now_iso()}] [DEBUG] GeoIP database path: {self.cfg.get(&#39;geoip_db&#39;, &#39;/home/csserver/discord/GeoLite2-Country.mmdb&#39;)}&amp;quot;)
            print(f&amp;quot;[{now_iso()}] [DEBUG] Player flags dictionary: {self.player_flags}&amp;quot;)
            return True
        else:
            print(f&amp;quot;[{now_iso()}] [DEBUG] CONNECT_REGEX failed to match: {line}&amp;quot;)
        return False

    def _parse_join_leave(self, line: str) -&amp;gt; Optional[str]:
        # Ignore raw connection lines like:  &amp;quot; from &amp;quot;64.188.91.127:53453&amp;quot;
        if &#39; from &amp;quot;&#39; in line:
            print(f&amp;quot;[{now_iso()}] Ignoring connection info line: {line.strip()}&amp;quot;)
            return None

        entered_the_game_regex = re.compile(
            r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; entered the game$&#39;
        )

        m = entered_the_game_regex.search(line)
        if m:
            name, steamid, team = m.groups()[:3]
            if steamid == &amp;quot;BOT&amp;quot;:
                self.player_flags[steamid] = &amp;quot;🤖&amp;quot;
                print(f&amp;quot;[{now_iso()}] Stored flag for {name} ({steamid}): 🤖&amp;quot;)
                print(f&amp;quot;[{now_iso()}] Ignoring bot join message for {name}.&amp;quot;)
                return None
        entered_the_game_regex = re.compile(
            r&#39;L &#92;d{2}/&#92;d{2}/&#92;d{4} - &#92;d{2}:&#92;d{2}:&#92;d{2}: &amp;quot;(.+?)&amp;quot; entered the game$&#39;
        )

        m = entered_the_game_regex.search(line)
        if m:
            name, steamid, team = m.groups()[:3]
            if steamid == &amp;quot;BOT&amp;quot;:
                self.player_flags[steamid] = &amp;quot;🤖&amp;quot;
                print(f&amp;quot;[{now_iso()}] Stored flag for {name} ({steamid}): 🤖&amp;quot;)
                print(f&amp;quot;[{now_iso()}] Ignoring bot join message for {name}.&amp;quot;)
                return None
            
            if self.suppress_join_messages:
                print(f&amp;quot;[{now_iso()}] Suppressing join message for {name} ({steamid}) during map change.&amp;quot;)
                self.connected_players[steamid] = name
                self.has_human_player = True
                return None

            self.connected_players[steamid] = name
            self.has_human_player = True
            name = self._sanitize_name(name)
            flag = self.player_flags.get(steamid, &amp;quot;🏳️&amp;quot;)
            if flag == &amp;quot;🏳️&amp;quot; and steamid != &amp;quot;BOT&amp;quot;:
                print(f&amp;quot;[{now_iso()}] [WARN] No flag found for {name} ({steamid}), attempting GeoIP lookup&amp;quot;)
                m_connect = CONNECT_REGEX.search(line)
                if m_connect:
                    _, _, _, ip, _ = m_connect.groups()
                    if self.geoip_reader and ip:
                        try:
                            response = self.geoip_reader.country(ip)
                            country_code = response.country.iso_code
                            if country_code:
                                flag = cc_to_flag(country_code)
                                self.player_flags[steamid] = flag
                                print(f&amp;quot;[{now_iso()}] Fallback GeoIP lookup for {name} ({steamid}, IP {ip}): country code &#39;{country_code}&#39; -&amp;gt; flag &#39;{flag}&#39;&amp;quot;)
                            else:
                                print(f&amp;quot;[{now_iso()}] [WARN] No country code found for IP {ip} in fallback lookup&amp;quot;)
                        except Exception as e:
                            print(f&amp;quot;[{now_iso()}] [ERROR] Fallback GeoIP lookup failed for IP {ip}: {e}&amp;quot;)
            print(f&amp;quot;[{now_iso()}] Human player joined: {name} ({steamid}), flag={flag}, has_human_player={self.has_human_player}&amp;quot;)
            return f&#39;👋 {flag} `{name}` joined the server&#39;

        for rx in JOIN_LEAVE_REGEXES:
            m = rx.search(line)
            if m:
                if &amp;quot;disconnected&amp;quot; in line:
                    name, steamid, _, reason = m.groups()
                    if steamid == &amp;quot;BOT&amp;quot;:
                        print(f&amp;quot;[{now_iso()}] Ignoring bot leave message for {name}.&amp;quot;)
                        return None
                    
                    if self.suppress_join_messages:
                        print(f&amp;quot;[{now_iso()}] Suppressing leave message for {name} ({steamid}) during map change window&amp;quot;)
                        if steamid in self.connected_players:
                            del self.connected_players[steamid]
                        return None
                    
                    name = self._sanitize_name(name)
                    flag = self.player_flags.get(steamid, &amp;quot;🏳️&amp;quot;)
                    leave_message = f&#39;❌ {flag} `{name}` left the server&#39; + (f&#39; ({reason})&#39; if reason else &#39;&#39;)
                    if steamid in self.connected_players:
                        del self.connected_players[steamid]
                        if not any(sid != &amp;quot;BOT&amp;quot; for sid in self.connected_players):
                            self.has_human_player = False
                            print(f&amp;quot;[{now_iso()}] No human players remain, has_human_player={self.has_human_player}&amp;quot;)
                    print(f&amp;quot;[{now_iso()}] Human player left: {name} ({steamid}), flag={flag}, has_human_player={self.has_human_player}&amp;quot;)
                    return leave_message
                elif &amp;quot;joined team&amp;quot; in line:
                    name, steamid, team, _ = m.groups()
                    if steamid == &amp;quot;BOT&amp;quot;:
                        self.player_flags[steamid] = &amp;quot;🤖&amp;quot;
                        print(f&amp;quot;[{now_iso()}] Stored flag for {name} ({steamid}): 🤖&amp;quot;)
                        print(f&amp;quot;[{now_iso()}] Ignoring bot joined team message.&amp;quot;)
                        return None
                    self.has_human_player = True
                    print(f&amp;quot;[{now_iso()}] Human detected in joined team: {name} ({steamid}), has_human_player={self.has_human_player}&amp;quot;)
                    return None
        return None

    def _parse_say(self, line: str):
        for rx in HL_SAY_REGEXES:
            m = rx.search(line)
            if m:
                name, steamid, team, msg = m.groups()
                team_flag = &amp;quot;say_team&amp;quot; in rx.pattern or &amp;quot;say_team&amp;quot; in line
                name = self._sanitize_name(name)
                msg = self._sanitize_cs(msg)
                flag = self.player_flags.get(steamid, &amp;quot;🤖&amp;quot; if steamid == &amp;quot;BOT&amp;quot; else &amp;quot;🏳️&amp;quot;)
                if steamid != &amp;quot;BOT&amp;quot;:
                    self.has_human_player = True
                    print(f&amp;quot;[{now_iso()}] Human detected in say: {name} ({steamid}), has_human_player={self.has_human_player}&amp;quot;)
                team_icon = &amp;quot;🔵&amp;quot; if team.upper().startswith(&amp;quot;CT&amp;quot;) else &amp;quot;🔴&amp;quot; if team.upper().startswith(&amp;quot;T&amp;quot;) else &amp;quot;⚪&amp;quot;
                dead_indicator = &amp;quot; 🪦&amp;quot; if &amp;quot;(dead)&amp;quot; in line else &amp;quot;&amp;quot;
                payload = f&#39;💬 {flag} {team_icon} `{name}`{dead_indicator}: {msg}&#39;
                return True, team_flag, payload
        return False, False, None

    def _parse_kill(self, line: str) -&amp;gt; Optional[str]:
        m = KILL_REGEX.search(line)
        if not m:
            return None
        killer_name, killer_id, killer_team, victim_name, victim_id, victim_team, weapon = m.groups()

        if killer_id == &amp;quot;BOT&amp;quot; and victim_id == &amp;quot;BOT&amp;quot;:
            print(f&amp;quot;[{now_iso()}] Ignoring kill message (bot killed bot).&amp;quot;)
            return None

        if killer_id != &amp;quot;BOT&amp;quot; or victim_id != &amp;quot;BOT&amp;quot;:
            self.has_human_player = True
            print(f&amp;quot;[{now_iso()}] Human detected in kill: {killer_name} ({killer_id}) or {victim_name} ({victim_id}), has_human_player={self.has_human_player}&amp;quot;)

        killer_flag = self.player_flags.get(killer_id, &amp;quot;🤖&amp;quot; if killer_id == &amp;quot;BOT&amp;quot; else &amp;quot;🏳️&amp;quot;)
        victim_flag = self.player_flags.get(victim_id, &amp;quot;🤖&amp;quot; if victim_id == &amp;quot;BOT&amp;quot; else &amp;quot;🏳️&amp;quot;)
        killer_name = self._sanitize_name(killer_name)
        victim_name = self._sanitize_name(victim_name)

        headshot = &amp;quot; 💥&amp;quot; if &amp;quot;(headshot)&amp;quot; in line else &amp;quot;&amp;quot;
        killer_team_icon = &amp;quot;🔵&amp;quot; if killer_team.upper().startswith(&amp;quot;CT&amp;quot;) else &amp;quot;🔴&amp;quot; if killer_team.upper().startswith(&amp;quot;T&amp;quot;) else &amp;quot;⚪&amp;quot;
        victim_team_icon = &amp;quot;🔵&amp;quot; if victim_team.upper().startswith(&amp;quot;CT&amp;quot;) else &amp;quot;🔴&amp;quot; if victim_team.upper().startswith(&amp;quot;T&amp;quot;) else &amp;quot;⚪&amp;quot;

        # Determine article
        vowel_sounds = (&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;)
        exceptions = {&amp;quot;tmp&amp;quot;, &amp;quot;usp&amp;quot;, &amp;quot;ump&amp;quot;, &amp;quot;uzi&amp;quot;}  # extend if needed
        if weapon.lower() in exceptions:
            article = &amp;quot;a&amp;quot;
        else:
            article = &amp;quot;an&amp;quot; if weapon.lower().startswith(vowel_sounds) else &amp;quot;a&amp;quot;

        return f&#39;{killer_flag} {killer_team_icon} `{killer_name}` killed {victim_flag} {victim_team_icon} `{victim_name}` with {article} *{weapon}*{headshot}&#39;

    def _parse_suicide(self, line: str) -&amp;gt; Optional[str]:
        for rx in SUICIDE_REGEXES:
            m = rx.search(line)
            if m:
                name, steamid, _, weapon = m.groups()
                if steamid != &amp;quot;BOT&amp;quot;:
                    self.has_human_player = True
                    print(f&amp;quot;[{now_iso()}] Human detected in suicide: {name} ({steamid}), has_human_player={self.has_human_player}&amp;quot;)
                name = self._sanitize_name(name)
                flag = self.player_flags.get(steamid, &amp;quot;🤖&amp;quot; if steamid == &amp;quot;BOT&amp;quot; else &amp;quot;🏳️&amp;quot;)
                return f&#39;💀 {flag} `{name}` died ({weapon})&#39;
        return None

    def _parse_bomb(self, line: str) -&amp;gt; Optional[str]:
        m = BOMB_REGEX.search(line)
        if m:
            name, steamid, _, event = m.groups()
            name = self._sanitize_name(name)
            flag = self.player_flags.get(steamid, &amp;quot;🤖&amp;quot; if steamid == &amp;quot;BOT&amp;quot; else &amp;quot;🏳️&amp;quot;)
            if steamid != &amp;quot;BOT&amp;quot;:
                self.has_human_player = True
                print(f&amp;quot;[{now_iso()}] Human detected in bomb event: {name} ({steamid}), has_human_player={self.has_human_player}&amp;quot;)
            if event == &amp;quot;Planted_The_Bomb&amp;quot;:
                return &#39;💣 *The bomb has been planted!*&#39;
        m = TEAM_BOMB_REGEX.search(line)
        if m:
            team, event, ct_score, t_score = m.groups()
            if event == &amp;quot;Bomb_Defused&amp;quot;:
                return &#39;💣 *The bomb has been defused!*&#39;
            elif event == &amp;quot;Target_Bombed&amp;quot;:
                return &#39;💣 *Target successfully bombed!*&#39;
        return None

    async def _post_to_discord(self, content: str, force=False):
        if not self.channel:
            print(f&amp;quot;[{now_iso()}] [ERROR] Discord channel not set, cannot post: {content}&amp;quot;)
            return

        # Always allow join/leave messages through (mapchange suppression already handled in _parse_join_leave)
        if force or content.startswith((&amp;quot;👋&amp;quot;, &amp;quot;❌&amp;quot;)) or self.has_human_player or self.allow_bot_messages:
            try:
                await self.channel.send(content)
                print(f&amp;quot;[{now_iso()}] Successfully posted to Discord: {content} (has_human_player={self.has_human_player})&amp;quot;)
            except Exception as e:
                print(f&amp;quot;[{now_iso()}] [ERROR] Failed to send to Discord: {e} (content={content})&amp;quot;)
        else:
            print(f&amp;quot;[{now_iso()}] Suppressing Discord message due to no human players: {content} (has_human_player={self.has_human_player})&amp;quot;)

    def _sanitize_discord(self, s: str) -&amp;gt; str:
        s = s.replace(&#39;&amp;quot;&#39;, &#39;&#39;).strip()
        return &#39;&#39;.join(ch for ch in s if 31  str:
        s = s.replace(&#39;&amp;quot;&#39;, &amp;quot;&#39;&amp;quot;)
        return &#39;&#39;.join(ch for ch in s if 31  str:
        s = s.strip()
        if len(s) &amp;gt; 24:
            s = s[:23] + &amp;quot;…&amp;quot;
        return self._sanitize_cs(s)

    async def run(self):
        listen_host = self.cfg.get(&amp;quot;listen_host&amp;quot;, &amp;quot;0.0.0.0&amp;quot;)
        listen_port = int(self.cfg.get(&amp;quot;listen_port&amp;quot;, 8008))
        loop = asyncio.get_running_loop()
        print(f&amp;quot;[{now_iso()}] Listening for HL logs on {listen_host}:{listen_port}&amp;quot;)
        try:
            await loop.create_datagram_endpoint(
                lambda: HLLogUDP(self.handle_hl_line),
                local_addr=(listen_host, listen_port)
            )
        except Exception as e:
            print(f&amp;quot;[{now_iso()}] [ERROR] Failed to start UDP listener: {e}&amp;quot;)
        await self.bot.start(self.cfg[&amp;quot;discord_token&amp;quot;])

def load_config(path: str) -&amp;gt; dict:
    try:
        with open(path, &amp;quot;rb&amp;quot;) as f:
            cfg = tomllib.load(f)
    except Exception as e:
        print(f&amp;quot;[{now_iso()}] [ERROR] Failed to load config {path}: {e}&amp;quot;)
        raise SystemExit(f&amp;quot;Failed to load config: {e}&amp;quot;)
    required = [&amp;quot;discord_token&amp;quot;, &amp;quot;discord_channel_id&amp;quot;, &amp;quot;cs_host&amp;quot;, &amp;quot;cs_port&amp;quot;, &amp;quot;cs_rcon_password&amp;quot;]
    for key in required:
        if key not in cfg:
            print(f&amp;quot;[{now_iso()}] [ERROR] Missing required config key: {key}&amp;quot;)
            raise SystemExit(f&amp;quot;Missing required config key: {key}&amp;quot;)
    return cfg

async def amain(cfg_path: str):
    cfg = load_config(cfg_path)
    bridge = CSDiscordBridge(cfg)
    await bridge.run()

def main():
    cfg_path = os.environ.get(&amp;quot;CSBRIDGE_CONFIG&amp;quot;, &amp;quot;config.toml&amp;quot;)
    try:
        asyncio.run(amain(cfg_path))
    except KeyboardInterrupt:
        print(f&amp;quot;[{now_iso()}] Exiting...&amp;quot;)
    except Exception as e:
        print(f&amp;quot;[{now_iso()}] [ERROR] Fatal error: {e}&amp;quot;)

if __name__ == &amp;quot;__main__&amp;quot;:
    main()

&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Sun, 19 Oct 2025 20:00:00 -0400</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2025-10-20-counter-strike-1-6-discord-bot/</guid>
    </item>
    <item>
      <title>Linux Firefox Open With Addon: Python Script for Brave and LibreWolf</title>
      <link>https://sbmesh.com/blog/posts/2024-11-12-linux-firefox-open-with-addon-python-script-that-works-with-brave-and-librewolf/</link><description>&lt;p&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/open-with&quot;&gt;https://addons.mozilla.org/en-US/firefox/addon/open-with&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
#!/usr/bin/env python
from __future__ import print_function

import os
import sys
import json
import struct
import subprocess

VERSION = &#39;7.1b2&#39;

try:
    sys.stdin.buffer

    # Python 3.x version
    # Read a message from stdin and decode it.
    def getMessage():
        rawLength = sys.stdin.buffer.read(4)
        if len(rawLength) == 0:
            sys.exit(0)
        messageLength = struct.unpack(&#39;@I&#39;, rawLength)[0]
        message = sys.stdin.buffer.read(messageLength).decode(&#39;utf-8&#39;)
        return json.loads(message)

    # Send an encoded message to stdout
    def sendMessage(messageContent):
        encodedContent = json.dumps(messageContent).encode(&#39;utf-8&#39;)
        encodedLength = struct.pack(&#39;@I&#39;, len(encodedContent))

        sys.stdout.buffer.write(encodedLength)
        sys.stdout.buffer.write(encodedContent)
        sys.stdout.buffer.flush()

except AttributeError:
    # Python 2.x version (if sys.stdin.buffer is not defined)
    # Read a message from stdin and decode it.
    def getMessage():
        rawLength = sys.stdin.read(4)
        if len(rawLength) == 0:
            sys.exit(0)
        messageLength = struct.unpack(&#39;@I&#39;, rawLength)[0]
        message = sys.stdin.read(messageLength)
        return json.loads(message)

    # Send an encoded message to stdout
    def sendMessage(messageContent):
        encodedContent = json.dumps(messageContent)
        encodedLength = struct.pack(&#39;@I&#39;, len(encodedContent))

        sys.stdout.write(encodedLength)
        sys.stdout.write(encodedContent)
        sys.stdout.flush()

def install():
    home_path = os.getenv(&#39;HOME&#39;)

    manifest = {
        &#39;name&#39;: &#39;open_with&#39;,
        &#39;description&#39;: &#39;Open With native host&#39;,
        &#39;path&#39;: os.path.realpath(__file__),
        &#39;type&#39;: &#39;stdio&#39;,
    }
    locations = {
        &#39;chrome&#39;: os.path.join(home_path, &#39;.config&#39;, &#39;google-chrome&#39;, &#39;NativeMessagingHosts&#39;),
        &#39;brave-browser&#39;: os.path.join(home_path, &#39;.config&#39;, &#39;BraveSoftware&#39;, &#39;Brave-Browser&#39;, &#39;NativeMessagingHosts&#39;),
        &#39;brave&#39;: os.path.join(home_path, &#39;.config&#39;, &#39;BraveSoftware&#39;, &#39;Brave-Browser&#39;, &#39;NativeMessagingHosts&#39;),
        &#39;chromium&#39;: os.path.join(home_path, &#39;.config&#39;, &#39;chromium&#39;, &#39;NativeMessagingHosts&#39;),
        &#39;firefox&#39;: os.path.join(home_path, &#39;.mozilla&#39;, &#39;native-messaging-hosts&#39;),
        &#39;librewolf&#39;: os.path.join(home_path, &#39;.librewolf&#39;, &#39;native-messaging-hosts&#39;),
    }
    filename = &#39;open_with.json&#39;

    for browser, location in locations.items():
        if os.path.exists(os.path.dirname(location)):
            if not os.path.exists(location):
                os.mkdir(location)

            browser_manifest = manifest.copy()
            if browser == &#39;firefox&#39; or browser == &#39;librewolf&#39;:
                browser_manifest[&#39;allowed_extensions&#39;] = [&#39;openwith@darktrojan.net&#39;]
            else:
                browser_manifest[&#39;allowed_origins&#39;] = [
                    &#39;chrome-extension://cogjlncmljjnjpbgppagklanlcbchlno/&#39;,  # Chrome
                    &#39;chrome-extension://fbmcaggceafhobjkhnaakhgfmdaadhhg/&#39;,  # Opera
                ]

            with open(os.path.join(location, filename), &#39;w&#39;) as file:
                file.write(
                    json.dumps(browser_manifest, indent=2, separators=(&#39;,&#39;, &#39;: &#39;), sort_keys=True).replace(&#39;  &#39;, &#39;&#92;t&#39;) + &#39;&#92;n&#39;
                )

def _read_desktop_file(path):
    with open(path, &#39;r&#39;) as desktop_file:
        current_section = None
        name = None
        command = None
        for line in desktop_file:
            if line[0] == &#39;[&#39;:
                current_section = line[1:-2]
            if current_section != &#39;Desktop Entry&#39;:
                continue

            if line.startswith(&#39;Name=&#39;):
                name = line[5:].strip()
            elif line.startswith(&#39;Exec=&#39;):
                command = line[5:].strip()

        return {
            &#39;name&#39;: name,
            &#39;command&#39;: command
        }

def find_browsers():
    apps = [
        &#39;Chrome&#39;,
        &#39;Chromium&#39;,
        &#39;chromium-browser&#39;,
        &#39;firefox&#39;,
        &#39;Firefox&#39;,
        &#39;Google Chrome&#39;,
        &#39;google-chrome&#39;,
        &#39;opera&#39;,
        &#39;Opera&#39;,
        &#39;SeaMonkey&#39;,
        &#39;seamonkey&#39;,
        &#39;brave-browser&#39;,
        &#39;brave&#39;,
        &#39;librewolf&#39;,
    ]
    paths = [
        os.path.join(os.getenv(&#39;HOME&#39;), &#39;.local/share/applications&#39;),
        &#39;/usr/local/share/applications&#39;,
        &#39;/usr/share/applications&#39;
    ]
    suffix = &#39;.desktop&#39;

    results = []
    for p in paths:
        for a in apps:
            fp = os.path.join(p, a) + suffix
            if os.path.exists(fp):
                results.append(_read_desktop_file(fp))
    return results

def listen():
    receivedMessage = getMessage()
    if receivedMessage == &#39;ping&#39;:
        sendMessage({
            &#39;version&#39;: VERSION,
            &#39;file&#39;: os.path.realpath(__file__)
        })
    elif receivedMessage == &#39;find&#39;:
        sendMessage(find_browsers())
    else:
        for k, v in os.environ.items():
            if k.startswith(&#39;MOZ_&#39;):
                try:
                    os.unsetenv(k)
                except:
                    os.environ[k] = &#39;&#39;

        devnull = open(os.devnull, &#39;w&#39;)
        subprocess.Popen(receivedMessage, stdout=devnull, stderr=devnull)
        sendMessage(None)

if __name__ == &#39;__main__&#39;:
    if len(sys.argv) == 2:
        if sys.argv[1] == &#39;install&#39;:
            install()
            sys.exit(0)
        elif sys.argv[1] == &#39;find_browsers&#39;:
            print(find_browsers())
            sys.exit(0)

    allowed_extensions = [
        &#39;openwith@darktrojan.net&#39;,
        &#39;chrome-extension://cogjlncmljjnjpbgppagklanlcbchlno/&#39;,
        &#39;chrome-extension://fbmcaggceafhobjkhnaakhgfmdaadhhg/&#39;,
    ]
    for ae in allowed_extensions:
        if ae in sys.argv:
            listen()
            sys.exit(0)

    print(&#39;Open With native helper, version %s.&#39; % VERSION)

&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Mon, 11 Nov 2024 19:00:00 -0500</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2024-11-12-linux-firefox-open-with-addon-python-script-that-works-with-brave-and-librewolf/</guid>
    </item>
    <item>
      <title>CDP 8: Composers Desktop Project ARM64/AArch64 Binaries</title>
      <link>https://sbmesh.com/blog/posts/2024-09-07-cdp-8-composers-desktop-project-arm64-aarch64-binaries/</link><description>&lt;p&gt;Compiled on Debian 12 with an Orange Pi 5&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sbmesh.com/CDP8aarch64.zip&quot;&gt;https://sbmesh.com/CDP8aarch64.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m using it with Renoise CDP Interface tool &lt;a href=&quot;https://www.renoise.com/tools/cdp-interface&quot;&gt;https://www.renoise.com/tools/cdp-interface&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Composers Desktop Project (CDP) software is a suite of tools developed for in-depth sound manipulation and transformation, aimed primarily at composers and sound designers interested in musique concrète and experimental sound design.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;abfdcode&lt;/code&gt; &lt;code&gt;abfpan&lt;/code&gt; &lt;code&gt;abfpan2&lt;/code&gt; &lt;code&gt;analjoin&lt;/code&gt; &lt;code&gt;asciiget&lt;/code&gt; &lt;code&gt;blur&lt;/code&gt; &lt;code&gt;bounce&lt;/code&gt; &lt;code&gt;brkdur&lt;/code&gt; &lt;code&gt;brktopi&lt;/code&gt; &lt;code&gt;brownian&lt;/code&gt; &lt;code&gt;caltrain&lt;/code&gt; &lt;code&gt;cantor&lt;/code&gt; &lt;code&gt;cascade&lt;/code&gt; &lt;code&gt;cdparams&lt;/code&gt; &lt;code&gt;cdparams_other&lt;/code&gt; &lt;code&gt;cdparse&lt;/code&gt; &lt;code&gt;ceracu&lt;/code&gt; &lt;code&gt;channelx&lt;/code&gt; &lt;code&gt;chanphase&lt;/code&gt; &lt;code&gt;chirikov&lt;/code&gt; &lt;code&gt;chorder&lt;/code&gt; &lt;code&gt;chxformat&lt;/code&gt; &lt;code&gt;clicknew&lt;/code&gt; &lt;code&gt;clip&lt;/code&gt; &lt;code&gt;columns&lt;/code&gt; &lt;code&gt;combine&lt;/code&gt; &lt;code&gt;constrict&lt;/code&gt; &lt;code&gt;convert_to_midi&lt;/code&gt; &lt;code&gt;copysfx&lt;/code&gt; &lt;code&gt;crumble&lt;/code&gt; &lt;code&gt;crystal&lt;/code&gt; &lt;code&gt;cubicspline&lt;/code&gt; &lt;code&gt;dirsf&lt;/code&gt; &lt;code&gt;diskspace&lt;/code&gt; &lt;code&gt;distcut&lt;/code&gt; &lt;code&gt;distmark&lt;/code&gt; &lt;code&gt;distmore&lt;/code&gt; &lt;code&gt;distort&lt;/code&gt; &lt;code&gt;distortt&lt;/code&gt; &lt;code&gt;distrep&lt;/code&gt; &lt;code&gt;distshift&lt;/code&gt; &lt;code&gt;dshift&lt;/code&gt; &lt;code&gt;dvdwind&lt;/code&gt; &lt;code&gt;envcut&lt;/code&gt; &lt;code&gt;envel&lt;/code&gt; &lt;code&gt;envnu&lt;/code&gt; &lt;code&gt;envspeak&lt;/code&gt; &lt;code&gt;extend&lt;/code&gt; &lt;code&gt;fastconv&lt;/code&gt; &lt;code&gt;features&lt;/code&gt; &lt;code&gt;filter&lt;/code&gt; &lt;code&gt;filtrage&lt;/code&gt; &lt;code&gt;fixgobo&lt;/code&gt; &lt;code&gt;flatten&lt;/code&gt; &lt;code&gt;flutter&lt;/code&gt; &lt;code&gt;fmdcode&lt;/code&gt; &lt;code&gt;focus&lt;/code&gt; &lt;code&gt;fofex&lt;/code&gt; &lt;code&gt;formants&lt;/code&gt; &lt;code&gt;fractal&lt;/code&gt; &lt;code&gt;fracture&lt;/code&gt; &lt;code&gt;frame&lt;/code&gt; &lt;code&gt;freeze&lt;/code&gt; &lt;code&gt;fturanal&lt;/code&gt; &lt;code&gt;gate&lt;/code&gt; &lt;code&gt;get_partials&lt;/code&gt; &lt;code&gt;getcol&lt;/code&gt; &lt;code&gt;glisten&lt;/code&gt; &lt;code&gt;gobo&lt;/code&gt; &lt;code&gt;gobosee&lt;/code&gt; &lt;code&gt;grain&lt;/code&gt; &lt;code&gt;grainex&lt;/code&gt; &lt;code&gt;hfperm&lt;/code&gt; &lt;code&gt;hilite&lt;/code&gt; &lt;code&gt;histconv&lt;/code&gt; &lt;code&gt;housekeep&lt;/code&gt; &lt;code&gt;hover&lt;/code&gt; &lt;code&gt;hover2&lt;/code&gt; &lt;code&gt;impulse&lt;/code&gt; &lt;code&gt;interlx&lt;/code&gt; &lt;code&gt;isolate&lt;/code&gt; &lt;code&gt;iterfof&lt;/code&gt; &lt;code&gt;iterline&lt;/code&gt; &lt;code&gt;iterlinef&lt;/code&gt; &lt;code&gt;listaudevs&lt;/code&gt; &lt;code&gt;listdate&lt;/code&gt; &lt;code&gt;logdate&lt;/code&gt; &lt;code&gt;madrid&lt;/code&gt; &lt;code&gt;manysil&lt;/code&gt; &lt;code&gt;matrix&lt;/code&gt; &lt;code&gt;maxsamp2&lt;/code&gt; &lt;code&gt;mchanpan&lt;/code&gt; &lt;code&gt;mchanrev&lt;/code&gt; &lt;code&gt;mchiter&lt;/code&gt; &lt;code&gt;mchshred&lt;/code&gt; &lt;code&gt;mchstereo&lt;/code&gt; &lt;code&gt;mchzig&lt;/code&gt; &lt;code&gt;modify&lt;/code&gt; &lt;code&gt;morph&lt;/code&gt; &lt;code&gt;motor&lt;/code&gt; &lt;code&gt;mton&lt;/code&gt; &lt;code&gt;multimix&lt;/code&gt; &lt;code&gt;multiosc&lt;/code&gt; &lt;code&gt;multisynth&lt;/code&gt; &lt;code&gt;newdelay&lt;/code&gt; &lt;code&gt;newmix&lt;/code&gt; &lt;code&gt;newmorph&lt;/code&gt; &lt;code&gt;newscales&lt;/code&gt; &lt;code&gt;newsynth&lt;/code&gt; &lt;code&gt;newtex&lt;/code&gt; &lt;code&gt;njoin&lt;/code&gt; &lt;code&gt;nmix&lt;/code&gt; &lt;code&gt;notchinvert&lt;/code&gt; &lt;code&gt;oneform&lt;/code&gt; &lt;code&gt;onset&lt;/code&gt; &lt;code&gt;packet&lt;/code&gt; &lt;code&gt;pagrab&lt;/code&gt; &lt;code&gt;pairex&lt;/code&gt; &lt;code&gt;panorama&lt;/code&gt; &lt;code&gt;paplay&lt;/code&gt; &lt;code&gt;partition&lt;/code&gt; &lt;code&gt;paudition&lt;/code&gt; &lt;code&gt;paview&lt;/code&gt; &lt;code&gt;pdisplay&lt;/code&gt; &lt;code&gt;peak&lt;/code&gt; &lt;code&gt;peakfind&lt;/code&gt; &lt;code&gt;peakiso&lt;/code&gt; &lt;code&gt;phase&lt;/code&gt; &lt;code&gt;phasor&lt;/code&gt; &lt;code&gt;pitch&lt;/code&gt; &lt;code&gt;pitchinfo&lt;/code&gt; &lt;code&gt;pmodify&lt;/code&gt; &lt;code&gt;prefix&lt;/code&gt; &lt;code&gt;progmach&lt;/code&gt; &lt;code&gt;psow&lt;/code&gt; &lt;code&gt;ptobrk&lt;/code&gt; &lt;code&gt;pulser&lt;/code&gt; &lt;code&gt;putcol&lt;/code&gt; &lt;code&gt;pview&lt;/code&gt; &lt;code&gt;pvoc&lt;/code&gt; &lt;code&gt;pvplay&lt;/code&gt; &lt;code&gt;quirk&lt;/code&gt; &lt;code&gt;recsf&lt;/code&gt; &lt;code&gt;refocus&lt;/code&gt; &lt;code&gt;rejoin&lt;/code&gt; &lt;code&gt;repair&lt;/code&gt; &lt;code&gt;repeater&lt;/code&gt; &lt;code&gt;repitch&lt;/code&gt; &lt;code&gt;retime&lt;/code&gt; &lt;code&gt;reverb&lt;/code&gt; &lt;code&gt;rmresp&lt;/code&gt; &lt;code&gt;rmsinfo&lt;/code&gt; &lt;code&gt;rmverb&lt;/code&gt; &lt;code&gt;rotor&lt;/code&gt; &lt;code&gt;scramble&lt;/code&gt; &lt;code&gt;search&lt;/code&gt; &lt;code&gt;selfsim&lt;/code&gt; &lt;code&gt;sfecho&lt;/code&gt; &lt;code&gt;sfedit&lt;/code&gt; &lt;code&gt;sfprops&lt;/code&gt; &lt;code&gt;shifter&lt;/code&gt; &lt;code&gt;shrink&lt;/code&gt; &lt;code&gt;silend&lt;/code&gt; &lt;code&gt;smooth&lt;/code&gt; &lt;code&gt;sndinfo&lt;/code&gt; &lt;code&gt;sorter&lt;/code&gt; &lt;code&gt;spacedesign&lt;/code&gt; &lt;code&gt;spec&lt;/code&gt; &lt;code&gt;specanal&lt;/code&gt; &lt;code&gt;specav&lt;/code&gt; &lt;code&gt;specenv&lt;/code&gt; &lt;code&gt;specfnu&lt;/code&gt; &lt;code&gt;specfold&lt;/code&gt; &lt;code&gt;specgrids&lt;/code&gt; &lt;code&gt;specinfo&lt;/code&gt; &lt;code&gt;speclean&lt;/code&gt; &lt;code&gt;specnu&lt;/code&gt; &lt;code&gt;specross&lt;/code&gt; &lt;code&gt;specsphinx&lt;/code&gt; &lt;code&gt;spectrum&lt;/code&gt; &lt;code&gt;spectstr&lt;/code&gt; &lt;code&gt;spectune&lt;/code&gt; &lt;code&gt;spectwin&lt;/code&gt; &lt;code&gt;speculate&lt;/code&gt; &lt;code&gt;specvu&lt;/code&gt; &lt;code&gt;spike&lt;/code&gt; &lt;code&gt;spin&lt;/code&gt; &lt;code&gt;splinter&lt;/code&gt; &lt;code&gt;strands&lt;/code&gt; &lt;code&gt;strange&lt;/code&gt; &lt;code&gt;strans&lt;/code&gt; &lt;code&gt;stretch&lt;/code&gt; &lt;code&gt;stretcha&lt;/code&gt; &lt;code&gt;stutter&lt;/code&gt; &lt;code&gt;submix&lt;/code&gt; &lt;code&gt;subtract&lt;/code&gt; &lt;code&gt;superaccu&lt;/code&gt; &lt;code&gt;suppress&lt;/code&gt; &lt;code&gt;synfilt&lt;/code&gt; &lt;code&gt;synspline&lt;/code&gt; &lt;code&gt;synth&lt;/code&gt; &lt;code&gt;tangent&lt;/code&gt; &lt;code&gt;tapdelay&lt;/code&gt; &lt;code&gt;tesselate&lt;/code&gt; &lt;code&gt;texmchan&lt;/code&gt; &lt;code&gt;texture&lt;/code&gt; &lt;code&gt;tkusage&lt;/code&gt; &lt;code&gt;tkusage_other&lt;/code&gt; &lt;code&gt;topantail2&lt;/code&gt; &lt;code&gt;tostereo&lt;/code&gt; &lt;code&gt;transit&lt;/code&gt; &lt;code&gt;tremenv&lt;/code&gt; &lt;code&gt;tremolo&lt;/code&gt; &lt;code&gt;ts&lt;/code&gt; &lt;code&gt;tsconvert&lt;/code&gt; &lt;code&gt;tunevary&lt;/code&gt; &lt;code&gt;tweet&lt;/code&gt; &lt;code&gt;unknot&lt;/code&gt; &lt;code&gt;vectors&lt;/code&gt; &lt;code&gt;verges&lt;/code&gt; &lt;code&gt;vuform&lt;/code&gt; &lt;code&gt;waveform&lt;/code&gt; &lt;code&gt;wrappage&lt;/code&gt;&lt;/p&gt;
</description><pubDate>Fri, 06 Sep 2024 20:00:00 -0400</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2024-09-07-cdp-8-composers-desktop-project-arm64-aarch64-binaries/</guid>
    </item>
    <item>
      <title>Desktop</title>
      <link>https://sbmesh.com/blog/posts/2023-04-01-desktop/</link><description>&lt;p&gt;my orange pi 5 that ive been using instead of my desktop pc. it is an arm64 singleboard computer with 16gb of ram&lt;/p&gt;
</description><pubDate>Fri, 31 Mar 2023 20:00:00 -0400</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2023-04-01-desktop/</guid>
    </item>
    <item>
      <title>My Audio Directory</title>
      <link>https://sbmesh.com/blog/posts/2021-02-05-my-audio-directory/</link><description>&lt;p&gt;heres a link to the audio directory, with files i dont feel like making posts about&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sbmesh.com/audio/&quot;&gt;&lt;strong&gt;https://sbmesh.com/audio/&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;i have a slow connection so uploading small files takes a long time&lt;/p&gt;
</description><pubDate>Thu, 04 Feb 2021 19:00:00 -0500</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2021-02-05-my-audio-directory/</guid>
    </item>
    <item>
      <title>Winter Desktop</title>
      <link>https://sbmesh.com/blog/posts/2020-12-20-winter-desktop/</link><description>&lt;p&gt;rich content soon.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://i.postimg.cc/4nCMCS3X/desk.jpg&quot;&gt;https://i.postimg.cc/4nCMCS3X/desk.jpg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://postimg.cc/hhnxJyB6&quot;&gt;https://postimg.cc/hhnxJyB6&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sbmesh.com/pics/desk.jpg&quot;&gt;https://sbmesh.com/pics/desk.jpg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sbmesh.com/pics/20210622.jpg&quot;&gt;https://sbmesh.com/pics/20210622.jpg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sbmesh.com/pics/deskpi.jpg&quot;&gt;https://sbmesh.com/pics/deskpi.jpg&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Sat, 19 Dec 2020 19:00:00 -0500</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2020-12-20-winter-desktop/</guid>
    </item>
    <item>
      <title>Sven Co-op Classic Mode Weapons Server</title>
      <link>https://sbmesh.com/blog/posts/2020-12-07-sven-co-op-classic-mode-weapons-server/</link><description>&lt;p&gt;Here is a Classic Mode weapons server with over 700 maps. The game is free on Steam… &lt;a href=&quot;http://sven.c1.biz/&quot;&gt;http://sven.c1.biz/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Edit: the server website is now &lt;a href=&quot;https://sbmesh.com/KING&quot;&gt;https://sbmesh.com/KING&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;formerly &lt;a href=&quot;https://web.archive.org/web/20240000000000*/1800king.com&quot;&gt;1800king.com&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Sun, 06 Dec 2020 19:00:00 -0500</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2020-12-07-sven-co-op-classic-mode-weapons-server/</guid>
    </item>
    <item>
      <title>Peak Hours Power Saving AHK Script</title>
      <link>https://sbmesh.com/blog/posts/2020-12-07-peak-hours-power-saving-ahk-script/</link><description>&lt;p&gt;Here is a script that changes the power plan to Balanced or Power Saver depending on idle time. Just schedule it with Task Scheduler.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
if A_TimeIdlePhysical &amp;gt; 1200000 
{
# Power Saver
    Run C:&#92;Windows&#92;System32&#92;powercfg.exe /setactive a1841308-3541-4fab-bc81-f71556f20b4a
    return
}
else
{
# Balanced
    Run C:&#92;Windows&#92;System32&#92;powercfg.exe /setactive 381b4222-f694-41f0-9685-ff5bb260df2e
    return
}

&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Sun, 06 Dec 2020 19:00:00 -0500</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2020-12-07-peak-hours-power-saving-ahk-script/</guid>
    </item>
    <item>
      <title>Herbs and Supplements I Like Taking</title>
      <link>https://sbmesh.com/blog/posts/2020-12-07-herbs-and-supplements-i-like-taking/</link><description>&lt;h3&gt;Vitamins and Minerals&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Liposomal Vitamin C&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Enhanced bioavailability compared to standard vitamin C due to lipid encapsulation. Supports immune function, collagen synthesis, antioxidant defense, and iron absorption. May reduce oxidative stress and aid skin health. Gentle on the stomach for high doses. &lt;a href=&quot;https://vimerson.com/collections/vitamin-c-uses-proven-health-benefits-side-effects-and-all-the-information-you-need&quot;&gt;https://vimerson.com/collections/vitamin-c-uses-proven-health-benefits-side-effects-and-all-the-information-you-need&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Best for those needing high doses or with sensitive digestion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MegaFood Men’s One Daily – Men’s Multivitamin&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Provides essential vitamins (A, C, D, E, B6, B12, folate) and minerals (zinc, selenium) tailored for men. Supports energy metabolism, immune health, bone health, and nervous system function. Includes whole-food blends (e.g., organic turmeric, ginger) for added nutrition. &lt;a href=&quot;https://megafood.com/products/men-s-one-daily&quot;&gt;https://megafood.com/products/men-s-one-daily&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Free of iron and calcium/magnesium to avoid absorption competition.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Global Healing Selenium&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Antioxidant that supports thyroid function, immune health, and DNA synthesis. May reduce oxidative stress and support cardiovascular health.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Deficiency is rare in well-balanced diets but critical in areas with low soil selenium.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Global Healing Iodine&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Essential for thyroid hormone production, supporting metabolism, brain development, and energy levels. May improve cognitive function and detoxify halogens (e.g., fluoride, bromide).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Deficiency is common in iodine-poor regions; excess can harm thyroid function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thorne Vitamin B Complex&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Supplies all B vitamins (B1, B2, B3, B5, B6, B12, folate) to support energy production, brain function, red blood cell formation, and stress response. May improve mood and metabolism.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: High-potency formulas benefit those with deficiencies or high stress.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;5-MTHF (Methylfolate)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Active form of folate, critical for DNA synthesis, red blood cell production, and methylation processes. Supports brain health and mood regulation, especially in those with MTHFR gene mutations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: More bioavailable than folic acid for certain individuals.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Liquid B12 in Vegetable Glycerin (Sublingual)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Supports energy, red blood cell production, and neurological function. Sublingual form enhances absorption, ideal for those with B12 deficiency (e.g., vegans, older adults).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Often used for pernicious anemia or low stomach acid.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vitamin E&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Fat-soluble antioxidant protecting cell membranes from oxidative damage. Supports skin health, immune function, and cardiovascular health. May reduce inflammation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Mixed tocopherols are preferred for broader benefits.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plant-Derived Zinc and Zinc Orotate&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Supports immune function, wound healing, DNA synthesis, and testosterone production. Zinc orotate may have better cellular uptake. Critical for taste, smell, and skin health.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Deficiency common in vegetarians or those with poor diets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vitamin D3 Liquid&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Enhances calcium absorption for bone health, supports immune function, and regulates mood. May reduce risk of infections and chronic diseases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Liquid form allows flexible dosing; deficiency common in low-sunlight areas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vitamin K2&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Directs calcium to bones and teeth, preventing arterial calcification. Supports bone density and cardiovascular health. Works synergistically with vitamin D3.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Found in fermented foods; supplementation useful for non-dietary sources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Emulsified Vitamin A&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Supports vision, immune function, skin health, and reproductive health. Acts as an antioxidant and aids gene expression.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: High doses can be toxic; emulsified form improves absorption.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Antioxidants and Anti-Inflammatory Compounds&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;High Dose Astaxanthin + Lutein + Zeaxanthin&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Potent antioxidants supporting eye health (protecting retina from UV damage), skin health, and reducing inflammation. Astaxanthin may improve exercise recovery and cardiovascular health. &lt;a href=&quot;https://www.walmart.com/ip/Lutein-Zeaxanthin-Supplements-Eye-Health-Vitamins-Astaxanthin-Omega-3-Resveratrol-Bilberry-Lycopene-Quercetin-Ginkgo-Biloba-Vitamin-D-Advanced-Suppor/5071595029&quot;&gt;https://www.walmart.com/ip/Lutein-Zeaxanthin-Supplements-Eye-Health-Vitamins-Astaxanthin-Omega-3-Resveratrol-Bilberry-Lycopene-Quercetin-Ginkgo-Biloba-Vitamin-D-Advanced-Suppor/5071595029&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: High doses should be monitored to avoid side effects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Japanese Knotweed Trans-Resveratrol&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Antioxidant with anti-aging, cardiovascular, and anti-inflammatory properties. May improve insulin sensitivity and brain health.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Bioavailability is low unless paired with enhancers like piperine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Global Healing Turmeric Extract&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Contains curcumin, a potent anti-inflammatory and antioxidant. Supports joint health, digestion, and brain function. May reduce risk of chronic diseases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Bioavailability improved with black pepper (piperine).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thorne Meriva-HP (Curcumin Phytosome)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Highly bioavailable curcumin form for enhanced anti-inflammatory and antioxidant effects. Supports joint mobility, pain relief, and immune health.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Superior absorption compared to standard turmeric.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alpha Lipoic Acid&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Universal antioxidant (water- and fat-soluble) that regenerates other antioxidants (e.g., vitamin C, E). Supports glucose metabolism, nerve health, and anti-aging.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: May benefit diabetics for neuropathy management.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Quercetin&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Flavonoid with antioxidant, anti-inflammatory, and antihistamine properties. Supports immune health, heart health, and may enhance zinc uptake in cells.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Found in onions, apples; supplements useful for allergies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;N-Acetyl-L-Cysteine (NAC)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Precursor to glutathione, a master antioxidant. Supports liver detox, respiratory health (mucus thinning), and immune function. May protect against oxidative stress.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Useful for acetaminophen overdose and chronic lung conditions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CoQ10 or Ubiquinol&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Supports mitochondrial energy production, heart health, and antioxidant defense. Ubiquinol is the more bioavailable form. May reduce statin-related muscle pain.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Levels decline with age; benefits cardiovascular patients.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PQQ (Pyrroloquinoline Quinone)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Promotes mitochondrial biogenesis, enhancing energy production and cognitive function. Antioxidant properties support brain and heart health.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: Emerging research; often paired with CoQ10.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Marine and Plant-Based Supplements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Krill Oil&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Rich in omega-3s (EPA/DHA) and astaxanthin. Supports heart, brain, and joint health. More bioavailable than fish oil due to phospholipid content.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Sustainable alternative to fish oil; may reduce cholesterol.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Health Ranger Spirulina&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Nutrient-dense algae rich in protein, vitamins (B, K), minerals, and antioxidants (phycocyanin). Supports immune health, detoxification, and energy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Ensure sourced from clean waters to avoid contaminants.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Health Ranger Chlorella&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Algae high in chlorophyll, vitamins, and minerals. Supports detox (binds heavy metals), immune health, and digestion. May improve cholesterol levels.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Often paired with spirulina for complementary benefits.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Organic Psyllium Husk&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Soluble fiber promoting bowel regularity, blood sugar control, and cholesterol reduction. Supports gut health as a prebiotic.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Must be taken with ample water to prevent choking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Collagen Peptides&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Supports skin elasticity, joint health, and bone strength. May improve hair/nail growth and gut lining integrity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Sourced from bovine, marine, or chicken; benefits dose-dependent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Broccoli Sprouts&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: High in sulforaphane, an antioxidant supporting detox, anti-cancer pathways, and brain health. May reduce inflammation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Fresh sprouts more potent than supplements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sesame Seeds for Calcium&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Rich in bioavailable calcium for bone health, plus magnesium and zinc. Supports heart health and hormone balance.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: Whole seeds less digestible; use tahini or ground seeds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Herbal and Botanical Extracts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Full Spectrum Dandelion Extract&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Supports liver detox, digestion, and kidney function (diuretic). Rich in antioxidants, may reduce inflammation and blood sugar.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Leaves, roots, and flowers have distinct benefits.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Magnolia Bark Extract&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Contains honokiol and magnolol, with anti-anxiety, anti-inflammatory, and antioxidant effects. May support sleep, stress relief, and gut health.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Potential interactions with sedatives; dose carefully.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pau D’arco Extract&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Antifungal, antibacterial, and anti-inflammatory properties. Supports immune health and may combat candida or infections.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Limited human studies; traditionally used in South America.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Elderberry Extract&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Rich in antioxidants (anthocyanins), supports immune function, and may reduce cold/flu duration. Anti-inflammatory and antiviral properties.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Best taken at onset of symptoms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Milk Thistle&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Contains silymarin, supporting liver detox and regeneration. May protect against oxidative stress and improve insulin sensitivity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Useful for liver conditions or heavy alcohol use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Astragalus&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Adaptogen supporting immune function, heart health, and stress resilience. May enhance longevity and kidney function.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Traditionally used in TCM; limited large-scale trials.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ginger&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Anti-inflammatory and anti-nausea properties. Supports digestion, immune health, and may reduce muscle pain or menstrual cramps.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Fresh or dried forms effective; supplements standardized for gingerols.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cubeb Pepper&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Antimicrobial and antioxidant properties. Supports respiratory health, digestion, and may have anti-inflammatory effects.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Less studied than black pepper; used in traditional medicine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Matcha Green Tea&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: High in catechins (EGCG), an antioxidant supporting metabolism, brain health, and heart health. Provides calm energy via L-theanine.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: High-quality, ceremonial-grade matcha maximizes benefits.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cilantro (Heavy Metal Chelator)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: May bind heavy metals (e.g., mercury, lead) for detox. Rich in antioxidants, supports digestion, and has antimicrobial properties.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Limited evidence for chelation; pairs with chlorella for detox.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Organic Oregano Oil&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Potent antimicrobial (carvacrol, thymol) for infections, immune support, and gut health. May reduce inflammation and candida.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: Dilute to avoid irritation; short-term use recommended.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Mushroom Extracts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reishi, Shiitake, Cordyceps, Turkey Tail, Maitake, Chaga, Lion’s Mane&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reishi&lt;/strong&gt;: Immune-modulating, anti-stress, supports liver and heart health.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shiitake&lt;/strong&gt;: Immune-boosting, supports cholesterol and heart health.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cordyceps&lt;/strong&gt;: Enhances energy, athletic performance, and lung function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Turkey Tail&lt;/strong&gt;: Immune support, potential anti-cancer properties (PSK, PSP).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Maitake&lt;/strong&gt;: Supports immune health, blood sugar regulation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Chaga&lt;/strong&gt;: Antioxidant-rich, supports immune and skin health.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lion’s Mane&lt;/strong&gt;: Promotes neurogenesis, cognitive function, and mood.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Dual-extracted (water + alcohol) forms maximize bioactive compounds.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Specialty Compounds&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Trimethylglycine (TMG)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Supports methylation, reducing homocysteine levels for heart health. May enhance exercise performance and liver function.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Often used with high-dose niacin or in NAFLD treatment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Glycine&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Amino acid supporting collagen production, sleep quality, and brain health. May reduce inflammation and improve insulin sensitivity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Found in bone broth; supplements useful for sleep.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Silica&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Supports collagen formation, bone health, and connective tissue (skin, hair, nails). May improve joint flexibility.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Derived from bamboo or horsetail; dietary sources include oats.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C60 in Organic Olive Oil or MCT Oil&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Hypothesized to be a super-antioxidant, potentially extending lifespan and reducing oxidative stress. May support energy and inflammation control.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Limited human studies; mostly animal research.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tru Niagen (Nicotinamide Riboside)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Boosts NAD+ levels, supporting cellular repair, energy metabolism, and anti-aging. May improve brain and muscle function.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Benefits most pronounced in older adults or NAD+ deficiency.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MSM (Methylsulfonylmethane)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Sulfur compound supporting joint health, reducing inflammation, and improving skin/hair health. May aid allergy relief.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Often paired with glucosamine for arthritis.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Glucosamine&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Supports cartilage repair and joint health, reducing osteoarthritis pain and stiffness. May improve skin hydration.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Best as glucosamine sulfate; benefits vary by individual.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bromelain&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Pineapple-derived enzyme with anti-inflammatory and digestive benefits. May reduce swelling, aid recovery, and support sinus health.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Best taken on an empty stomach for systemic effects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Allicin/Crushed Raw Garlic (Sit for 5 Minutes)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Allicin has antimicrobial, antiviral, and cardiovascular benefits. Supports immune health, blood pressure, and cholesterol levels.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: Letting crushed garlic sit enhances allicin formation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Oils and Topicals&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CBD Oil&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Anti-inflammatory, anxiolytic, and pain-relieving properties. May improve sleep, stress, and neurological conditions (e.g., epilepsy).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Quality and dosing vary; legal status depends on region.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Frankincense Oil&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Anti-inflammatory and calming; supports skin health, immune function, and stress relief. May aid respiratory health via aromatherapy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Dilute for topical use; limited oral evidence.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pine Oil&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Antimicrobial and decongestant properties. Supports respiratory health and may reduce inflammation via aromatherapy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Primarily used in diffusers or topically (diluted).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ginger Oil&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Anti-inflammatory and warming; supports digestion, pain relief, and circulation. May reduce nausea via aromatherapy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Dilute for skin application to avoid irritation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cubeb Oil&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Antimicrobial and expectorant; supports respiratory and urinary tract health. May aid digestion and inflammation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Rare in supplements; used in traditional systems.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Black Seed Oil&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Contains thymoquinone, with anti-inflammatory, antioxidant, and immune-modulating effects. May support respiratory, skin, and metabolic health.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: Strong taste; start with small doses.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Probiotics and Gut Health&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New Roots Probiotic Intensity&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Multi-strain probiotic supporting gut microbiome, digestion, and immune health. May reduce IBS symptoms and improve mood via gut-brain axis.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: High CFU counts beneficial for dysbiosis; refrigerate for potency.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Other Foods and Compounds&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apricot Seeds (Just One)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Contain amygdalin (vitamin B17), claimed to have anti-cancer properties. May support immune health in traditional use.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: High doses toxic due to cyanide release; controversial and poorly studied.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Beets + Arugula with Nitric Oxide Dump Exercise&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Beets and arugula are rich in nitrates, boosting nitric oxide for better blood flow, exercise performance, and blood pressure. Exercise amplifies effects.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: Time meals to avoid digestive discomfort during workouts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Beverages and Hydration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Baking Soda Water&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: May alkalize body, improve exercise performance, and relieve acid reflux. Supports kidney function in some cases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Avoid overuse to prevent electrolyte imbalance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;French Press Organic Black Coffee&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Rich in antioxidants (chlorogenic acids), supports metabolism, cognitive function, and mood. May reduce risk of neurodegenerative diseases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Limit intake to avoid jitteriness or sleep disruption.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Filtered Water with Health Ranger Mineral Drops, Organic Apple Cider Vinegar, and Himalayan Pink Salt&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Enhances hydration, replenishes electrolytes, and supports digestion (ACV). May stabilize blood sugar and improve mineral balance.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: Dilute ACV to protect tooth enamel.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Health Practices&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fasting with Aforementioned Beverages and Vitamin C at 72-Hour Mark&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Promotes autophagy, fat loss, and metabolic reset. Vitamin C at 72 hours may reduce oxidative stress during prolonged fasting.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Not suitable for all; medical supervision advised for extended fasts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dry Brushing&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Stimulates lymphatic drainage, exfoliates skin, and may improve circulation. Promotes relaxation and skin health.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Gentle pressure to avoid skin irritation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deep Breathing Exercises (with HEPA Air Purifier)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Reduces stress, improves oxygenation, and supports lung health. HEPA purifier ensures clean air, reducing allergens.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: Practice diaphragmatic breathing for max benefit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Personal Care and Miscellaneous&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sovereign Silver Bio-Active Silver Hydrosol&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Colloidal silver with antimicrobial properties; used for immune support and topical infections. May aid wound healing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Limited evidence; overuse risks argyria (skin discoloration).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Carina Organics Unscented Moisturizing Shampoo&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Gentle, chemical-free cleansing for sensitive scalps. Supports healthy hair without synthetic irritants.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Ideal for those with allergies or chemical sensitivities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Organic Olive Oil/Castile Soap&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Natural, non-toxic cleansing for skin and hair. Olive oil moisturizes; castile soap is biodegradable and gentle.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Dilute castile soap to avoid dryness.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Green Beaver Fluoride-Free Toothpaste&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Benefits&lt;/strong&gt;: Cleans teeth without fluoride, reducing risk of fluorosis in sensitive individuals. Natural ingredients support oral microbiome.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note&lt;/strong&gt;: Ensure adequate fluoride from other sources for cavity prevention.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Sun, 06 Dec 2020 19:00:00 -0500</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2020-12-07-herbs-and-supplements-i-like-taking/</guid>
    </item>
    <item>
      <title>foobar2000 Run Services</title>
      <link>https://sbmesh.com/blog/posts/2020-12-07-foobar2000-run-services/</link><description>&lt;p&gt;here is my config… save as .xml&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
    
        Open Directory
        

&amp;quot;$substr(%_path%,0,$strrchr(%_path%,&#39;&#92;&#39;))&amp;quot;
    
    
        Explore Directory
        

explorer /E,&amp;quot;$substr(%_path%,0,$strrchr(%_path%,&#39;&#92;&#39;))&amp;quot;
    
    
        OpenAs...
        

rundll32.exe shell32.dll,OpenAs_RunDLL %_path%
    
    
        $if(%link%,Follow %link%,No link available)
        

&amp;quot;%link%&amp;quot;
    
    
        Google Artist
        

http://www.google.com/search?q=$replace(%artist%, ,+)&amp;amp;amp;ie=utf-8
    
    
        Google Artist + Title
        

http://www.google.com/search?q=$replace(%artist%+%title%, ,+)&amp;amp;amp;ie=utf-8
    
    
        AllMusic Artist
        

http://www.allmusic.com/cg/amg.dll?P=amg&amp;amp;amp;sql=$replace(%artist%, ,+)&amp;amp;amp;x=0&amp;amp;amp;y=0&amp;amp;amp;opt1=1&amp;amp;amp;sourceid=&amp;quot;Mozilla-search&amp;quot;
    
    
        AllMusic Album
        

http://www.allmusic.com/cg/amg.dll?P=amg&amp;amp;amp;sql=$replace(%album%, ,+)&amp;amp;amp;x=0&amp;amp;amp;y=0&amp;amp;amp;opt1=2&amp;amp;amp;sourceid=&amp;quot;Mozilla-search&amp;quot;
    
    
        AllMusic Song
        

http://www.allmusic.com/cg/amg.dll?P=amg&amp;amp;amp;sql=$replace(%title%, ,+)&amp;amp;amp;x=0&amp;amp;amp;y=0&amp;amp;amp;opt1=3&amp;amp;amp;sourceid=&amp;quot;Mozilla-search&amp;quot;
    
    
        last.fm title
        

http://www.google.com/search?q=site:last.fm+$replace(%artist%+%title%, ,+)&amp;amp;amp;ie=utf-8&amp;amp;amp;btnI
    
    
        lyrics
        

https://lite.duckduckgo.com/lite/?q=$replace(%artist%+%title%, ,+,&amp;amp;amp;,)+lyrics
    
    
        utube
        

http://www.youtube.com/results?search_query=$replace(%album artist%+%title%, ,+)
    
    
        mp3split
        

&amp;quot;D:&#92;windows&#92;program files x64&#92;mp3splt&#92;mp3splt.exe&amp;quot; -t 10.00 &amp;quot;%path%&amp;quot; -d &amp;quot;D:&#92;pod&amp;quot;
    
    
        last.fm artist
        

http://www.last.fm/music/$replace(%artist%, ,+)
    
    
        discogs
        

http://www.discogs.com/search/?q=$replace(%album artist%+%album%, ,+)
    
    
        rate
        

http://rateyourmusic.com/search?searchtype=l&amp;amp;amp;searchterm=$replace(%album artist%+%album%, ,+)
    
    
        last.fm sure
        

http://www.last.fm/music/$replace(%artist%/_/%title%, ,+)
    
    
        wiki
        

https://en.wikipedia.org/w/index.php?search=%album artist%+, ,+
    
    
        album art
        

&amp;quot;C:&#92;Program files&#92;AlbumArtDownloader&#92;albumart.exe&amp;quot; &amp;quot;%artist%&amp;quot; &amp;quot;%album%&amp;quot; &amp;quot;$replace(%_path%,%_filename_ext%,)cover.jpg&amp;quot;
    

&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Sun, 06 Dec 2020 19:00:00 -0500</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2020-12-07-foobar2000-run-services/</guid>
    </item>
    <item>
      <title>Cygwin Bash Aliases</title>
      <link>https://sbmesh.com/blog/posts/2020-12-07-cygwin-bash-aliases/</link><description>&lt;p&gt;Just for fun:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
alias sleep=&#39;date; sleep&#39;
alias alert=&#39;fmedia.exe D:/windows/Downloads/done.wav --notui&#39;
alias simp=&#39;c:/python27/python.exe -m SimpleHTTPServer&#39;
alias countdown=&#39;c:/python27/python.exe c:/rex/test/countdown.py&#39;
alias xlmp=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/xlm3.py&#39;
alias bal=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/balance.py&#39;
alias scw=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe d:/rex/test/serverww.py&#39;
alias sun=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe d:/rex/test/ogoki.py&#39;
alias scwnb=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe d:/rex/test/serverwwnb.py&#39;
alias scwn=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe d:/rex/test/serverwwnc.py&#39;
alias og=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe d:/rex/test/report.py&#39;
alias scwn1=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe d:/rex/test/serverwwnc1.py&#39;
alias scwn1b=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe d:/rex/test/serverwwn1b.py&#39;
alias scwn1c=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe d:/rex/test/serverwwn1c.py&#39;
alias scwb=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/serverwb.py&#39;
alias scwj=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/serverwj.py&#39;
alias scw1=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/serverw1.py&#39;
alias scw1b=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/serverw1b.py&#39;
alias scw1t=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/serverw1t.py&#39;
alias scw2=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/serverw2.py&#39;
alias scw0=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/serverw0.py&#39;
alias 2f=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/2fort.py&#39;
alias bal=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/btcbal.py&#39;
alias scr=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe d:/rex/test/scrape2.py&#39;
alias cmc=&#39;C:/cygwin64/bin/python2.7.exe c:/rex/test/coincap4noa3.py&#39;
alias xc=&#39;cp /cygdrive/d/bat/config-lcd-xc.txt /cygdrive/d/bat/config.txt; echo &amp;quot;LCD-XC Preset Enabled&amp;quot;&#39;
alias xc2=&#39;cp /cygdrive/d/bat/config-lcd-xc2.txt /cygdrive/d/bat/config.txt; echo &amp;quot;LCD-XC Preset Enabled&amp;quot;&#39;
alias 75=&#39;cp /cygdrive/d/bat/config-mdr-7520.txt /cygdrive/d/bat/config.txt; echo &amp;quot;MDR-7520 Preset Enabled&amp;quot;&#39;
alias cmc2=&#39;c:/python27/python.exe c:/rex/test/coincap4noa4.py&#39;
alias rv=&#39;cd c:/rex/test/radiant-voices/examples&#39;
alias tea=&#39;ib tea&#39;
alias mpv=&#39;/cygdrive/d/apps/mpv-x86_64-20200913-git-49f5c9b/mpv.exe&#39;
alias vit=&#39;sleep 10m; ib VIT&#39;
alias kr=&#39;cd c:/rex/test/python3-krakenex/examples&#39;
alias fm=&#39;ffpb -framerate 15.5 -i *.rf -c copy output.mp4&#39;
alias fmm=&#39;ffpb -framerate 15.5 -i *.rf -vf &amp;quot;eq=brightness=0.1&amp;quot; output2.mp4&#39;
alias md=&#39;bat; rsync -avt --ignore-existing -e ssh /cygdrive/d/wamp64/www/docs2/ xbian@192.168.4.10:&amp;quot;/media/My&#92; Book/site/docs/&amp;quot;; mv /cygdrive/d/wamp64/www/docs2/* /cygdrive/d/wamp64/www/docs/; bash /cygdrive/d/bat/url.bash&#39;
alias rex=&#39;cd d:/rex/test&#39;
alias web=&#39;cd c:/wamp64/www/git&#39;
alias xw=&#39;startxwin -- -listen tcp &amp;amp;&#39;
alias da=&#39;date&#39;
alias xb=&#39;ssh xbian@192.168.4.10&#39;
alias qb=&#39;C:/&amp;quot;Program Files&amp;quot;/qBittorrent/qbittorrent.exe&#39;
#alias qp2=&#39;C:/cygwin64/bin/python2.7.exe c:/rex/test/qprexm.py&#39;
alias ic=&#39;ipconfig&#39;
alias lss=&#39;ls -l --block-size=M&#39;
alias bible=&#39;c:/python27/python.exe c:/rex/test/bible.py&#39;
alias p1=&#39;ping 1.1.1.1&#39;
#alias p8=&#39;ping 8.8.8.8&#39;
alias z=&#39;unzip &amp;quot;*.zip&amp;quot;&#39;
alias zr=&#39;rm *.zip&#39;
alias 7=&#39;7za -y x &amp;quot;*.7z&amp;quot;&#39;
alias 7r=&#39;rm *.7z&#39;
alias sedm=&#39;site; sed = mapcycle2.txt | sed &amp;quot;N;s/&#92;n/&#92;t/&amp;quot; &amp;gt; mapcycle.txt&#39;
alias cpm=&#39;cp /cygdrive/d/server/mapcycle.txt /cygdrive/d/bat/game/&#39;
alias cpw=&#39;cp /cygdrive/d/server/mapcycle.txt /cygdrive/d/server/site/mapcycle2.txt&#39;
alias qp=&#39;screen -S qp2 /cygdrive/c/Users/sb/AppData/Local/Programs/Python/Python39/python.exe d:/rex/test/qpr.py&#39;
alias sq=&#39;screen -r -d -x qp2&#39;
alias py=&#39;c:/python27/python.exe&#39;
alias python3=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe&#39;
alias py3=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe&#39;
alias mvd=&#39;mv /cygdrive/d/wamp64/www/docs2/* /cygdrive/d/wamp64/www/docs/&#39;
alias mvv=&#39;mv /cygdrive/d/wamp64/www/v2/* /cygdrive/d/wamp64/www/v/&#39;
alias v2=&#39;cd /cygdrive/d/wamp64/www/v2&#39;
alias p3=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe&#39;
alias python=&#39;c:/python27/python.exe&#39;
alias p=&#39;c:/python27/python.exe&#39;
alias p2=&#39;C:/cygwin64/bin/python2.7.exe&#39;
alias p38=&#39;C:/cygwin64/bin/python3.8.exe&#39;
alias wb=&#39;c:/python27/python.exe c:/rex/test/printweather.py&#39;
alias no=&#39;c:/python27/python.exe d:/rex/test/nitric.py&#39;
alias lf=&#39;c:/python27/python.exe d:/rex/test/lift.py&#39;
alias t=&#39;c:/python27/python.exe d:/rex/test/stepper.py&#39;
alias std=&#39;c:/python27/python.exe d:/rex/test/stand.py&#39;
alias xrr=&#39;c:/python27/python.exe d:/rex/test/exercise.py&#39;
alias xr=&#39;termdown &amp;quot;30m 5s&amp;quot;;echo &amp;quot;&amp;quot;;echo Drink 600ml water.&#39;
alias xrn=&#39;termdown &amp;quot;10m 5s&amp;quot;;echo &amp;quot;&amp;quot;;echo Drink 100ml water.&#39;
alias vc=&#39;c:/python27/python.exe d:/rex/test/vc.py&#39;
alias wtd=&#39;curl wttr.in/duncan+bc&#39;
alias wtk=&#39;curl wttr.in/nakina+on&#39;
alias wtb=&#39;curl wttr.in/burnaby&#39;
alias wtn=&#39;curl wttr.in/new+york+city&#39;
alias price=&#39;C:/Users/sb/AppData/Local/Programs/Python/Python39/python.exe c:/rex/test/price2.py&#39;
alias pricee=&#39;C:/cygwin64/bin/python2.7.exe c:/rex/test/inputpricee.py&#39;
alias dt=&#39;cd /cygdrive/d/apps; rm 1.torrent; scp debian@vps-b2931db6.vps.ovh.ca:/home/debian/1.torrent /cygdrive/d/apps&#39;
alias cz=&#39;cd &amp;quot;/cygdrive/c/Program Files (x86)/Steam/steamapps/common/Half-Life/czero&amp;quot;&#39;
alias ips=&#39;C:/cygwin64/bin/python2.7.exe c:/rex/test/inputpricesys.py&#39;
alias c=&#39;clear&#39;
alias h=&#39;vi C:/Windows/System32/drivers/etc/hosts&#39;
alias lynx=&#39;lynx -useragent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot;&#39;
alias ly=&#39;screen -S lyn lynx -useragent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot;&#39;
alias sl=&#39;screen -r -d -x lyn&#39;
alias ks=&#39;taskkill /im sun.exe; cmd /C &amp;quot;c:/Users/sb/Downloads/SUN.EXE&amp;quot;&#39;
alias cr=&#39;clear; reset&#39;
alias rc=&#39;clear; reset&#39;
alias faucet=&#39;cd /cygdrive/c/bat/ &amp;amp;&amp;amp; ./xlmfaucet.ahk&#39;
alias src=&#39;source ~/.bashrc&#39;
alias ran=&#39;./rand&#39;
alias xlm=&#39;stellarctl account info --id GC6U373WF47DZYGNUPOJXZRRJTTUM4TX27GG7LO6KBR4R3N5PGPG2VDB&#39;
alias dl=&#39;cd d:/apps&#39;
alias adr=&#39;cd c:/users/sb/AppData/Roaming&#39;
alias adl=&#39;cd c:/users/sb/AppData/Local&#39;
alias doc=&#39;cd c:/users/sb/Documents&#39;
alias v=&#39;cd d:/vid&#39;
alias vv=&#39;cd e:/vid&#39;
alias mu=&#39;cd c:/users/sb/Music&#39;
alias pod=&#39;cd d:/pod/dl&#39;
alias gp=&#39;rsync -P -e ssh debian@vps-b2931db6.vps.ovh.ca:/home/debian/pod/output.mp3 /cygdrive/d/pod/dl/; alert&#39;
alias gps=&#39;sleep 2m; gp&#39;
alias gv=&#39;rsync -P -e ssh debian@vps-b2931db6.vps.ovh.ca:/home/debian/Downloads/output.mp4 /cygdrive/d/vid/; alert&#39;
alias ser=&#39;cd d:/server/&#39;
alias site=&#39;cd d:/server/site&#39;
alias ng=&#39;cd d:/ng&#39;
alias bat=&#39;cd D:/bat&#39;
alias po=&#39;/cygdrive/d/bat/podsync.sh&#39;
alias game=&#39;cd d:/bat/game&#39;
alias qnn=&#39;cd C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/&#39;
alias qn=&#39;cd /cygdrive/d/apps/QOwnNotes/Data/Notes&#39;
alias pmm=&#39;cd /cygdrive/d/Profiles/pwv7so8e.vpn/&#39;
alias pm=&#39;cd /cygdrive/d/Profiles/8qdsmbaf.BLANK/&#39;
alias qn1=&#39;vi C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote1.txt&#39;
alias qn2=&#39;vi C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote2.txt&#39;
alias qn3=&#39;vi C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote3.txt&#39;
alias qn4=&#39;vi C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote4.txt&#39;
alias qn5=&#39;vi C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote5.txt&#39;
alias qn6=&#39;vi C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote6.txt&#39;
alias d=&#39;vi d:/bat/diary.txt&#39;
alias q1=&#39;nano C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote1.txt&#39;
alias dy=&#39;nano d:/bat/delivered.txt&#39;
alias log=&#39;nano /var/log/messages&#39;
alias logv=&#39;vi /var/log/messages&#39;
alias cdb=&#39;cd /bin/&#39;
alias q1=&#39;nano C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote1.txt&#39;
alias q2=&#39;nano C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote2.txt&#39;
alias q3=&#39;nano C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote3.txt&#39;
alias q4=&#39;nano C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote4.txt&#39;
alias q5=&#39;nano C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote5.txt&#39;
alias q6=&#39;nano C:/Users/sb/AppData/Roaming/&amp;quot;Moonchild Productions&amp;quot;/&amp;quot;Pale Moon&amp;quot;/Profiles/kodhuvhg.default/chrome/quicknote6.txt&#39;
alias sven=&#39;vi C:/bat/game/svencoopadmin.ahk&#39;
alias sln=&#39;nano C:/bat/shoppinglist.txt&#39;
alias slv=&#39;vim C:/bat/shoppinglist.txt&#39;
#alias suspend=&#39;date; rundll32.exe powrprof.dll,SetSuspendState 0,1,0&#39;
alias suspend=&#39;date; &amp;quot;C:/Program Files/AutoHotkey/AutoHotkey.exe&amp;quot; &amp;quot;D:/bat/suspend.ahk&amp;quot;&#39;
alias shutdown=&#39;ks; shutdown.exe /s /t 00&#39;
alias reboot=&#39;ks; shutdown.exe /r /t 0&#39;
#alias yt=&#39;youtube-dl --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot;&#39;
alias yu=&#39;youtube-dl -U&#39;
alias yd=&#39;youtube-dl&#39;
#alias yg=&#39;you-get&#39;
alias yl=&#39;youtube-dl --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -f 18 -i -a y.txt; date ; alert&#39;
alias nl=&#39;ng; youtube-dl --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -i -a 1.txt; date ; alert&#39;
alias nl5=&#39;ng; youtube-dl --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -i -r 50k -a 1.txt; date ; alert&#39;
yg() { you-get &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; alert; }
alias yf=&#39;youtube-dl --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -f&#39;
y() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -f 18 &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
#yz() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -f 18 &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert &amp;amp;&amp;amp; /cygdrive/c/&amp;quot;Program Files&amp;quot;/AutoHotkey/AutoHotkeyU64.exe &amp;quot;D:&#92;bat&#92;runvid.ahk&amp;quot;; }
yz() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert &amp;amp;&amp;amp; /cygdrive/c/&amp;quot;Program Files&amp;quot;/AutoHotkey/AutoHotkeyU64.exe &amp;quot;D:&#92;bat&#92;runvid.ahk&amp;quot;; }
yy() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -f 18 -r $1 $2 &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
yyy() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -r $1 $2 &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
y5() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -r 50k -f 18 &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
yt5() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -r 50k &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
y9() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -r 90k -f 18 &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
yt9() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -r 90k &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
y0() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -r 150k -f 18 &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
yt0() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -r 150k &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
y7() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -f 22 &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
y75() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -f 22 -r 50k &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
y79() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -f 22 -r 90k &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
y70() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -f 22 -r 150k &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
ya() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -f 140 &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; date &amp;amp;&amp;amp; alert; }
yt() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; alert; }
ytn() { yt-dlp --no-check-certificate --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; alert; }
yn() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; alert &amp;amp;&amp;amp; date &amp;amp;&amp;amp; /cygdrive/c/&amp;quot;Program Files&amp;quot;/AutoHotkey/AutoHotkeyU64.exe &amp;quot;D:&#92;bat&#92;newgrounds.ahk&amp;quot; ; }
#yn() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; alert &amp;amp;&amp;amp; date &amp;amp;&amp;amp; /cygdrive/d/bat/newgrounds.exe ; }
yn5() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -r 50k &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; alert &amp;amp;&amp;amp; date &amp;amp;&amp;amp; /cygdrive/c/&amp;quot;Program Files&amp;quot;/AutoHotkey/AutoHotkeyU64.exe &amp;quot;D:&#92;bat&#92;newgrounds.ahk&amp;quot; ; }
#yn5() { yt-dlp --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -r 50k &amp;quot;$@&amp;quot; &amp;amp;&amp;amp; alert &amp;amp;&amp;amp; date &amp;amp;&amp;amp; /cygdrive/d/bat/newgrounds.exe ; }
wg5() { wget --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --limit-rate 50k $@ &amp;amp;&amp;amp; alert; }
wg() { wget --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 $@ &amp;amp;&amp;amp; alert; }
wgi() { wget --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --no-check-certificate $@ &amp;amp;&amp;amp; alert; }
wgi5() { wget --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --no-check-certificate --limit-rate 50k $@ &amp;amp;&amp;amp; alert; }
wgi9() { wget --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --no-check-certificate  --limit-rate 90k $@ &amp;amp;&amp;amp; alert; }
wgi0() { wget --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --no-check-certificate --limit-rate 150k $@ &amp;amp;&amp;amp; alert; }
wgg() { wget --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --limit-rate $1 $2 &amp;amp;&amp;amp; alert; }
wg5() { wget --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --limit-rate 50k $@ &amp;amp;&amp;amp; alert; }
wg9() { wget --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --limit-rate 90k $@ &amp;amp;&amp;amp; alert; }
wg0() { wget --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --limit-rate 150k $@ &amp;amp;&amp;amp; alert; }
wg5w() { wgetw --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --limit-rate 50k $@ &amp;amp;&amp;amp; alert; }
wgw() { wgetw --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 $@ &amp;amp;&amp;amp; alert; }
wgiw() { wgetw --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --no-check-certificate $@ &amp;amp;&amp;amp; alert; }
wgi5() { wgetw --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --no-check-certificate --limit-rate 50k $@ &amp;amp;&amp;amp; alert; }
wgi9w() { wgetw --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --no-check-certificate  --limit-rate 90k $@ &amp;amp;&amp;amp; alert; }
wgi0w() { wgetw --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --no-check-certificate --limit-rate 150k $@ &amp;amp;&amp;amp; alert; }
wgww() { wgetw --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --limit-rate $1 $2 &amp;amp;&amp;amp; alert; }
wgw5() { wgetw --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --limit-rate 50k $@ &amp;amp;&amp;amp; alert; }
wgw9() { wgetw --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --limit-rate 90k $@ &amp;amp;&amp;amp; alert; }
wgw0() { wgetw --user-agent=&amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0&amp;quot; --retry-connrefused --retry-on-http-error=403 --continue --tries=0 --limit-rate 150k $@ &amp;amp;&amp;amp; alert; }
#alias y=&#39;youtube-dl --ffmpeg-location &amp;quot;d:/apps/ffmpeg/bin&amp;quot; --retries infinite -f 18&#39;
alias yF=&#39;youtube-dl -F&#39;
#alias ya=&#39;youtube-dl -f 140&#39;
#alias alpine=&#39;cd C:/cygwin64/home/sb/alpine-0473711/alpine/ &amp;amp;&amp;amp; ./alpine&#39;
alias sleep1h=&#39;sleep 1h; suspend&#39;
alias sleep2h=&#39;sleep 2h; suspend&#39;
alias sleep3h=&#39;sleep 3h; suspend&#39;
alias sleep4h=&#39;sleep 4h; suspend&#39;
alias sleep5h=&#39;sleep 5h; suspend&#39;
alias wgc=&#39;dl; rm setup-x86_64.exe; wgw https://cygwin.com/setup-x86_64.exe &amp;amp;&amp;amp; ./setup-x86_64.exe&#39;
alias s1h=&#39;sleep 1h; suspend&#39;
alias s2h=&#39;sleep 2h; suspend&#39;
alias s3h=&#39;sleep 3h; suspend&#39;
alias s4h=&#39;sleep 4h; suspend&#39;
alias s5h=&#39;sleep 5h; suspend&#39;alias sleep1h=&#39;date; sleep 1h; suspend&#39;
#alias sleep2h=&#39;date; sleep 2h; suspend&#39;
#alias sleep3h=&#39;date; sleep 3h; suspend&#39;
#alias sleep4h=&#39;date; sleep 4h; suspend&#39;
#alias sleep5h=&#39;date; sleep 5h; suspend&#39;
#alias s1h=&#39;date; sleep 1h; suspend&#39;
#alias s2h=&#39;date; sleep 2h; suspend&#39;
#alias s3h=&#39;date; sleep 3h; suspend&#39;
#alias s4h=&#39;date; sleep 4h; suspend&#39;
#alias s5h=&#39;date; sleep 5h; suspend&#39;
alias vial=&#39;vim +225 ~/.bashrc&#39;
alias ib=&#39;nircmd infobox&#39;
alias rm1=&#39;rm /cygdrive/c/Users/sb/AppData/Roaming/iSpy/WebServerRoot/Media/Video/EDKIY/thumbs/*&#39;
alias rmv1=&#39;rm /cygdrive/c/Users/sb/AppData/Roaming/iSpy/WebServerRoot/Media/Video/EDKIY/*.mp4&#39;
alias rm2=&#39;rm /cygdrive/c/Users/sb/AppData/Roaming/iSpy/WebServerRoot/Media/Video/PUEZQ/thumbs/*&#39;
alias rmv2=&#39;rm /cygdrive/c/Users/sb/AppData/Roaming/iSpy/WebServerRoot/Media/Video/PUEZQ/*.mp4&#39;
alias rma=&#39;rm /cygdrive/c/Users/sb/AppData/Roaming/iSpy/WebServerRoot/Media/Video/EDKIY/thumbs/*; rm /cygdrive/c/Users/sb/AppData/Roaming/iSpy/WebServerRoot/Media/Video/PUEZQ/thumbs/*&#39;
alias rmva=&#39;rm /cygdrive/c/Users/sb/AppData/Roaming/iSpy/WebServerRoot/Media/Video/EDKIY/*.mp4; rm /cygdrive/c/Users/sb/AppData/Roaming/iSpy/WebServerRoot/Media/Video/PUEZQ/*.mp4&#39;
alias rme=&#39;rma; rmva&#39;
alias vqp=&#39;vi C:/rex/test/qprexm.py&#39;
alias pythonc=&#39;C:/cygwin64/bin/python2.7.exe&#39;
alias lst=&#39;echo door; ls /cygdrive/c/Users/sb/AppData/Roaming/iSpy/WebServerRoot/Media/video/PUEZQ/thumbs; echo computer; ls /cygdrive/c/Users/sb/AppData/Roaming/iSpy/WebServerRoot/Media/video/EDKIY/thumbs; date&#39;
alias irssi=&#39;screen -S irs irssi&#39;
alias si=&#39;screen -r -d -x irs&#39;
alias weechat=&#39;screen -S wee weechat&#39;
alias sw=&#39;screen -r -d -x wee&#39;
alias sshl=&#39;cat /var/log/messages | grep sshd&#39;
alias sshc=&#39;truncate -s 0 /var/log/messages&#39;
alias rsc=&#39;truncate -s 0 /cygdrive/d/RSNet.txt&#39;
alias start=&#39;cmd /c start&#39;
alias vl=&#39;/cygdrive/c/&amp;quot;Program Files&amp;quot;/VideoLAN/VLC/vlc.exe&#39;
#alias up=&#39;/cygdrive/d/foobar2000b/foobar2000.exe /runcmd=File/&amp;quot;Update All Podcast Feeds&amp;quot;&#39;
#alias up=&#39;/cygdrive/c/&amp;quot;Program Files&amp;quot;/AutoHotkey/AutoHotkeyU64.exe &amp;quot;D:&#92;bat&#92;jonez.ahk&amp;quot;&#39;
#lias up=&#39;/cygdrive/c/&amp;quot;Program Files&amp;quot;/AutoHotkey/AutoHotkeyU64.exe &amp;quot;D:&#92;bat&#92;jonez.ahk&amp;quot;&#39;
alias up=&#39;/cygdrive/d/bat/up.exe&#39;
alias r=&#39;/cygdrive/d/foobar2000/foobar2000.exe /runcmd=Playback/Random&#39;
alias gc=&#39;git clone&#39;
alias sshol=&#39;ssh pi@192.168.4.41 -p 10147&#39;
alias l=&#39;ssh pi@192.168.4.41 -p 10147&#39;
alias ll=&#39;ssh admin@192.168.4.1&#39;
alias sshh=&#39;ssh pi@192.168.4.41 -p 10147&#39;
alias sshw=&#39;ssh -t debian@vps-b2931db6.vps.ovh.ca &amp;quot;screen -r -d -x wch&amp;quot;&#39;
alias sshi=&#39;ssh -t debian@vps-b2931db6.vps.ovh.ca &amp;quot;screen -r -d -x irs&amp;quot;&#39;
alias sshol2=&#39;ssh debian@192.168.4.38 -p 10149&#39;
alias pt=&#39;sh /cygdrive/d/bat/put&#39;
alias p8=&#39;sh /cygdrive/d/bat/pingg 8.8.8.8; ping -w 60 8.8.8.8; date&#39;
alias 11=&#39;sh /cygdrive/d/bat/pingg 192.168.4.1; ping -w 10 192.168.4.1&#39;
alias pg=&#39;sh /cygdrive/d/bat/pingg google.ca; ping -w 60 google.ca; date&#39;
alias g=&#39;sh /cygdrive/d/bat/pingg google.ca; ping -w 60 google.ca; date&#39;
alias pgg=&#39;sh /cygdrive/d/bat/pingg google.ca&#39;
alias gg=&#39;sh /cygdrive/d/bat/pingg google.ca&#39;
alias 1=&#39;ping 192.168.4.1&#39;
alias pingg=&#39;sh /cygdrive/d/bat/pingg&#39;
alias wad=&#39;sh /cygdrive/d/bat/wad&#39;
alias ptc=&#39;sh /cygdrive/d/bat/putc&#39;
alias ptcc=&#39;sh /cygdrive/d/bat/putch&#39;
alias pti=&#39;sh /cygdrive/d/bat/putindex&#39;
alias mvm=&#39;sh /cygdrive/d/bat/mvhtml; explorer &amp;quot;d:&#92;windows&#92;docs&#92;html&amp;quot;; explorer &amp;quot;d:&#92;wamp64&#92;www&#92;docs2&amp;quot;&#39;
alias low=&#39;/cygdrive/c/Windows/System32/powercfg.exe /setactive a1841308-3541-4fab-bc81-f71556f20b4a&#39;
alias mid=&#39;/cygdrive/c/Windows/System32/powercfg.exe /setactive 381b4222-f694-41f0-9685-ff5bb260df2e&#39;
alias f=&#39;curl -fI &amp;quot;https://download.mozilla.org/?product=firefox-latest&amp;amp;os=linux64&amp;amp;lang=en-US&amp;quot; | grep -o &amp;quot;firefox-[0-9.]&#92;+[0-9]&amp;quot;&#39;
alias al=&#39;grep --no-filename &amp;quot;^[^#;]&amp;quot; ~/.bashrc | grep --color=auto alias&#39;
unset TZ
export DISPLAY=:0.0
cd /cygdrive/d/vid

&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Sun, 06 Dec 2020 19:00:00 -0500</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2020-12-07-cygwin-bash-aliases/</guid>
    </item>
    <item>
      <title>AutoHotkey AHK Power Control Script</title>
      <link>https://sbmesh.com/blog/posts/2020-12-07-autohotkey-ahk-power-control-script-etc/</link><description>&lt;p&gt;AutoHotkey is a game-changer for automating repetitive tasks, and with a well-crafted script, you can transform your workflow. Below, we dive into a powerful AutoHotkey script packed with hotkeys designed to streamline media control, window management, file access, and more. This script, an enhanced version combining the best of two iterations, includes both everyday shortcuts and specialized commands for power users. Whether you’re toggling apps, controlling music, or pulling random content, these hotkeys have you covered. Let’s break them down by category!&lt;/p&gt;
&lt;h3&gt;Media Control: Master Your Music and Videos&lt;/h3&gt;
&lt;p&gt;The script offers a suite of hotkeys for controlling media playback, primarily focused on foobar2000, a popular audio player, and video players like mpv and VLC.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;F9&lt;/strong&gt;: Play or pause the main foobar2000 instance. Perfect for quick music control.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shift+F9&lt;/strong&gt;: Play or pause an alternate foobar2000 instance (e.g., at D:&#92;foobar2000b). Great for managing multiple playlists.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;F10/F11&lt;/strong&gt;: Skip to the previous or next track in foobar2000.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+MButton / Ctrl+XButton2&lt;/strong&gt;: Play a random track in foobar2000, adding spontaneity to your listening.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shift+Volume Up/Down&lt;/strong&gt;: Seek forward or backward by 1 second in foobar2000, ideal for precise scrubbing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+Volume Up/Down&lt;/strong&gt;: Seek by 10 seconds for faster navigation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+Alt+WheelUp/Down&lt;/strong&gt;: Set foobar2000 volume to 0 dB or -12 dB, respectively, for quick volume adjustments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+6&lt;/strong&gt;: Toggle Discord Rich Presence in foobar2000 to show off what you’re listening to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+Alt+V&lt;/strong&gt;: Resize and move mpv, VLC, or Picture-in-Picture windows to a secondary monitor for distraction-free viewing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+9&lt;/strong&gt;: Position Agent DVR (a surveillance tool) on the secondary monitor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;F5&lt;/strong&gt;: Move multiple media windows (mpv, VLC, SunVox, etc.) to the secondary monitor with precise coordinates, optimizing your multi-monitor setup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+Z / AppsKey+J&lt;/strong&gt;: Play the newest video in the D:&#92;vid&#92; folder using mpv with dynamic audio normalization, automatically setting the audio device to RME ADI-2 Pro.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Window and Application Management: Seamless Navigation&lt;/h3&gt;
&lt;p&gt;Switching between apps and managing windows is a breeze with these hotkeys, designed to keep your workspace organized.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MButton &amp;amp; XButton1&lt;/strong&gt;: Toggle between Firefox and Pale Moon browsers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;XButton1&lt;/strong&gt;: Switch between Renoise and Ableton Live, perfect for music producers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+B&lt;/strong&gt;: Toggle between Betterbird and Thunderbird email clients.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+P&lt;/strong&gt;: Switch between Notepad++ and VSCodium for coding or note-taking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+9&lt;/strong&gt;: Alternate between WinSCP and FileZilla for file transfers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NumpadDiv&lt;/strong&gt;: Toggle between foobar2000 and ConEmu (a terminal emulator).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NumpadMult&lt;/strong&gt;: Switch between foobar2000 and Firefox.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+, / AppsKey+. / AppsKey+/&lt;/strong&gt;: Activate main, alternate, or third foobar2000 instances, respectively.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+N / F / U / R / M / K / I&lt;/strong&gt;: Toggle or tab through QOwnNotes, Firefox, SumatraPDF, Renoise, BowPad, KeePass, or a Raspberry Pi console, respectively, with Alt+Tab fallback if already active.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shift+NumpadAdd / Div / Sub&lt;/strong&gt;: Activate Renoise, a PHP book in SumatraPDF, or SunVox, respectively.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shift+NumpadMult&lt;/strong&gt;: Set display frequency to 280Hz and activate Sven Co-op, optimizing for gaming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+Win+T&lt;/strong&gt;: Toggle AlwaysOnTop for the active window, with a visual flash to confirm.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+Numpad1–4&lt;/strong&gt;: Switch to virtual desktops 1–4 (restored from the old script, using the VD library).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+Win+Alt+Left/Right&lt;/strong&gt;: Move the active window to the previous or next virtual desktop (restored).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;File and Folder Access: Instant Access to Your Data&lt;/h3&gt;
&lt;p&gt;These hotkeys open or activate specific folders, streamlining file management.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+V&lt;/strong&gt;: Open or activate the D:&#92;vid folder (Videos).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+Q&lt;/strong&gt;: Access the D:&#92;windows&#92;Pictures folder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+Shift+E&lt;/strong&gt;: Open the D:&#92; drive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+Shift+U&lt;/strong&gt;: Access the C:&#92;Users&#92;sb&#92;AppData folder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+1 / L / ; / C / T / G / H / A&lt;/strong&gt;: Open folders like D:&#92;server, AppData&#92;Local, AppData&#92;Roaming, D:&#92;bat, D:&#92;rex&#92;test, D:&#92;bat&#92;game, D:&#92;windows&#92;docs&#92;html, or D:&#92;apps (Downloads), respectively.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shift+Ctrl+P&lt;/strong&gt;: Copy the active File Explorer path to the clipboard.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;System and Display Control: Fine-Tune Your Setup&lt;/h3&gt;
&lt;p&gt;Manage power settings, display frequency, and system inputs with ease.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+NumpadSub / Alt+F1&lt;/strong&gt;: Set display frequency to 60Hz.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+NumpadAdd / Alt+F2&lt;/strong&gt;: Set display frequency to 280Hz for high-refresh-rate monitors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+Alt+NumpadAdd&lt;/strong&gt;: Switch to High Performance power mode with a tray tip reminder to check speakers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+Shift+NumpadAdd&lt;/strong&gt;: Set Balanced power mode and launch HomeSafe View (a surveillance app) if not running.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+Win+M&lt;/strong&gt;: Close HomeSafe View, switch to Power Saver mode, log the change, and turn off monitors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+M&lt;/strong&gt;: Turn off monitors instantly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+Alt+Win+Pause&lt;/strong&gt;: Block keyboard and mouse input for security.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+Pause&lt;/strong&gt;: Unblock input, releasing modifier keys.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+N / , / . / ‘&lt;/strong&gt;: Open Windows settings for Night Light, Updates, Taskbar, or Graphics, respectively.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+[&lt;/strong&gt;: Launch the Windows Volume Mixer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+Win+N&lt;/strong&gt;: Open today’s SDRSharp recordings folder, or activate it if open (restored).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+Win+8 / 9&lt;/strong&gt;: Open recent or yesterday’s SDRSharp recordings in Audacity (restored).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Clipboard and Text Manipulation: Boost Your Typing&lt;/h3&gt;
&lt;p&gt;These hotkeys automate text input and clipboard processing for efficiency.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shift+Ctrl+Alt+D / F / H / G&lt;/strong&gt;: Paste timestamps in various formats (e.g., full date-time, date only, time with day, or a formatted ChatSounds notice).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+Win+T / Y / 2&lt;/strong&gt;: Paste compact timestamp, date, or hyphenated date.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+Win+R&lt;/strong&gt;: Append the clipboard content to a Reddit RSS feed URL.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+W / Shift+Ctrl+Alt+V / B&lt;/strong&gt;: Wrap clipboard content in double or single quotes and paste.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shift+Ctrl+V&lt;/strong&gt;: Remove newlines from the clipboard and paste.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+Alt+F11&lt;/strong&gt;: Process the clipboard to remove specific words, normalize spaces, and write to ChatSoundsnewFR.txt, then run a bash script.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;F7&lt;/strong&gt;: Copy the active Edge tab’s title and URL to the clipboard.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Content Randomization: Add Some Fun&lt;/h3&gt;
&lt;p&gt;Pull random content from predefined lists for inspiration or entertainment.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+Win+V / , / U / B / I&lt;/strong&gt;: Open random Max 8 patcher, Renoise project, Max gen file, Max help patcher, or Max example patcher.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+Win+F7 / 3&lt;/strong&gt;: Send a random Bible verse or BIP 39 word.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+B&lt;/strong&gt;: Open a random ebook from a list.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+Capslock&lt;/strong&gt;: Open a random URL in Brave and log it to his.txt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+Shift+Z / X / C / V / B&lt;/strong&gt;: Open random Amazon Music album, Dave video, Vancity video, Ben video, or C++ video in Firefox or Brave.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+Alt+C&lt;/strong&gt;: Open a random chess article in Brave and log it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+3 / 4 / 5&lt;/strong&gt;: Play random Terry A. Davis videos from 2017, 2017b, or 2018 archives.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+7&lt;/strong&gt;: Copy a random chess endgame FEN to the clipboard.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Download and Terminal Commands: Automate Web Tasks&lt;/h3&gt;
&lt;p&gt;These hotkeys streamline downloading and terminal interactions using tools like yt-dlp and wget.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+C / 0 / Z / Alt+Win+C&lt;/strong&gt;: Run yt-dlp with different options (normal, with subtitles, open in mpv, or with -f 18) in ConEmu.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+/&lt;/strong&gt;: Download Newgrounds audio using yt-dlp.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shift+Ctrl+C&lt;/strong&gt;: Run wget in ConEmu with the clipboard content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+V&lt;/strong&gt;: Paste the clipboard in quotes in ConEmu with a custom command.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+F1&lt;/strong&gt;: Ping and open Starlink statistics in a browser.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+&#92; / =&lt;/strong&gt;: Run or download ChatSounds scripts via Cygwin’s mintty.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Gaming and Niche Tools: For Specialized Tasks&lt;/h3&gt;
&lt;p&gt;Hotkeys for gaming (Sven Co-op) and niche applications like IrfanView and Wikipedia.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+F9&lt;/strong&gt;: Play a random sound in Sven Co-op.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shift+Ctrl+Alt+0 / 9&lt;/strong&gt;: Say a random Bible verse or scientist line in Sven Co-op.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+F / Alt+Win+F / G / H / J&lt;/strong&gt;: Perform random mouse wheel actions in IrfanView with varying delays and counts, great for browsing images.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+Alt+U / J&lt;/strong&gt;: Send ‘u’ or ‘j’ to Wikipedia for navigation (restored).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+F2&lt;/strong&gt;: Display the parent window’s title and class (restored, useful for debugging).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+F5&lt;/strong&gt;: Resize and move YouTube live chat to the secondary monitor (restored).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Miscellaneous: System-Wide Utilities&lt;/h3&gt;
&lt;p&gt;A few handy utilities round out the script.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+Insert&lt;/strong&gt;: Suspend all hotkeys for a quick pause.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+Win+F12&lt;/strong&gt;: Toggle a GUI showing all hotkeys and their comments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Win+Ctrl+F9&lt;/strong&gt;: Write the hotkey list to D:&#92;bat&#92;keys.txt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shift+Ctrl+Alt+F12&lt;/strong&gt;: Empty the Recycle Bin with a tray tip.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppsKey+2&lt;/strong&gt;: Open Sound settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+F7&lt;/strong&gt;: Press ‘a’ every 800ms for 1500 iterations, useful for repetitive tasks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alt+Win+PrintScreen&lt;/strong&gt;: Capture a screenshot and paste it into PaintDotNet (restored).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Why These Hotkeys Rock&lt;/h3&gt;
&lt;p&gt;This AutoHotkey script is a productivity powerhouse, blending everyday shortcuts with specialized commands for media enthusiasts, developers, and gamers. The restored hotkeys from the older version—such as virtual desktop navigation (Alt+Numpad1–4, Ctrl+Win+Alt+Left/Right), SDRSharp recording access (Alt+Win+N/8/9), and Wikipedia navigation (Ctrl+Alt+U/J)—add depth, making it ideal for users with diverse needs. Whether you’re managing multiple foobar2000 instances, downloading videos with yt-dlp, or randomizing your music and video playback, these hotkeys save time and effort.&lt;/p&gt;
&lt;h3&gt;Get Started&lt;/h3&gt;
&lt;p&gt;To use this script, download AutoHotkey, save the code as a .ahk file, and run it. Customize the paths (e.g., D:&#92;vid, C:&#92;Program Files&#92;foobar2000) to match your system, and tweak the hotkeys to fit your workflow. With this script, you’ll be automating like a pro in no time!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: Some hotkeys rely on external tools like foobar2000, mpv, Cygwin, or the VD library. Ensure these are installed, and check file paths for compatibility.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
#Insert Suspend all hotkeys
MButton &amp;amp; XButton2 Play random track in foobar2000
MButton &amp;amp; XButton2 Up Release MButton and XButton2
XButton2 &amp;amp; MButton Play random track in foobar2000
XButton2 Send r key in browsers to refresh with Vimium
MButton &amp;amp; XButton1 Toggle between Firefox and Pale Moon
^MButton Play random track
^!WheelUp Set volume to 0 dB
^!WheelDown Set volume to -12 dB
+f9 Play/pause alternate foobar2000
f9 Play/pause main foobar2000
f10 Previous track in foobar2000
f11 Next track in foobar2000
!6 Toggle Discord Rich Presence in foobar2000
^XButton2 Play random track
+Volume_Down Seek back 1 second
+Volume_Up Seek ahead 1 second
^Volume_Down Seek back 10 seconds
^Volume_Up Seek ahead 10 seconds
appskey &amp;amp; b Toggle between Betterbird and Thunderbird
appskey &amp;amp; p Toggle between Notepad++ and VSCodium
appskey &amp;amp; 9 Toggle between WinSCP and FileZilla
XButton1 Toggle between Renoise and Ableton
numpaddiv Toggle between foobar2000 and ConEmu
numpadmult Toggle between foobar2000 and Firefox
appskey &amp;amp; , Activate main foobar2000
appskey &amp;amp; . Activate alternate foobar2000
appskey &amp;amp; / Activate third foobar2000 instance
+NumpadAdd Activate Renoise
+NumpadDiv Activate PHP book
+NumpadSub Activate SunVox
+NumpadMult Set 280Hz and activate Sven Co-op
appskey &amp;amp; n Toggle or tab QOwnNotes
appskey &amp;amp; f Toggle or tab Firefox
appskey &amp;amp; u Toggle or tab SumatraPDF
appskey &amp;amp; r Toggle or tab Renoise
appskey &amp;amp; m Toggle or tab BowPad
appskey &amp;amp; k Toggle or tab KeePass
appskey &amp;amp; i Toggle or tab Raspberry Pi console
appskey &amp;amp; v Open or activate Videos folder
appskey &amp;amp; q Open or activate Pictures folder
!Numpad1 Switch to virtual desktop 1
!Numpad2 Switch to virtual desktop 2
!Numpad3 Switch to virtual desktop 3
!Numpad4 Switch to virtual desktop 4
!#k Get ffmpeg converted podcast from VPS
Launch_App2 Placeholder for custom application launch
Launch_Media Placeholder for custom media launch
!#PrintScreen Capture screenshot and paste in PaintDotNet with Alt + Win + PrintScreen
#PgDn Get current weather
!#PgDn Get current weather (double star)
^#PgDn Get current weather (unformatted, Burnaby)
#PgUp Get system info
!#PgUp Get system info (double star)
^F2 Get parent window info
^F5 Resize and move YouTube chat to secondary monitor
^!u Send &#39;u&#39; to Wikipedia
^!j Send &#39;j&#39; to Wikipedia
^#!Left Move window to previous virtual desktop
^#!Right Move window to next virtual desktop
!NumpadSub Set display frequency to 60Hz
!f1 Set display frequency to 60Hz
!NumpadAdd Set display frequency to 280Hz
!f2 Set display frequency to 280Hz
^#F12 Toggle GUI visibility
+^p Copy active Explorer path to clipboard
#^f9 Write hotkey list to D:&#92;bat&#92;keys.txt
^!NumpadAdd Set High Performance mode
#!NumpadAdd Set Balanced mode and run HomeSafe View
!#m Close HomeSafe View, set Power Saver mode, and turn off monitors
#m Turn off monitors
^!f11 Process clipboard and write to ChatSoundsnewFR.txt
^+!d Paste full timestamp
!#t Paste compact timestamp
!#y Paste date
!2 Paste hyphenated date
^+!f Paste date without time
^+!h Paste time and day
^+!g Paste formatted ChatSounds notice
!#r Paste Reddit RSS feed
f7 Copy Edge URL and title
!f3 Ignore JOINS PARTS QUITS NICKS for irssi channel name in Clipboard
!w Wrap clipboard in double quotes
^+!v Wrap clipboard in single quotes
^+!b Wrap clipboard in double quotes
^+!f12 Empty Recycle Bin
appskey &amp;amp; 2 Open Sound settings
^#t Toggle AlwaysOnTop
^+v Remove newlines from clipboard
^!#pause Block keyboard and mouse input
appskey &amp;amp; pause Unblock input
^f7 Press &#39;a&#39; every 800ms for 1500 iterations
#f Random mouse wheel in IrfanView
!#f Continuous random wheel
!#g Random wheel with delay (1-1000ms)
!#h Random wheel with delay (1-6000ms)
!#j Random wheel (up to 3000)
appskey &amp;amp; &#39; Run or restart HomeSafe View
appskey &amp;amp; &#92; Run ChatSounds script
appskey &amp;amp; = Download ChatSounds
!#v Open random Max 8 patcher
!#, Open random Renoise project
!#u Open random Max gen file
!#b Open random Max 8 help patcher
!#i Open random Max 8 example patcher
!#f7 Send random Bible verse
!#3 Send random BIP 39 word
#b Open random ebook
!Capslock Open random URL in Brave and log
!+z Search random album on Amazon Music
!+x Open random Dave video
!+c Open random Vancity video
!+v Open random Ben video
!+b Open random C++ video
^!c Open random chess article and log
!3 Open random Terry 2017 video
!4 Open random Terry 2017b video
!5 Open random Terry 2018 video
!7 Copy random endgame FEN to clipboard
#c Run yt-dlp
#0 Run yt-dlp with subtitles
#z Run yt-dlp and open in mpv
!#c Run yt-dlp with -f 18 
#/ Download Newgrounds audio
^+c Run wget
#v Paste clipboard in quotes in ConEmu 
^f1 Ping and open Starlink stats
!f9 Play random sound in Sven Co-op
^+!0 Say random Bible verse in Sven Co-op
^+!9 Play random scientist line in Sven Co-op
^!v Resize and move video players to secondary monitor
!9 Resize and move Agent DVR to secondary monitor
f5 Resize and move video to Secondary Monitor

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
#InstallKeybdHook
#SingleInstance force
SetWorkingDir %A_ScriptDir%
#include group2.ahk
#include VA.ahk
#include VD.ahk
Menu, Tray, Icon, p.ico

; Functions
ChangeDisplayFrequency(Frequency) {
    VarSetCapacity(DEVMODE, 156, 0)
    NumPut(156, DEVMODE, 36, &amp;quot;UShort&amp;quot;)
    DllCall(&amp;quot;EnumDisplaySettingsA&amp;quot;, &amp;quot;Ptr&amp;quot;, 0, &amp;quot;UInt&amp;quot;, -1, &amp;quot;Ptr&amp;quot;, &amp;amp;DEVMODE)
    NumPut(0x400000, DEVMODE, 40)
    NumPut(Frequency, DEVMODE, 120, &amp;quot;UInt&amp;quot;)
    Return DllCall(&amp;quot;ChangeDisplaySettingsA&amp;quot;, &amp;quot;Ptr&amp;quot;, &amp;amp;DEVMODE, &amp;quot;UInt&amp;quot;, 0)
}

RunFoobar(cmd, path := &amp;quot;C:&#92;Program Files (x86)&#92;foobar2000&#92;foobar2000.exe&amp;quot;) {
    Run &amp;quot;%path%&amp;quot; &amp;quot;%cmd%&amp;quot;  ; Use quotes to ensure proper argument separation
    ; Sleep 1000
}

ToggleWindow(exe1, exe2) {
    IfWinActive % &amp;quot;ahk_exe &amp;quot; exe1
        WinActivate % &amp;quot;ahk_exe &amp;quot; exe2
    else
        WinActivate % &amp;quot;ahk_exe &amp;quot; exe1
}

OpenOrActivate(path, title, maximize := 1) {
    IfWinExist %title%
        WinActivate %title%
    else {
        Run %path%
        WinWait %title%
        if (maximize)
            WinMaximize
    }
}

RunRandom(file, prefix := &amp;quot;Run&amp;quot;, suffix := &amp;quot;&amp;quot;, browser := &amp;quot;&amp;quot;) {
    FileRead, content, %file%
    if (ErrorLevel) {
        MsgBox, Could not read %file%
        return
    }
    Sort, content, Random
    line := Trim(SubStr(content, 1, InStr(content, &amp;quot;`r&amp;quot;) - 1))
    if (line = &amp;quot;&amp;quot;) {
        MsgBox, No valid content found in %file%
        return
    }
    if (prefix = &amp;quot;Send&amp;quot;) {
        Send %line%%suffix%
    } else {
        if (browser != &amp;quot;&amp;quot;) {
            fullCmd := browser . &amp;quot; &amp;quot;&amp;quot;&amp;quot; . line . &amp;quot;&amp;quot;&amp;quot;&amp;quot;
        } else {
            fullCmd := prefix . &amp;quot; &amp;quot; . line . suffix
        }
        Run %fullCmd%, , UseErrorLevel
        if (ErrorLevel) {
            MsgBox, Failed to run: %fullCmd%
        }
    }
}

SendCmd(console, cmd, clip := 0) {
    IfWinNotExist %console%
        return
    WinActivate %console%
    WinWaitActive %console%, , 2
    if (ErrorLevel)
        return
    Sleep 200
    Send %cmd%
    if (clip)
        Send %Clipboard%
    Send {Enter}
}

SendTime(fmt) {
    FormatTime, time, A_Now, %fmt%
    Send %time%
}

; Autoexecute GUI
Gui -Caption
Gui Add, ListView,, HOTKEY|COMMENT
for i, e in Hotkeys(Hotkeys)
    LV_Add(&amp;quot;&amp;quot;, e.Hotkey, e.Comment)
LV_ModifyCol()

; Hotkeys with comments
#Insert:: ; Suspend all hotkeys
    Suspend
    return

; Preserve default MButton behavior only when not combined with XButton2
MButton::
    Send {MButton down}
    return

MButton Up::
    Send {MButton up}
    return

MButton &amp;amp; XButton2:: ; Play random track in foobar2000
    if (GetKeyState(&amp;quot;MButton&amp;quot;, &amp;quot;P&amp;quot;)) {  ; Ensure MButton is still pressed
        RunFoobar(&amp;quot;/runcmd=Playback/Random&amp;quot;)
        Sleep 1
        Send {MButton up}
        Send {XButton2 up}
    }
    return

MButton &amp;amp; XButton2 Up:: ; Release MButton and XButton2
    Send {MButton up}
    Send {XButton2 up}
    return

XButton2 &amp;amp; MButton:: ; Play random track in foobar2000
    RunFoobar(&amp;quot;/runcmd=Playback/Random&amp;quot;)
    return

XButton2:: ; Send r key in browsers to refresh with Vimium
if WinActive(&amp;quot;ahk_exe firefox.exe&amp;quot;) or WinActive(&amp;quot;ahk_exe librewolf.exe&amp;quot;) or WinActive(&amp;quot;ahk_exe chrome.exe&amp;quot;) or WinActive(&amp;quot;ahk_exe brave.exe&amp;quot;) or WinActive(&amp;quot;ahk_exe msedge.exe&amp;quot;)
    send, r
else
IfWinActive, ahk_exe ConEmu64.exe
{
    Send, {Alt Up}{Shift Up}{ctrl Up}{lwin up}
    sleep, 10
    WinActivate ahk_exe mintty.exe
    return
}
else
{
    Send, {Alt Up}{Shift Up}{ctrl Up}{lwin up}
    sleep, 10
    WinActivate ahk_exe ConEmu64.exe
    return
}
return

MButton &amp;amp; XButton1:: ; Toggle between Firefox and Pale Moon
    ToggleWindow(&amp;quot;firefox.exe&amp;quot;, &amp;quot;palemoon.exe&amp;quot;)
    return

^MButton:: ; Play random track
    RunFoobar(&amp;quot;/runcmd=Playback/Random&amp;quot;)
    return

MButton &amp;amp; XButton1 Up::
    return

^!WheelUp:: ; Set volume to 0 dB
    RunFoobar(&amp;quot;/runcmd=Playback/Volume/Set to -0 dB&amp;quot;)
    return

^!WheelDown:: ; Set volume to -12 dB
    RunFoobar(&amp;quot;/runcmd=Playback/Volume/Set to -12 dB&amp;quot;)
    return

+f9:: ; Play/pause alternate foobar2000
    Run &amp;quot;D:&#92;foobar2000b&#92;foobar2000.exe&amp;quot; &amp;quot;/playpause&amp;quot;
    return

f9:: ; Play/pause main foobar2000
    RunFoobar(&amp;quot;/playpause&amp;quot;)
    return

f10:: ; Previous track in foobar2000
    RunFoobar(&amp;quot;/prev&amp;quot;)
    return

f11:: ; Next track in foobar2000
    RunFoobar(&amp;quot;/next&amp;quot;)
    return

!6:: ; Toggle Discord Rich Presence in foobar2000
    RunFoobar(&amp;quot;/runcmd=View/Display Discord Rich Presence&amp;quot;)
    return

^XButton2:: ; Play random track
    RunFoobar(&amp;quot;/runcmd=Playback/Random&amp;quot;)
    return

+Volume_Down:: ; Seek back 1 second
    RunFoobar(&amp;quot;/runcmd=Playback/Seek/&amp;quot;&amp;quot;Back by 1 second&amp;quot;&amp;quot;&amp;quot;)
    return

+Volume_Up:: ; Seek ahead 1 second
    RunFoobar(&amp;quot;/runcmd=Playback/Seek/&amp;quot;&amp;quot;Ahead by 1 second&amp;quot;&amp;quot;&amp;quot;)
    return

^Volume_Down:: ; Seek back 10 seconds
    RunFoobar(&amp;quot;/runcmd=Playback/Seek/&amp;quot;&amp;quot;Back by 10 seconds&amp;quot;&amp;quot;&amp;quot;)
    return

^Volume_Up:: ; Seek ahead 10 seconds
    RunFoobar(&amp;quot;/runcmd=Playback/Seek/&amp;quot;&amp;quot;Ahead by 10 seconds&amp;quot;&amp;quot;&amp;quot;)
    return

appskey &amp;amp; b:: ; Toggle between Betterbird and Thunderbird
    ToggleWindow(&amp;quot;betterbird.exe&amp;quot;, &amp;quot;thunderbird.exe&amp;quot;)
    return

appskey &amp;amp; p:: ; Toggle between Notepad++ and VSCodium
    ToggleWindow(&amp;quot;notepad++.exe&amp;quot;, &amp;quot;VSCodium.exe&amp;quot;)
    return

appskey &amp;amp; 9:: ; Toggle between WinSCP and FileZilla
    ToggleWindow(&amp;quot;WinSCP.exe&amp;quot;, &amp;quot;filezilla.exe&amp;quot;)
    return

XButton1:: ; Toggle between Renoise and Ableton
    ToggleWindow(&amp;quot;renoise.exe&amp;quot;, &amp;quot;Ableton Live 11 Suite.exe&amp;quot;)
    return

numpaddiv:: ; Toggle between foobar2000 and ConEmu
    ToggleWindow(&amp;quot;foobar2000.exe&amp;quot;, &amp;quot;ConEmu64.exe&amp;quot;)
    return

numpadmult:: ; Toggle between foobar2000 and Firefox
    ToggleWindow(&amp;quot;foobar2000.exe&amp;quot;, &amp;quot;firefox.exe&amp;quot;)
    return

appskey &amp;amp; ,:: ; Activate main foobar2000
    WinActivate ahk_exe C:&#92;Program Files (x86)&#92;foobar2000&#92;foobar2000.exe
    return

appskey &amp;amp; .:: ; Activate alternate foobar2000
    WinActivate ahk_exe D:&#92;foobar2000b&#92;foobar2000.exe
    return

appskey &amp;amp; /:: ; Activate third foobar2000 instance
    WinActivate ahk_exe D:&#92;foobar2000c&#92;foobar2000.exe
    return

+NumpadAdd:: ; Activate Renoise
    WinActivate ahk_class Renoise
    return

+NumpadDiv:: ; Activate PHP book
    WinActivate Learning PHP
    return

+NumpadSub:: ; Activate SunVox
    WinActivate ahk_class SunDogEngine
    return

+NumpadMult:: ; Set 280Hz and activate Sven Co-op
    ChangeDisplayFrequency(280)
    Sleep 100
    WinActivate Sven Co-op
    return

appskey &amp;amp; n:: ; Toggle or tab QOwnNotes
    IfWinActive ahk_exe QOwnNotes.exe
        SendInput !{Tab}
    else
        WinActivate ahk_exe QOwnNotes.exe
    Send {Alt Up}{Shift Up}{Ctrl Up}{LWin Up}
    Sleep 100
    return

appskey &amp;amp; f:: ; Toggle or tab Firefox
    IfWinActive ahk_exe firefox.exe
        SendInput !{Tab}
    else
        WinActivate ahk_exe firefox.exe
    Send {Alt Up}{Shift Up}{Ctrl Up}{LWin Up}
    Sleep 100
    return

appskey &amp;amp; u:: ; Toggle or tab SumatraPDF
    IfWinActive ahk_exe SumatraPDF.exe
        SendInput !{Tab}
    else
        WinActivate ahk_exe SumatraPDF.exe
    Send {Alt Up}{Shift Up}{Ctrl Up}{LWin Up}
    Sleep 100
    return

appskey &amp;amp; r:: ; Toggle or tab Renoise
    IfWinActive ahk_exe renoise.exe
        SendInput !{Tab}
    else
        WinActivate ahk_exe renoise.exe
    Send {Alt Up}{Shift Up}{Ctrl Up}{LWin Up}
    Sleep 100
    return

appskey &amp;amp; m:: ; Toggle or tab BowPad
    IfWinActive ahk_exe BowPad.exe
        SendInput !{Tab}
    else
        WinActivate ahk_exe BowPad.exe
    Send {Alt Up}{Shift Up}{Ctrl Up}{LWin Up}
    Sleep 100
    return

appskey &amp;amp; z::
appskey &amp;amp; j::
    if VA_GetDeviceName(VA_GetDevice()) != &amp;quot;Analog (1+2) (2- RME ADI-2 Pro)&amp;quot;
        VA_SetDefaultEndpoint(&amp;quot;Analog (1+2) (2- RME ADI-2 Pro)&amp;quot;, 0), Sleep 10
    Loop, d:&#92;vid&#92;*
    {
        FileGetTime, Time, %A_LoopFileFullPath%, C
        if (Time &amp;gt; Time_Orig)
            Time_Orig := Time, File := A_LoopFileName
    }
    Run, mpv.exe --speed=1.50 --af=dynaudnorm &amp;quot;d:&#92;vid&#92;%File%&amp;quot;
    Sleep 2000
    WinMove, ahk_exe mpv.exe,, -1083, -4, 1083, 640
    return

appskey &amp;amp; k:: ; Toggle or tab KeePass
    IfWinActive ahk_exe KeePass.exe
        SendInput !{Tab}
    else
        WinActivate ahk_exe KeePass.exe
    Send {Alt Up}{Shift Up}{Ctrl Up}{LWin Up}
    Sleep 100
    return

appskey &amp;amp; i:: ; Toggle or tab Raspberry Pi console
    IfWinActive pi@raspberrypi: ~
        SendInput !{Tab}
    else
        WinActivate pi@raspberrypi: ~
    Send {Alt Up}{Shift Up}{Ctrl Up}{LWin Up}
    Sleep 100
    return

appskey &amp;amp; v:: ; Open or activate Videos folder
    OpenOrActivate(&amp;quot;D:&#92;vid&amp;quot;, &amp;quot;Videos&amp;quot;)
    return

appskey &amp;amp; q:: ; Open or activate Pictures folder
    OpenOrActivate(&amp;quot;D:&#92;windows&#92;Pictures&amp;quot;, &amp;quot;Pictures&amp;quot;)
    return

#IfWinNotActive ahk_group ESC

!Numpad1:: ; Switch to virtual desktop 1
    VD.goToDesktopNum(1)
    return

!Numpad2:: ; Switch to virtual desktop 2
    VD.goToDesktopNum(2)
    return

!Numpad3:: ; Switch to virtual desktop 3
    VD.goToDesktopNum(3)
    return

!Numpad4:: ; Switch to virtual desktop 4
    VD.goToDesktopNum(4)
    return

!#k:: ; Get ffmpeg converted podcast from VPS
    clip := Clipboard
    StringTrimRight, OutputVar, clip, 15
    Send gp
    Send {Space}
    SendInput %OutputVar%
    return

Launch_App2:: ; Placeholder for custom application launch
    return

Launch_Media:: ; Placeholder for custom media launch
    return

!#PrintScreen:: ; Capture screenshot and paste in PaintDotNet with Alt + Win + PrintScreen
    Send {PrintScreen}
    Run &amp;quot;C:&#92;Program Files&#92;paint.net&#92;PaintDotNet.exe&amp;quot;
    WinWait ahk_exe PaintDotNet.exe
    Send ^v
    Send {Enter}
    return

#PgDn:: ; Get current weather
    Clipboard := &amp;quot;&amp;quot;
    Run C:&#92;Users&#92;sb&#92;AppData&#92;Local&#92;Programs&#92;Python&#92;Python311&#92;pythonw.exe d:/rex/test/weather2023.py
    SplashImage,, B w%A_ScreenWidth% h%A_ScreenHeight% cwBlack NA
    Sleep 50
    SplashImage, off
    return

!#PgDn:: ; Get current weather (double star)
    Clipboard := &amp;quot;&amp;quot;
    Run C:&#92;Users&#92;sb&#92;AppData&#92;Local&#92;Programs&#92;Python&#92;Python311&#92;pythonw.exe d:/rex/test/weather2023winterdoublestar.py
    SplashImage,, B w%A_ScreenWidth% h%A_ScreenHeight% cwBlack NA
    Sleep 50
    SplashImage, off
    return

^#PgDn:: ; Get current weather (unformatted, Burnaby)
    Clipboard := &amp;quot;&amp;quot;
    Run C:&#92;Users&#92;sb&#92;AppData&#92;Local&#92;Programs&#92;Python&#92;Python39&#92;pythonw.exe d:/rex/test/printweather.py
    SplashImage,, B w%A_ScreenWidth% h%A_ScreenHeight% cwBlack NA
    Sleep 50
    SplashImage, off
    return

#PgUp:: ; Get system info
    Clipboard := &amp;quot;&amp;quot;
    Run D:&#92;bat&#92;sysinfochate.ahk
    return

!#PgUp:: ; Get system info (double star)
    Clipboard := &amp;quot;&amp;quot;
    Run D:&#92;bat&#92;sysinfochatedoublestar.ahk
    return

^F2:: ; Get parent window info
    ID := DllCall(&amp;quot;GetParent&amp;quot;, UInt, WinExist(&amp;quot;A&amp;quot;))
    ID := !ID ? WinExist(&amp;quot;A&amp;quot;) : ID
    WinGetClass, Class, ahk_id %ID%
    WinGetTitle, Title, ahk_id %ID%
    MsgBox, 0, %ID%, %Title%`n%Class%
    return

^F5:: ; Resize and move YouTube chat to secondary monitor
    WinGetTitle, ActiveWindowTitle, A
    WinMove, %ActiveWindowTitle%,, -1080, -337, 1080, 971
    return

; #!n:: 

; #!8:: 

; #!9:: 

^!u:: ; Send &#39;u&#39; to Wikipedia
    SetTitleMatchMode 2
    ControlSend,, {u down}, Wikipedia
    Sleep 5
    ControlSend,, {u up}, Wikipedia
    SetTitleMatchMode 1
    return

^!j:: ; Send &#39;j&#39; to Wikipedia
    SetTitleMatchMode 2
    ControlSend,, {j down}, Wikipedia
    Sleep 5
    ControlSend,, {j up}, Wikipedia
    SetTitleMatchMode 1
    return

^#!Left:: ; Move window to previous virtual desktop
    VD.MoveWindowToRelativeDesktopNum(&amp;quot;A&amp;quot;, -1)
    return

^#!Right:: ; Move window to next virtual desktop
    VD.MoveWindowToRelativeDesktopNum(&amp;quot;A&amp;quot;, 1)
    return

!NumpadSub:: ; Set display frequency to 60Hz
    ChangeDisplayFrequency(60)
    return

!f1:: ; Set display frequency to 60Hz
    ChangeDisplayFrequency(60)
    return

!NumpadAdd:: ; Set display frequency to 280Hz
    ChangeDisplayFrequency(280)
    return

!f2:: ; Set display frequency to 280Hz
    ChangeDisplayFrequency(280)
    return

^#F12:: ; Toggle GUI visibility
    Toggle := !Toggle
    if (Toggle) {
        Gui Show, x0 y0
    } else {
        Gui Destroy
    }
    return

+^p:: ; Copy active Explorer path to clipboard
    Clipboard := GetActiveExplorerPath()
    return

#^f9:: ; Write hotkey list to D:&#92;bat&#92;keys.txtc
    FileDelete D:&#92;bat&#92;keys.txt
    for i, e in Hotkeys(Hotkeys)
        FileAppend % e.Hotkey &amp;quot; &amp;quot; e.Comment &amp;quot;`n&amp;quot;, D:&#92;bat&#92;keys.txt
    SoundBeep
    return

^!NumpadAdd:: ; Set High Performance mode
    Run C:&#92;Windows&#92;System32&#92;powercfg.exe /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
    TrayTip, Power Control, High Performance mode CHECK SPEAKERS, 20, 17
    return

#!NumpadAdd:: ; Set Balanced mode and run HomeSafe View
    Run C:&#92;Windows&#92;System32&#92;powercfg.exe /setactive 381b4222-f694-41f0-9685-ff5bb260df2e
    FileAppend `n%A_YYYY%-%A_MM%-%A_DD% %A_Hour%:%A_Min%:%A_Sec% balanced`n, power.txt
    Process, Exist, HomeSafe View.exe
    if !ErrorLevel
        Run &amp;quot;C:&#92;Program Files (x86)&#92;swann&#92;HomeSafe View&#92;HomeSafe View.exe&amp;quot;
    TrayTip, Power Control, Balanced mode CHECK SPEAKERS, 20, 17
    return

!#m:: ; Close HomeSafe View, set Power Saver mode, and turn off monitors
    Process, Close, HomeSafe View.exe
    Sleep 2000
    FileAppend `n%A_YYYY%-%A_MM%-%A_DD% %A_Hour%:%A_Min%:%A_Sec% lower`n, power.txt
    Run C:&#92;Windows&#92;System32&#92;powercfg.exe /setactive a1841308-3541-4fab-bc81-f71556f20b4a
    Sleep 1000
    SendMessage 0x112, 0xF170, 2, , Program Manager
    return

#m:: ; Turn off monitors
    Sleep 1000
    SendMessage 0x112, 0xF170, 2, , Program Manager
    return

^!f11:: ; Process clipboard and write to ChatSoundsnewFR.txt
    words := [&amp;quot;buhbye&amp;quot;, &amp;quot;faggot2&amp;quot;, &amp;quot;fuckoff&amp;quot;, &amp;quot;byebye&amp;quot;, &amp;quot;goodbye&amp;quot;, &amp;quot;mbye&amp;quot;, &amp;quot;buhbye&amp;quot;, &amp;quot;bbye!&amp;quot;, &amp;quot;bye!&amp;quot;, &amp;quot;baibai!&amp;quot;, &amp;quot;stfu&amp;quot;, &amp;quot;mstfu&amp;quot;, &amp;quot;stfu!&amp;quot;, &amp;quot;stfu10s&amp;quot;, &amp;quot;stfub&amp;quot;, &amp;quot;fatbitch&amp;quot;, &amp;quot;uglymf&amp;quot;, &amp;quot;urugly&amp;quot;, &amp;quot;retardalert&amp;quot;, &amp;quot;retard2&amp;quot;, &amp;quot;retard&amp;quot;, &amp;quot;urfamilyknows&amp;quot;]
    for i, w in words
        Clipboard := StrReplace(Clipboard, w, &amp;quot;&amp;quot;)
    Clipboard := RegExReplace(RegExReplace(Clipboard, &amp;quot;&#92;t&amp;quot;, &amp;quot;&amp;quot;), &amp;quot; +&amp;quot;, &amp;quot; &amp;quot;)
    Clipboard := StrReplace(Clipboard, &amp;quot;!&amp;quot;, &amp;quot;{!}&amp;quot;)
    Loop {
        Clipboard := StrReplace(Clipboard, &amp;quot;`r`n`r`n&amp;quot;, &amp;quot;`r`n&amp;quot;, Count)
        if (Count = 0)
            Break
    }
    FileOpen(&amp;quot;D:&#92;bat&#92;game&#92;ChatSoundsnewFR.txt&amp;quot;, &amp;quot;w&amp;quot;).Write(Clipboard).Close()
    Run &amp;quot;C:&#92;cygwin64&#92;bin&#92;mintty.exe&amp;quot; -i /Cygwin-Terminal.ico -e /usr/bin/bash /cygdrive/d/bat/csfix.sh
    return

^+!d:: ; Paste full timestamp
    SendTime(&amp;quot;dddd MMM dd, yyyy hh:mm:ss tt&amp;quot;)
    return

!#t:: ; Paste compact timestamp
    SendTime(&amp;quot;yyyy MM/dd HH:mm:s&amp;quot;)
    return

!#y:: ; Paste date
    SendTime(&amp;quot;yyyy MM dd&amp;quot;)
    return

!2:: ; Paste hyphenated date
    SendTime(&amp;quot;yyyy-MM-dd&amp;quot;)
    return

^+!f:: ; Paste date without time
    SendTime(&amp;quot;dddd MMM dd, yyyy&amp;quot;)
    return

^+!h:: ; Paste time and day
    FormatTime, t, A_Now, hh:mm tt dddd
    Send last modified %t%
    return

^+!g:: ; Paste formatted ChatSounds notice
    FormatTime, t, A_Now, dddd MMM dd, yyyy hh:mm tt
    Send last modified %t% EDT (UTC-4){Enter}The majority of these ChatSounds are user submitted and do not Reflect the Views of Bsmesh KING{Enter}Disk space is limited, consider donating if you submit a ton of ChatSounds https://kingsc.net/donate
    return

!#r:: ; Paste Reddit RSS feed
    Send https://www.reddit.com/r/%Clipboard%
    return

f7:: ; Copy Edge URL and title
    WinGetActiveTitle, t
    url := GetURL(&amp;quot;Edge&amp;quot;)
    Clipboard := t &amp;quot; https://&amp;quot; url
    StringTrimRight, Clipboard, Clipboard, 8
    return

!f3:: ; Ignore JOINS PARTS QUITS NICKS for irssi channel name in Clipboard
    Send /ignore -channels {#}^+{Insert} * JOINS PARTS QUITS NICKS
    return

!w:: ; Wrap clipboard in double quotes
    Send ^x
    Sleep 100
    ClipWait
    Clipboard := &amp;quot;&amp;quot;&amp;quot;&amp;quot; Clipboard &amp;quot;&amp;quot;&amp;quot;&amp;quot;
    Sleep 100
    ClipWait
    Send ^v
    return

^+!v:: ; Wrap clipboard in single quotes
    Clipboard := &amp;quot;&#39;&amp;quot; Clipboard &amp;quot;&#39;&amp;quot;
    Sleep 100
    ClipWait
    Send ^v
    return

^+!b:: ; Wrap clipboard in double quotes
    Clipboard := &amp;quot;&amp;quot;&amp;quot;&amp;quot; Clipboard &amp;quot;&amp;quot;&amp;quot;&amp;quot;
    Sleep 100
    ClipWait
    Send ^v
    return

^+!f12:: ; Empty Recycle Bin
    FileRecycleEmpty
    TrayTip, Recycle Bin, Bin emptied, 20, 17
    return

appskey &amp;amp; 2:: ; Open Sound settings
    OpenOrActivate(&amp;quot;mmsys.cpl&amp;quot;, &amp;quot;Sound&amp;quot;, 0)
    return

^#t:: ; Toggle AlwaysOnTop
    WinSet AlwaysOnTop, Toggle, A
    SplashImage,, B w%A_ScreenWidth% h%A_ScreenHeight% cwBlack NA
    Sleep 50
    SplashImage, off
    return

^+v:: ; Remove newlines from clipboard
    StringReplace, Clipboard, Clipboard, `r`n, , All
    Send ^v
    return

^!#pause:: ; Block keyboard and mouse input
    BlockInput on
    return

appskey &amp;amp; pause:: ; Unblock input
    BlockInput off
    Send {Alt Up}{Shift Up}{Ctrl Up}{LWin Up}
    return

^f7:: ; Press &#39;a&#39; every 800ms for 1500 iterations
    Loop 1500 {
        Send a
        Sleep 800
    }
    return

#f:: ; Random mouse wheel in IrfanView
    Random, r, 1, 658
    Random, t, 0, 1
    WinActivate ahk_class IrfanView
    WinWaitActive ahk_class IrfanView
    if (t = 1)
        Click WheelDown %r%
    else
        Click WheelUp %r%
    return

!#f:: ; Continuous random wheel
    Loop {
        Random, r, 1, 658
        Random, t, 0, 1
        WinActivate ahk_class IrfanView
        WinWaitActive ahk_class IrfanView
        if (t = 1)
            Click WheelDown %r%
        else
            Click WheelUp %r%
    }
    return

!#g:: ; Random wheel with delay (1-1000ms)
    Loop {
        Random, r, 1, 658
        Random, s, 1, 1000
        Random, t, 0, 1
        WinActivate ahk_class IrfanView
        WinWaitActive ahk_class IrfanView
        if (t = 1)
            Click WheelDown %r%
        else
            Click WheelUp %r%
        Sleep %s%
    }
    return

!#h:: ; Random wheel with delay (1-6000ms)
    Loop {
        Random, r, 1, 658
        Random, s, 1, 6000
        Random, t, 0, 1
        WinActivate ahk_class IrfanView
        WinWaitActive ahk_class IrfanView
        if (t = 1)
            Click WheelDown %r%
        else
            Click WheelUp %r%
        Sleep %s%
    }
    return

!#j:: ; Random wheel (up to 3000)
    Loop {
        Random, r, 1, 3000
        Random, s, 1, 6000
        Random, t, 0, 1
        WinActivate ahk_class IrfanView
        WinWaitActive ahk_class IrfanView
        if (t = 1)
            Click WheelDown %r%
        else
            Click WheelUp %r%
        Sleep %s%
    }
    return

appskey &amp;amp; &#39;:: ; Run or restart HomeSafe View
    Process, Exist, HomeSafe View.exe
    if ErrorLevel {
        Process, Close, HomeSafe View.exe
        Sleep 100
        Run &amp;quot;C:&#92;Program Files (x86)&#92;swann&#92;HomeSafe View&#92;HomeSafe View.exe&amp;quot;
    } else {
        Run &amp;quot;C:&#92;Program Files (x86)&#92;swann&#92;HomeSafe View&#92;HomeSafe View.exe&amp;quot;
    }
    return

appskey &amp;amp; &#92;:: ; Run ChatSounds script
    Run &amp;quot;C:&#92;cygwin64&#92;bin&#92;mintty.exe&amp;quot; -i /Cygwin-Terminal.ico -h always -e /usr/bin/bash -l /cygdrive/d/bat/chatsoundsopilNuk.sh
    return

appskey &amp;amp; =:: ; Download ChatSounds
    Run &amp;quot;C:&#92;cygwin64&#92;bin&#92;mintty.exe&amp;quot; -i /Cygwin-Terminal.ico -e /usr/bin/bash -l /cygdrive/d/bat/game/chatsoundscyg.sh,, Hide
    SoundBeep
    return

!#v:: ; Open random Max 8 patcher
    RunRandom(&amp;quot;maxmsp.txt&amp;quot;)
    return

!#,:: ; Open random Renoise project
    RunRandom(&amp;quot;renoise.txt&amp;quot;)
    return

!#u:: ; Open random Max gen file
    RunRandom(&amp;quot;maxgen.txt&amp;quot;)
    return

!#b:: ; Open random Max 8 help patcher
    RunRandom(&amp;quot;maxhelp.txt&amp;quot;)
    return

!#i:: ; Open random Max 8 example patcher
    RunRandom(&amp;quot;maxexample.txt&amp;quot;)
    return

!#f7:: ; Send random Bible verse
    RunRandom(&amp;quot;bible4.txt&amp;quot;, &amp;quot;Send&amp;quot;)
    return

!#3:: ; Send random BIP 39 word
    RunRandom(&amp;quot;english.txt&amp;quot;, &amp;quot;Send&amp;quot;)
    return

#b:: ; Open random ebook
    RunRandom(&amp;quot;pdf.txt&amp;quot;)
    return

!Capslock:: ; Open random URL in Brave and log
    RunRandom(&amp;quot;rand.txt&amp;quot;, &amp;quot;Run&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&amp;quot;C:&#92;Program Files&#92;BraveSoftware&#92;Brave-Browser&#92;Application&#92;brave.exe&amp;quot;&amp;quot;&amp;quot;)
    SetTitleMatchMode 2
    Sleep 2000
    braveUrl := GetURL(&amp;quot;Brave&amp;quot;)
    if (braveUrl)
        FileAppend, `n%A_YYYY%-%A_MM%-%A_DD% %A_Hour%:%A_Min%:%A_Sec%`n%braveUrl%`n, his.txt
    SetTitleMatchMode 1
    return

!+z:: ; Search random album on Amazon Music
    FileRead, content, albums2.txt
    Sort, content, Random
    line := Trim(SubStr(content, 1, InStr(content, &amp;quot;`r&amp;quot;) - 1))
    Run &amp;quot;C:&#92;Program Files&#92;Mozilla Firefox&#92;firefox.exe&amp;quot; &amp;quot;https://music.amazon.ca/search/%line%&amp;quot;
    return

!+x:: ; Open random Dave video
    RunRandom(&amp;quot;dave.txt&amp;quot;, &amp;quot;Run&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&amp;quot;C:&#92;Program Files&#92;BraveSoftware&#92;Brave-Browser&#92;Application&#92;brave.exe&amp;quot;&amp;quot;&amp;quot;)
    return

!+c:: ; Open random Vancity video
    RunRandom(&amp;quot;van.txt&amp;quot;, &amp;quot;Run&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&amp;quot;C:&#92;Program Files&#92;BraveSoftware&#92;Brave-Browser&#92;Application&#92;brave.exe&amp;quot;&amp;quot;&amp;quot;)
    return

!+v:: ; Open random Ben video
    RunRandom(&amp;quot;ben.txt&amp;quot;, &amp;quot;Run&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&amp;quot;C:&#92;Program Files&#92;BraveSoftware&#92;Brave-Browser&#92;Application&#92;brave.exe&amp;quot;&amp;quot;&amp;quot;)
    return

!+b:: ; Open random C++ video
    RunRandom(&amp;quot;randc++.txt&amp;quot;, &amp;quot;Run&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&amp;quot;C:&#92;Program Files&#92;BraveSoftware&#92;Brave-Browser&#92;Application&#92;brave.exe&amp;quot;&amp;quot;&amp;quot;)
    return

^!c:: ; Open random chess article and log
    RunRandom(&amp;quot;chess2.txt&amp;quot;, &amp;quot;Run&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&amp;quot;C:&#92;Program Files&#92;BraveSoftware&#92;Brave-Browser&#92;Application&#92;brave.exe&amp;quot;&amp;quot;&amp;quot;)
    SetTitleMatchMode 2
    Sleep 2000
    braveUrl := GetURL(&amp;quot;Brave&amp;quot;)
    if (braveUrl)
        FileAppend, `n%A_YYYY%-%A_MM%-%A_DD% %A_Hour%:%A_Min%:%A_Sec%`n%braveUrl%`n, his.txt
    SetTitleMatchMode 1
    return

!3:: ; Open random Terry 2017 video
    RunRandom(&amp;quot;terry2017.txt&amp;quot;)
    SetWorkingDir D:&#92;Terry A. Davis - TempleOS Archive&#92;videos&#92;2017
    SetWorkingDir %A_ScriptDir%
    return

!4:: ; Open random Terry 2017b video
    RunRandom(&amp;quot;terry2017b.txt&amp;quot;)
    SetWorkingDir D:&#92;Terry A. Davis - TempleOS Archive&#92;videos&#92;2017
    SetWorkingDir %A_ScriptDir%
    return

!5:: ; Open random Terry 2018 video
    RunRandom(&amp;quot;terry2018.txt&amp;quot;)
    SetWorkingDir D:&#92;Terry A. Davis - TempleOS Archive&#92;videos&#92;2018
    SetWorkingDir %A_ScriptDir%
    return

!7:: ; Copy random endgame FEN to clipboard
    FileRead, content, endgame.txt
    Sort, content, Random
    line := Trim(SubStr(content, 1, InStr(content, &amp;quot;`r&amp;quot;) - 1))
    Clipboard := line
    return

#c:: ; Run yt-dlp
    SendCmd(&amp;quot;/cygdrive/d/vid ahk_class VirtualConsoleClass&amp;quot;, &amp;quot;y&amp;quot;)
    return

#0:: ; Run yt-dlp with subtitles
    SendCmd(&amp;quot;/cygdrive/d/vid ahk_class VirtualConsoleClass&amp;quot;, &amp;quot;ys&amp;quot;)
    return

#z:: ; Run yt-dlp and open in mpv
    SendCmd(&amp;quot;/cygdrive/d/vid ahk_class VirtualConsoleClass&amp;quot;, &amp;quot;yz&amp;quot;)
    return

!#c:: ; Run yt-dlp with -f 18 
    SendCmd(&amp;quot;/cygdrive/d/vid ahk_class VirtualConsoleClass&amp;quot;, &amp;quot;yt&amp;quot;)
    return

#/:: ; Download Newgrounds audio
    SendCmd(&amp;quot;/cygdrive/d/ng ahk_class VirtualConsoleClass&amp;quot;, &amp;quot;yn&amp;quot;)
    return

^+c:: ; Run wget
    SendCmd(&amp;quot;/cygdrive/d/apps ahk_class VirtualConsoleClass&amp;quot;, &amp;quot;wg&amp;quot;)
    return

#v:: ; Paste clipboard in quotes in ConEmu 
    SendCmd(&amp;quot;/cygdrive/d/vid ahk_class VirtualConsoleClass&amp;quot;, &amp;quot;v&amp;quot;, 1)
    return

^f1:: ; Ping and open Starlink stats
    SendCmd(&amp;quot;ahk_class VirtualConsoleClass&amp;quot;, &amp;quot;g&amp;quot;)
    Run http://dishy.starlink.com/statistics
    return

!f9:: ; Play random sound in Sven Co-op
    RunRandom(&amp;quot;spk.txt&amp;quot;, &amp;quot;Send&amp;quot;, &amp;quot; as_command .s_player_exec @all spk &amp;quot;)
    return

^+!0:: ; Say random Bible verse in Sven Co-op
    RunRandom(&amp;quot;bible4.txt&amp;quot;, &amp;quot;Send&amp;quot;, &amp;quot; as_command .s_admin_say 0 1 &amp;quot;&amp;quot;&amp;quot;&amp;quot; &amp;quot;&amp;quot;&amp;quot;&amp;quot; 8 @all 255 0 255 -1 -1&amp;quot;)
    Send {Enter}
    return

^+!9:: ; Play random scientist line in Sven Co-op
    RunRandom(&amp;quot;sci.txt&amp;quot;, &amp;quot;Send&amp;quot;, &amp;quot; .s_player_exec @all &amp;quot;&amp;quot;spk &amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;)
    Send {Enter}
    return

^!v:: ; Resize and move video players to secondary monitor
    WinMove ahk_exe mpv.exe,, -1083, 88, 1083, 640
    WinMove ahk_exe vlc.exe,, -1083, 88, 1083, 640
    WinMove &amp;quot;Picture in picture&amp;quot;,, -1083, 88, 1083, 640
    return

!9:: ; Resize and move Agent DVR to secondary monitor
    SetTitleMatchMode 2
    WinMove &amp;quot;Agent: Agent DVR - Chromium&amp;quot;,, -1083, 478, 1080, 1001
    SetTitleMatchMode 1
    return

f5:: ; Resize and move video to Secondary Monitor
WinMove, ahk_exe mpv.exe,, -1083, -4, 1083, 640
WinMove, ahk_exe vlc.exe,, -1083, -4, 1083, 640
WinMove, ahk_exe webcamoid.exe,, -1083, -4, 1083, 640
WinMove, Picture in picture,, -1083, -4, 1083, 640
WinMove, Picture-in-Picture,, -1083, -4, 1083, 640
WinMove, ahk_exe sunvox.exe,, -1087, -378, 1088, 1010
WinMove, Mixer,, -1087, 626, 1088, 833
WinMove, Instrument Editor,, -1087, -202, 1088, 833
SetTitleMatchMode, 2
WinMove, Agent: Agent DVR - Chromium,, -1083, 478, 1080, 1001
WinMove, youtube.com/live_chat,, -1085, -418, 1086, 431
SetTitleMatchMode, 1
return

; Supporting Functions
GetActiveExplorerPath() {
    explorerHwnd := WinActive(&amp;quot;ahk_class CabinetWClass&amp;quot;)
    if (explorerHwnd) {
        for window in ComObjCreate(&amp;quot;Shell.Application&amp;quot;).Windows
            if (window.hwnd = explorerHwnd)
                return window.Document.Folder.Self.Path
    }
}

Hotkeys(ByRef Hotkeys) {
    FileRead, Script, %A_ScriptFullPath%
    Script := RegExReplace(Script, &amp;quot;ms`a)^&#92;s*/&#92;*.*?^&#92;s*&#92;*/&#92;s*|^&#92;s*&#92;(.*?^&#92;s*&#92;)&#92;s*&amp;quot;)
    Hotkeys := {}
    Loop, Parse, Script, `n, `r
        if RegExMatch(A_LoopField, &amp;quot;^&#92;s*(.*):`:.*`;&#92;s*(.*)&amp;quot;, Match)
            Hotkeys.Push({&amp;quot;Hotkey&amp;quot;: Match1, &amp;quot;Comment&amp;quot;: Match2})
    return Hotkeys
}

GetURL(wTitle*) {
    if !(wId := WinExist(wTitle*))
        return
    IUIAutomation := ComObjCreate(&amp;quot;{ff48dba4-60ef-4201-aa87-54103eef594e}&amp;quot;, &amp;quot;{30cbe57d-d9d0-452a-ab13-7ac5ac4825ee}&amp;quot;)
    DllCall(NumGet(NumGet(IUIAutomation+0)+6*A_PtrSize), &amp;quot;ptr&amp;quot;, IUIAutomation, &amp;quot;ptr&amp;quot;, wId, &amp;quot;ptr*&amp;quot;, elementMain)
    NumPut(addressbarStrPtr := DllCall(&amp;quot;oleaut32&#92;SysAllocString&amp;quot;, &amp;quot;wstr&amp;quot;, &amp;quot;Address and search bar&amp;quot;, &amp;quot;ptr&amp;quot;), (VarSetCapacity(addressbar, 8+2*A_PtrSize)+NumPut(8, addressbar, 0, &amp;quot;short&amp;quot;))*0+&amp;amp;addressbar, 8, &amp;quot;ptr&amp;quot;)
    DllCall(&amp;quot;oleaut32&#92;SysFreeString&amp;quot;, &amp;quot;ptr&amp;quot;, addressbarStrPtr)
    DllCall(NumGet(NumGet(IUIAutomation+0)+23*A_PtrSize), &amp;quot;ptr&amp;quot;, IUIAutomation, &amp;quot;int&amp;quot;, 30005, &amp;quot;ptr&amp;quot;, &amp;amp;addressbar, &amp;quot;ptr*&amp;quot;, addressbarCondition)
    DllCall(NumGet(NumGet(elementMain+0)+5*A_PtrSize), &amp;quot;ptr&amp;quot;, elementMain, &amp;quot;int&amp;quot;, 0x4, &amp;quot;ptr&amp;quot;, addressbarCondition, &amp;quot;ptr*&amp;quot;, currentURLElement)
    DllCall(NumGet(NumGet(currentURLElement+0)+10*A_PtrSize), &amp;quot;ptr&amp;quot;, currentURLElement, &amp;quot;uint&amp;quot;, 30045, &amp;quot;ptr&amp;quot;, (VarSetCapacity(currentURL, 8+2*A_PtrSize)+NumPut(0, currentURL, 0, &amp;quot;short&amp;quot;)+NumPut(0, currentURL, 8, &amp;quot;ptr&amp;quot;))*0+&amp;amp;currentURL)
    ObjRelease(currentURLElement)
    ObjRelease(elementMain)
    ObjRelease(IUIAutomation)
    return StrGet(NumGet(currentURL, 8, &amp;quot;ptr&amp;quot;), &amp;quot;utf-16&amp;quot;)
}

&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Sun, 06 Dec 2020 19:00:00 -0500</pubDate>
      <dc:creator>Steven Baker</dc:creator>
      <guid>https://sbmesh.com/blog/posts/2020-12-07-autohotkey-ahk-power-control-script-etc/</guid>
    </item>
  </channel>
</rss>