Counter-Strike 1.6 Discord Bot

Announcing: A Smart Two-Way Bridge for Counter-Strike 1.6 and Discord!

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?

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.

What It Does: The Key Features

This isn’t just a simple log-dumper. It’s a smart bridge designed to be useful, not noisy.

  • Smart Human Detection: This is the best part. The bot stays quiet and suppresses all server messages (like map changes or bot-only kills) when the server is empty. As soon as the first human player joins, 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!
  • Two-Way Chat: Messages from Discord are sent directly into the in-game chat. In-game messages (
    say
    and
    say_team
    ) are relayed to Discord, complete with team icons (🔵/🔴) and even a tombstone emoji (🪦) if the player is dead.
  • Full Game Event Reporting: Get real-time updates for all important events:
    • Kills:
      Player A killed Player B with an awp 💥
    • Joins/Leaves:
      👋 Player C joined the server
    • Bomb Events:
      💣 The bomb has been planted!
    • Round/Win Events:
      🔄 Round started!
      or
      🔴 Terrorists Win! (CT 5, T 2)
  • GeoIP Player Flags: 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 🏳️.

How It Works

The bot is built on two simple principles:

  1. UDP Log Listener: You configure your CS 1.6 server to send its logs in real-time to the bot (using the
    logaddress_add
    command). The bot listens on a port (default:
    800
    8), parses these logs, and formats them for Discord.
  2. Asynchronous RCON Client: When a user types a message in your Discord channel, the bot uses RCON (the server’s remote-control protocol) to send a
    say
    command to the game, broadcasting the message to all players.

How to Set Up Your Own Bridge

Ready to try it? You’ll need a server (a simple VPS or even a home machine) to run the Python script.

Step 1: Get the Script & Install Dependencies

First, save the Python code above as

cs_discord_bridge.py
.

You’ll need Python 3 installed. Then, install the required Python libraries using pip:

Bash


pip install discord.py geoip2 tomli

(Note:

tomli
is used as a fallback for
tomllib
on Python versions older than 3.11).

Step 2: Get the GeoIP Database

For the country flag feature, you need to download the free GeoLite2 Country database from MaxMind.

  1. Go to the MaxMind GeoLite2 free database page and sign up.
  2. Download the “GeoLite2-Country” database (it will be a
    .mmdb
    file).
  3. Place this file (e.g.,
    GeoLite2-Country.mmdb
    ) on your server in a location the bot can access.

Step 3: Create Your
config.toml

Next, create a file named

config.toml
in the same directory as your Python script. This is where you’ll put all your settings.

Here is a template. You must fill in the required values.

Ini, TOML


# --- Required Settings ---

# Your Discord Bot Token (get from Discord Developer Portal)
discord_token = "YOUR_BOT_TOKEN_HERE"

# The ID of the Discord channel you want to bridge
discord_channel_id = "YOUR_CHANNEL_ID_HERE"

# Your Counter-Strike 1.6 server's IP or hostname
cs_host = "12.34.56.78"

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

# Your server's RCON password (from server.cfg)
cs_rcon_password = "YOUR_RCON_PASSWORD_HERE"

# --- Optional Settings ---

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

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

# 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 'true' 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 = "!"
  • To get a Bot Token: You need to create an “Application” in the Discord Developer Portal. Create a Bot, and be sure to enable the Message Content Intent under the “Bot” tab.
  • To get a Channel ID: In Discord, enable Developer Mode (Settings > Advanced), then right-click your channel and select “Copy ID”.

Step 4: Configure Your CS 1.6 Server

Now, tell your Counter-Strike server to send its logs to your bot.

Add the following line to your server’s

server.cfg
or
autoexec.cfg
. Replace
BOT_SERVER_IP
with the IP of the machine where your Python script is running, and make sure the port matches your
listen_port
from
config.toml
.


log on
logaddress_add BOT_SERVER_IP:8008

You will need to restart your server (or change maps) for this to take effect.

Step 5: Run the Bot!

You’re all set. Go to the directory with your script and config file and run:

Bash


python3 cs_discord_bridge.py

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!


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.

https://sbmesh.com/bot.py


#!/usr/bin/env python3
"""
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.
"""

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) -> str:
    if not cc or len(cc) != 2:
        return "🏳️"  # 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'\xFF\xFF\xFF\xFFgetchallenge\n'

        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(' ')[1].strip()
                    self.future.set_result(challenge)
                except (IndexError, UnicodeDecodeError) as e:
                    self.future.set_exception(ValueError(f"Invalid challenge response: {e}"))
                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"[{now_iso()}] RCON challenge request timed out.")
        except Exception as e:
            print(f"[{now_iso()}] [ERROR] Getting RCON challenge: {e}")
        return None

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

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

            message_buffer = BytesIO()
            message_buffer.write(b'\xFF\xFF\xFF\xFF')
            message_buffer.write('rcon '.encode())
            message_buffer.write(challenge.encode())
            message_buffer.write(b' ')
            message_buffer.write(self.password.encode())
            message_buffer.write(b' ') # New line
            message_buffer.write(command.encode()) # New line
            message_buffer.write(b'\n')

            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"[{now_iso()}] Sent RCON command: {command}")
            except asyncio.TimeoutError:
                print(f"[{now_iso()}] RCON command timed out.")
            except Exception as e:
                print(f"[{now_iso()}] [ERROR] Sending RCON command: {e}")

# --- Regexes ---
HL_SAY_REGEXES = [
    re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)>" say "(.*)"(?: \(dead\))?$'),
    re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)>" say_team "(.*)"(?: \(dead\))?$'),
]

CONNECT_REGEX = re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)>" connected, address "(.+?):(\d+)"$')

JOIN_LEAVE_REGEXES = [
    re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)>" entered the game$'),
    re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)>" disconnected(?: \(reason "(.*?)"\))?$'),
    re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)>" joined team "(.*)"$'),
]

KILL_REGEX = re.compile(
    r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)>" killed "(.+?)<\d+><(.*?)><(.*?)>" with "(.*?)"(?: \(headshot\))?$'
)

SUICIDE_REGEXES = [
    re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)>" committed suicide with "(.*?)"$'),
    re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)>" killed self with "(.*?)"$'),
]

BOMB_REGEX = re.compile(
    r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)>" triggered "(Spawned_With_The_Bomb|Dropped_The_The_Bomb|Got_The_Bomb|Planted_The_Bomb)"'
)

TEAM_BOMB_REGEX = re.compile(
    r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: Team "(CT|TERRORIST)" triggered "(Bomb_Defused|Target_Bombed)" \(CT "(\d+)"\) \(T "(\d+)"\)'
)

STEAM_VALIDATE_REGEX = re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)>" STEAM USERID validated$')

RCON_REGEX = re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: Rcon: "rcon (.+)" from "(.+)"$')

MAPCHANGE_REGEX = re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: Started map "(.+)" \(CRC ".+"')

STARTED_MAP_REGEX = re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: Started map "(.+?)"')

ROUND_START_REGEX = re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: World triggered "Round_Start"$')
ROUND_END_REGEX = re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: World triggered "Round_End"$')
TEAM_WIN_REGEX = re.compile(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: Team "(CT|TERRORIST)" triggered "(CTs_Win|Terrorists_Win)" \(CT "(\d+)"\) \(T "(\d+)"\)$')

def now_iso():
    return datetime.datetime.now().astimezone().isoformat(timespec="seconds")

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('utf-8', errors='replace').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("discord_prefix", "!"), intents=intents)
        self.channel: Optional[discord.TextChannel] = None

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

        self.connected_players = {}
        self.has_human_player = False
        self.allow_bot_messages = cfg.get("allow_bot_messages", 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["cs_host"],
            int(self.cfg["cs_port"]),
            self.cfg["cs_rcon_password"]
        )

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

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

    async def _send_startup_commands(self):
        print(f"[{now_iso()}] Sending RCON command to disable chat prefixes...")
        await self.rcon_client.send_command('amx_chat_prefix ""')
        await self.rcon_client.send_command('cs_chat_prefix ""')
        await self.rcon_client.send_command('sv_say_prefix ""')

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

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

        content = self._sanitize_discord(message.content)
        author = message.author.display_name
       
        line = f'say (DISCORD) {author}: {content}'
        print(f"[{now_iso()}] [DEBUG] Processing Discord message: {line} (has_human_player={self.has_human_player})")
        await self._send_rcon_say(line)

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

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

        # Strip potential garbage prefixes like ����log
        cleaned_line = line
        if line.startswith('\ufffd\ufffd\ufffd\ufffdlog'):
            cleaned_line = line[8:].strip()
            print(f"[{now_iso()}] Stripped garbage prefix, cleaned log: {cleaned_line}")

        log_start_match = re.search(r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}:', cleaned_line)
        if not log_start_match:
            print(f"[{now_iso()}] Unmatched log (no valid start): {cleaned_line}")
            if "connected, address" in cleaned_line and self._parse_connected(cleaned_line):
                return
            return

        cleaned_line = cleaned_line[log_start_match.start():].strip()
        print(f"[{now_iso()}] Cleaned log: {cleaned_line}")

        map_change = self._parse_mapchange(cleaned_line)
        if map_change:
            print(f"[{now_iso()}] Detected map change: {map_change}. Storing for later.")
            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"[{now_iso()}] Parsed join/leave: {joinleave} (has_human_player={self.has_human_player})")
            await self._post_to_discord(joinleave)
            return

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

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

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

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

        if ROUND_START_REGEX.search(cleaned_line):
            payload = "🔄 Round started!"
            print(f"[{now_iso()}] Parsed round start: {payload} (has_human_player={self.has_human_player})")
            self.suppress_join_messages = False
            await self._post_to_discord(payload)
            return
           
        if ROUND_END_REGEX.search(cleaned_line):
            payload = "🏁 Round ended!"
            print(f"[{now_iso()}] Parsed round end: {payload} (has_human_player={self.has_human_player})")
            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 == "CT":
                payload = f"🔵 **Counter-Terrorists Win!** (CT {ct_score}, T {t_score})"
            else:
                payload = f"🔴 **Terrorists Win!** (CT {ct_score}, T {t_score})"
            print(f"[{now_iso()}] Parsed team win: {payload} (has_human_player={self.has_human_player})")
            await self._post_to_discord(payload)
            return
           
        print(f"[{now_iso()}] Unmatched log: {cleaned_line} (has_human_player={self.has_human_player})")

    def _parse_mapchange(self, line: str) -> Optional[str]:
        m_mapchange = re.compile(
            r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: -------- Mapchange to (.+?) --------$'
        ).search(line)
        m_started_map = re.compile(
            r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: Started map "(.+?)"'
        ).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"🔄 Map changed to `{map_name}`"
            else:
                print(f"[{now_iso()}] Suppressing mapchange announcement ({map_name}) — no human players were online.")
                return None

        return None

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

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

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

            flag = "🏳️"
            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"[{now_iso()}] GeoIP lookup for {name} ({steamid}, IP {ip}): country code '{country_code}' -> flag '{flag}'")
                    else:
                        print(f"[{now_iso()}] [WARN] No country code found for IP {ip}")
                except Exception as e:
                    print(f"[{now_iso()}] [ERROR] GeoIP lookup failed for IP {ip}: {e}")
            else:
                print(f"[{now_iso()}] [ERROR] GeoIP reader not initialized for {name} ({steamid})")
           
            self.player_flags[steamid] = flag
            print(f"[{now_iso()}] Assigned flag code for {name} ({steamid}): '{country_code or 'None'}' -> '{flag}'")
            print(f"[{now_iso()}] [DEBUG] GeoIP database path: {self.cfg.get('geoip_db', '/home/csserver/discord/GeoLite2-Country.mmdb')}")
            print(f"[{now_iso()}] [DEBUG] Player flags dictionary: {self.player_flags}")
            return True
        else:
            print(f"[{now_iso()}] [DEBUG] CONNECT_REGEX failed to match: {line}")
        return False

    def _parse_join_leave(self, line: str) -> Optional[str]:
        # Ignore raw connection lines like:  " from "64.188.91.127:53453"
        if ' from "' in line:
            print(f"[{now_iso()}] Ignoring connection info line: {line.strip()}")
            return None

        entered_the_game_regex = re.compile(
            r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)?>" entered the game$'
        )

        m = entered_the_game_regex.search(line)
        if m:
            name, steamid, team = m.groups()[:3]
            if steamid == "BOT":
                self.player_flags[steamid] = "🤖"
                print(f"[{now_iso()}] Stored flag for {name} ({steamid}): 🤖")
                print(f"[{now_iso()}] Ignoring bot join message for {name}.")
                return None
        entered_the_game_regex = re.compile(
            r'L \d{2}/\d{2}/\d{4} - \d{2}:\d{2}:\d{2}: "(.+?)<\d+><(.*?)><(.*?)?>" entered the game$'
        )

        m = entered_the_game_regex.search(line)
        if m:
            name, steamid, team = m.groups()[:3]
            if steamid == "BOT":
                self.player_flags[steamid] = "🤖"
                print(f"[{now_iso()}] Stored flag for {name} ({steamid}): 🤖")
                print(f"[{now_iso()}] Ignoring bot join message for {name}.")
                return None
           
            if self.suppress_join_messages:
                print(f"[{now_iso()}] Suppressing join message for {name} ({steamid}) during map change.")
                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, "🏳️")
            if flag == "🏳️" and steamid != "BOT":
                print(f"[{now_iso()}] [WARN] No flag found for {name} ({steamid}), attempting GeoIP lookup")
                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"[{now_iso()}] Fallback GeoIP lookup for {name} ({steamid}, IP {ip}): country code '{country_code}' -> flag '{flag}'")
                            else:
                                print(f"[{now_iso()}] [WARN] No country code found for IP {ip} in fallback lookup")
                        except Exception as e:
                            print(f"[{now_iso()}] [ERROR] Fallback GeoIP lookup failed for IP {ip}: {e}")
            print(f"[{now_iso()}] Human player joined: {name} ({steamid}), flag={flag}, has_human_player={self.has_human_player}")
            return f'👋 {flag} `{name}` joined the server'

        for rx in JOIN_LEAVE_REGEXES:
            m = rx.search(line)
            if m:
                if "disconnected" in line:
                    name, steamid, _, reason = m.groups()
                    if steamid == "BOT":
                        print(f"[{now_iso()}] Ignoring bot leave message for {name}.")
                        return None
                   
                    if self.suppress_join_messages:
                        print(f"[{now_iso()}] Suppressing leave message for {name} ({steamid}) during map change window")
                        if steamid in self.connected_players:
                            del self.connected_players[steamid]
                        return None
                   
                    name = self._sanitize_name(name)
                    flag = self.player_flags.get(steamid, "🏳️")
                    leave_message = f'❌ {flag} `{name}` left the server' + (f' ({reason})' if reason else '')
                    if steamid in self.connected_players:
                        del self.connected_players[steamid]
                        if not any(sid != "BOT" for sid in self.connected_players):
                            self.has_human_player = False
                            print(f"[{now_iso()}] No human players remain, has_human_player={self.has_human_player}")
                    print(f"[{now_iso()}] Human player left: {name} ({steamid}), flag={flag}, has_human_player={self.has_human_player}")
                    return leave_message
                elif "joined team" in line:
                    name, steamid, team, _ = m.groups()
                    if steamid == "BOT":
                        self.player_flags[steamid] = "🤖"
                        print(f"[{now_iso()}] Stored flag for {name} ({steamid}): 🤖")
                        print(f"[{now_iso()}] Ignoring bot joined team message.")
                        return None
                    self.has_human_player = True
                    print(f"[{now_iso()}] Human detected in joined team: {name} ({steamid}), has_human_player={self.has_human_player}")
                    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 = "say_team" in rx.pattern or "say_team" in line
                name = self._sanitize_name(name)
                msg = self._sanitize_cs(msg)
                flag = self.player_flags.get(steamid, "🤖" if steamid == "BOT" else "🏳️")
                if steamid != "BOT":
                    self.has_human_player = True
                    print(f"[{now_iso()}] Human detected in say: {name} ({steamid}), has_human_player={self.has_human_player}")
                team_icon = "🔵" if team.upper().startswith("CT") else "🔴" if team.upper().startswith("T") else "⚪"
                dead_indicator = " 🪦" if "(dead)" in line else ""
                payload = f'💬 {flag} {team_icon} `{name}`{dead_indicator}: {msg}'
                return True, team_flag, payload
        return False, False, None

    def _parse_kill(self, line: str) -> 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 == "BOT" and victim_id == "BOT":
            print(f"[{now_iso()}] Ignoring kill message (bot killed bot).")
            return None

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

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

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

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

        return f'{killer_flag} {killer_team_icon} `{killer_name}` killed {victim_flag} {victim_team_icon} `{victim_name}` with {article} *{weapon}*{headshot}'

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

    def _parse_bomb(self, line: str) -> 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, "🤖" if steamid == "BOT" else "🏳️")
            if steamid != "BOT":
                self.has_human_player = True
                print(f"[{now_iso()}] Human detected in bomb event: {name} ({steamid}), has_human_player={self.has_human_player}")
            if event == "Planted_The_Bomb":
                return '💣 *The bomb has been planted!*'
        m = TEAM_BOMB_REGEX.search(line)
        if m:
            team, event, ct_score, t_score = m.groups()
            if event == "Bomb_Defused":
                return '💣 *The bomb has been defused!*'
            elif event == "Target_Bombed":
                return '💣 *Target successfully bombed!*'
        return None

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

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

    def _sanitize_discord(self, s: str) -> str:
        s = s.replace('"', '').strip()
        return ''.join(ch for ch in s if 31 < ord(ch) < 127)

    def _sanitize_cs(self, s: str) -> str:
        s = s.replace('"', "'")
        return ''.join(ch for ch in s if 31 < ord(ch) < 127)

    def _sanitize_name(self, s: str) -> str:
        s = s.strip()
        if len(s) > 24:
            s = s[:23] + "…"
        return self._sanitize_cs(s)

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

def load_config(path: str) -> dict:
    try:
        with open(path, "rb") as f:
            cfg = tomllib.load(f)
    except Exception as e:
        print(f"[{now_iso()}] [ERROR] Failed to load config {path}: {e}")
        raise SystemExit(f"Failed to load config: {e}")
    required = ["discord_token", "discord_channel_id", "cs_host", "cs_port", "cs_rcon_password"]
    for key in required:
        if key not in cfg:
            print(f"[{now_iso()}] [ERROR] Missing required config key: {key}")
            raise SystemExit(f"Missing required config key: {key}")
    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("CSBRIDGE_CONFIG", "config.toml")
    try:
        asyncio.run(amain(cfg_path))
    except KeyboardInterrupt:
        print(f"[{now_iso()}] Exiting...")
    except Exception as e:
        print(f"[{now_iso()}] [ERROR] Fatal error: {e}")

if __name__ == "__main__":
    main()

linux firefox Open With addon python script that works with Brave and Librewolf

https://addons.mozilla.org/en-US/firefox/addon/open-with


#!/usr/bin/env python
from __future__ import print_function

import os
import sys
import json
import struct
import subprocess

VERSION = '7.1b2'

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('@I', rawLength)[0]
        message = sys.stdin.buffer.read(messageLength).decode('utf-8')
        return json.loads(message)

    # Send an encoded message to stdout
    def sendMessage(messageContent):
        encodedContent = json.dumps(messageContent).encode('utf-8')
        encodedLength = struct.pack('@I', 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('@I', 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('@I', len(encodedContent))

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


def install():
    home_path = os.getenv('HOME')

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

    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 == 'firefox' or browser == 'librewolf':
                browser_manifest['allowed_extensions'] = ['openwith@darktrojan.net']
            else:
                browser_manifest['allowed_origins'] = [
                    'chrome-extension://cogjlncmljjnjpbgppagklanlcbchlno/',  # Chrome
                    'chrome-extension://fbmcaggceafhobjkhnaakhgfmdaadhhg/',  # Opera
                ]

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


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

            if line.startswith('Name='):
                name = line[5:].strip()
            elif line.startswith('Exec='):
                command = line[5:].strip()

        return {
            'name': name,
            'command': command
        }


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

    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 == 'ping':
        sendMessage({
            'version': VERSION,
            'file': os.path.realpath(__file__)
        })
    elif receivedMessage == 'find':
        sendMessage(find_browsers())
    else:
        for k, v in os.environ.items():
            if k.startswith('MOZ_'):
                try:
                    os.unsetenv(k)
                except:
                    os.environ[k] = ''

        devnull = open(os.devnull, 'w')
        subprocess.Popen(receivedMessage, stdout=devnull, stderr=devnull)
        sendMessage(None)


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

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

    print('Open With native helper, version %s.' % VERSION)

CDP 8 / Composers Desktop Project ARM64 aarch64 binaries Raspberry Pi etc

compiled on debian 12 with an orange pi 5

https://sbmesh.com/CDP8aarch64.zip

I’m using it with Renoise CDP Interface tool https://www.renoise.com/tools/cdp-interface

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.

abfdcode
abfpan
abfpan2
analjoin
asciiget
blur
bounce
brkdur
brktopi
brownian
caltrain
cantor
cascade
cdparams
cdparams_other
cdparse
ceracu
channelx
chanphase
chirikov
chorder
chxformat
clicknew
clip
columns
combine
constrict
convert_to_midi
copysfx
crumble
crystal
cubicspline
dirsf
diskspace
distcut
distmark
distmore
distort
distortt
distrep
distshift
dshift
dvdwind
envcut
envel
envnu
envspeak
extend
fastconv
features
filter
filtrage
fixgobo
flatten
flutter
fmdcode
focus
fofex
formants
fractal
fracture
frame
freeze
fturanal
gate
get_partials
getcol
glisten
gobo
gobosee
grain
grainex
hfperm
hilite
histconv
housekeep
hover
hover2
impulse
interlx
isolate
iterfof
iterline
iterlinef
listaudevs
listdate
logdate
madrid
manysil
matrix
maxsamp2
mchanpan
mchanrev
mchiter
mchshred
mchstereo
mchzig
modify
morph
motor
mton
multimix
multiosc
multisynth
newdelay
newmix
newmorph
newscales
newsynth
newtex
njoin
nmix
notchinvert
oneform
onset
packet
pagrab
pairex
panorama
paplay
partition
paudition
paview
pdisplay
peak
peakfind
peakiso
phase
phasor
pitch
pitchinfo
pmodify
prefix
progmach
psow
ptobrk
pulser
putcol
pview
pvoc
pvplay
quirk
recsf
refocus
rejoin
repair
repeater
repitch
retime
reverb
rmresp
rmsinfo
rmverb
rotor
scramble
search
selfsim
sfecho
sfedit
sfprops
shifter
shrink
silend
smooth
sndinfo
sorter
spacedesign
spec
specanal
specav
specenv
specfnu
specfold
specgrids
specinfo
speclean
specnu
specross
specsphinx
spectrum
spectstr
spectune
spectwin
speculate
specvu
spike
spin
splinter
strands
strange
strans
stretch
stretcha
stutter
submix
subtract
superaccu
suppress
synfilt
synspline
synth
tangent
tapdelay
tesselate
texmchan
texture
tkusage
tkusage_other
topantail2
tostereo
transit
tremenv
tremolo
ts
tsconvert
tunevary
tweet
unknot
vectors
verges
vuform
waveform
wrappage

desktop

my orange pi 5 that ive been using instead of my desktop pc. it is an arm64 singleboard computer with 16gb of ram

firefox + palemoon addons

incase my mountain of computers and hardddrives get destroyed

Firefox

Add custom search engine extension 4.2 true {af37054b-3ace-46a2-ac59-709e4412bec6}
Amazon.co.uk extension 1.9 true amazon@search.mozilla.org
Autofill extension 9.6.6 true {143f479b-4cb2-4d8c-8c31-ae8653bc6054}
Behind The Overlay extension 0.1.6 true jid1-Y3WfE7td45aWDw@jetpack
Bing extension 1.3 true bing@search.mozilla.org
Black New Tab extension 1.0.0 true {3c53fae8-7f6e-4c86-b595-43f97766b977}
Chambers (UK) extension 1.0 true chambers-en-GB@search.mozilla.org
Check4Change extension 2.2.3 true check4change-owner@mozdev.org
Close Tabs to the Left extension 1.0.0 true closetabstotheleft@parkerm.github.io
Context Search extension 4.1.6 true olivier.debroqueville@gmail.com
Cookie Quick Manager extension 0.5rc2 true {60f82f00-9ad5-4de5-b31c-b16a47c51558}
Dark Background and Light Text extension 0.7.6 true jid1-QoFqdK4qzUfGWQ@jetpack
Disconnect extension 20.3.1.1 true 2.0@disconnect.me
DownThemAll! extension 4.2.6 true {DDC359D1-844A-42a7-9AA1-88A850A938A8}
DuckDuckGo extension 1.1 true ddg@search.mozilla.org
eBay extension 1.3 true ebay@search.mozilla.org
Forecastfox (fix version) extension 4.26 true forecastfox@s3_fix_version
Forget Me Not – Forget cookies & other data extension 2.2.8 true forget-me-not@lusito.info
Google extension 1.1 true google@search.mozilla.org
Greasemonkey extension 4.11 true {e4a8a97b-f2ed-450b-b12d-ee082ba24781}
HTTPS Everywhere extension 2021.4.15 true https-everywhere-eff@eff.org
I don’t care about cookies extension 3.3.1 true jid1-KKzOGWgsW3Ao4Q@jetpack
ImageBlock extension 5.0 true imageblock@hemantvats.com
JavaScript Toggle On and Off extension 0.2.4 true {479f0278-2c34-4365-b9f0-1d328d0f0a40}
Nitter Instead extension 2.4 true {3fe116df-848d-4027-9ae8-b298d48eab20}
NoScript extension 11.2.11 true {73a6fe31-595d-460b-a920-fcc0f8843232}
Open Tabs Next to Current extension 2.0.14 true opentabsnexttocurrent@sblask
Open With extension 7.2.5 true openwith@darktrojan.net
QOwnNotes Web Companion extension 21.6.0 true WebCompanion@qownnotes.org
Random Bookmark extension 2.0.12 true random-bookmark@stevenaleong.com
Random Bookmark From Folder extension 2.1 true randombookmark@pikadudeno1.com
Referer Control extension 1.31 true {cde47992-8aa7-4206-9e98-680a2d20f798}
RSSPreview extension 3.15 true {7799824a-30fe-4c67-8b3e-7094ea203c94}
SingleFileZ extension 1.0.29 true {e4db92bc-3213-493d-bd9e-5ff2afc72da6}
Smart HTTPS extension 0.3.1 true {b3e677f4-1150-4387-8629-da738260a48e}
Stylus extension 1.5.19 true {7a7a4a92-a2a0-41d1-9fd7-1e92480d612d}
Tab Reloader (page auto refresh) extension 0.3.7 true jid0-bnmfwWw2w2w4e4edvcdDbnMhdVg@jetpack
uBlock Origin extension 1.37.0 true uBlock0@raymondhill.net
uMatrix extension 1.4.4 true uMatrix@raymondhill.net
UnLazy extension 8.0.6.28 true unlazy-alpha1@eladkarako.com
Update Scanner extension 4.4.0 true {c07d1a49-9894-49ff-a594-38960ede8fb9}
Video DownloadHelper extension 7.6.0 true {b9db16a4-6edc-47ec-a1f4-b86292ed211d}
Vimium C – All by Keyboard extension 1.90.2 true vimium-c@gdh1995.cn
Weather extension 5.0.9 true {a79a9c4c-9c3f-4bf4-9e58-6574cc0b7ecb}
Web Archives extension 2.1.0 true {d07ccf11-c0cd-4938-a265-2a4d6ad01189}
Wikipedia (en) extension 1.1 true wikipedia@search.mozilla.org
Work Offline extension 0.1.4 true {2936ba13-a63a-41cf-a4e5-79274a38379e}
Youtube Audio extension 0.0.2.5 true {580efa7

Add custom search engine extension 4.2 true {af37054b-3ace-46a2-ac59-709e4412bec6}
Add-ons Search Detection extension 2.0.0 true addons-search-detection@mozilla.com
Amazon.co.uk extension 1.9 true amazon@search.mozilla.org
Amazon.com extension 1.3 true amazondotcom@search.mozilla.org
Behind The Overlay extension 0.2.1 true jid1-Y3WfE7td45aWDw@jetpack
Bing extension 1.3 true bing@search.mozilla.org
Black New Tab extension 1.0.0 true {3c53fae8-7f6e-4c86-b595-43f97766b977}
Bypass Paywalls extension 1.7.9 true bypasspaywalls@bypasspaywalls
Chambers (UK) extension 1.0 true chambers-en-GB@search.mozilla.org
Check4Change extension 2.2.4 true check4change-owner@mozdev.org
Context Search extension 4.3.0 true olivier.debroqueville@gmail.com
Currency Converter extension 0.6.9 true {8499351e-6812-4751-9b57-cf16f69fecec}
Dark Background and Light Text extension 0.7.6 true jid1-QoFqdK4qzUfGWQ@jetpack
DuckDuckGo extension 1.1 true ddg@search.mozilla.org
eBay extension 1.3 true ebay@search.mozilla.org
Flagfox extension 6.1.49 true {1018e4d6-728f-4b20-ad56-37578a4de76b}
Forecastfox (fix version) extension 4.26 true forecastfox@s3_fix_version
Forget Me Not – Forget cookies & other data extension 2.2.8 true forget-me-not@lusito.info
Google extension 1.2 true google@search.mozilla.org
Greasemonkey extension 4.11 true {e4a8a97b-f2ed-450b-b12d-ee082ba24781}
I don’t care about cookies extension 3.3.8 true jid1-KKzOGWgsW3Ao4Q@jetpack
Nitter Instead extension 2.5.3 true {3fe116df-848d-4027-9ae8-b298d48eab20}
NoScript extension 11.4.4rc1 true {73a6fe31-595d-460b-a920-fcc0f8843232}
Old Reddit Redirect extension 1.6.0 true {9063c2e9-e07c-4c2c-9646-cfe7ca8d0498}
Open Tabs Next to Current extension 2.0.14 true opentabsnexttocurrent@sblask
Open With extension 7.2.6 true openwith@darktrojan.net
QOwnNotes Web Companion extension 22.2.3 true WebCompanion@qownnotes.org
Random Bookmark extension 2.1.0 true random-bookmark@stevenaleong.com
Random Bookmark From Folder extension 2.1 true randombookmark@pikadudeno1.com
Referer Control extension 1.31 true {cde47992-8aa7-4206-9e98-680a2d20f798}
RSSPreview extension 3.17 true {7799824a-30fe-4c67-8b3e-7094ea203c94}
Sidebery extension 4.10.0 true {3c078156-979c-498b-8990-85f7987dd929}
SingleFileZ extension 1.0.65 true {e4db92bc-3213-493d-bd9e-5ff2afc72da6}
Snap Links extension 3.1.11 true snaplinks@snaplinks.mozdev.org
Stylus extension 1.5.21 true {7a7a4a92-a2a0-41d1-9fd7-1e92480d612d}
Tab Reloader (page auto refresh) extension 0.3.7 true jid0-bnmfwWw2w2w4e4edvcdDbnMhdVg@jetpack
Tab Session Manager extension 6.11.1 true Tab-Session-Manager@sienori
uBlock Origin extension 1.42.0 true uBlock0@raymondhill.net
uMatrix extension 1.4.4 true uMatrix@raymondhill.net
Update Scanner extension 4.4.0 true {c07d1a49-9894-49ff-a594-38960ede8fb9}
Video DownloadHelper extension 7.6.0 true {b9db16a4-6edc-47ec-a1f4-b86292ed211d}
Vimium C – All by Keyboard extension 1.97.0 true vimium-c@gdh1995.cn
Weather extension 5.0.9 true {a79a9c4c-9c3f-4bf4-9e58-6574cc0b7ecb}
Wikipedia (en) extension 1.1 true wikipedia@search.mozilla.org
YouTube High Definition extension 85.0.0 true {7b1bf0b6-a1b9-42b0-b75d-252036438bdc}
Audio Equalizer extension 0.1.6 false {63d150c4-394c-4275-bc32-c464e76a891c}
auto-resume downloads extension 1.0.3 false {07a7e965-fa95-4c07-bc5e-b53930b002bb}
Autofill extension 10.3.2 false {143f479b-4cb2-4d8c-8c31-ae8653bc6054}
Certainly Something (Certificate Viewer) extension 1.2.3 false a2fff151f5ad0ef63cbd7e454e8907c1fa9cc32008f489178775570374f408a7@pokeinthe.io
ColorfulTabs extension 34.8 false {0545b830-f0aa-4d7e-8820-50a4629a56fe}
Cookie Quick Manager extension 0.5rc2 false {60f82f00-9ad5-4de5-b31c-b16a47c51558}
Dark New Tab extension 0.1.2 false {2fc113fc-f01e-427a-8c4a-07b8b2d92f26}
Dictionary Anywhere extension 1.1.0 false {e90f5de4-8510-4515-9f67-3b6654e1e8c2}
Disconnect extension 20.3.1.1 false 2.0@disconnect.me
DownThemAll! extension 4.3.1 false {DDC359D1-844A-42a7-9AA1-88A850A938A8}
Easy to RSS extension 0.2.0 false {45909d54-3dd5-4298-8bb0-8a8d27a333ff}
floccus bookmarks sync extension 4.12.0 false floccus@handmadeideas.org
Hexconverter extension 1.7.0 false {e593c8ed-ae74-4039-af09-dfe4ad243adb}
JavaScript Toggle On and Off extension 0.2.4 false {479f0278-2c34-4365-b9f0-1d328d0f0a40}
Kee – Password Manager extension 3.9.5 false keefox@chris.tomlinson
MetaMask extension 10.11.3 false webextension@metamask.io
Midnight Lizard extension 10.7.1 false {8fbc7259-8015-4172-9af1-20e1edfbbd3a}
Share Button for Facebook™ extension 63.0 false {d4e0dc9c-c356-438e-afbe-dca439f4399d}
SingleFile extension 1.19.35 false {531906d3-e22f-4a6c-a102-8057b88a1a63}
Tabliss extension 2.4.2 false extension@tabliss.io
Tabloc extension 0.8 false {60520222-6bbf-45dd-b547-3641ea9cd9cb}
TinEye Reverse Image Search extension 1.5.2 false tineye@ideeinc.com
Twitter to Nitter Redirect extension 1.0.4 false {806caba7-d957-45dd-a533-7cb334dc2a6c}
UnLazy extension 8.0.6.28 false unlazy-alpha1@eladkarako.com
User-Agent Switcher and Manager extension 0.4.7.1 false {a6c4a591-f1b2-4f03-b3ff-767e5bedf4e7}
Web Archives extension 3.1.0 false {d07ccf11-c0cd-4938-a265-2a4d6ad01189}
Work Offline extension 0.1.4 false {2936ba13-a63a-41cf-a4e5-79274a38379e}
Youtube Audio extension 0.0.2.5 false {580efa7d-66f9-474d-857a-8e2afc6b1181}

Palemoon

[TEST] Add to Search Bar 2.9 true add-to-searchbox@maltekraus.de
[TEST] Addon List Dumper (restartless) 0.2.1-signed.1-signed true addonListDumper@jetpack
[TEST] bug489729(Disable detach and tear off tab) 2.1.1-signed.1-signed true bug489729@alice0775
[TEST] Change Profile’s Window Icons To Aurora 1.1.0 true change-window-icon-aurora@makyen.foo
[TEST] Check4Change 1.9.8.3 true check4change-owner@mozdev.org
[TEST] ColorfulTabs 23.9.1-signed true {0545b830-f0aa-4d7e-8820-50a4629a56fe}
[TEST] CookieCuller 1.4.1-signed.1-signed true {99B98C2C-7274-45a3-A640-D9DF1A1C8460}
[TEST] CountdownClock 1.4.5.1-signed.1-signed true {19D3B002-1AD1-4a69-A5B3-AA98773DBB86}
[TEST] DictionarySearch 28.0.0.1-signed true {a0faa0a4-f1a7-4098-9a74-21efc3a92372}
[TEST] Disconnect 3.15.3.1-signed.1-signed true 2.0@disconnect.me
[TEST] DownThemAll! 3.0.8 true {DDC359D1-844A-42a7-9AA1-88A850A938A8}
[TEST] Foobar Controls 0.3.6.1-signed.1-signed true {F3281C6A-29E3-405D-BD66-614E70C0B6B9}
[TEST] Image-Show-Hide 0.2.8.1.1-signed.1-signed true {92A24891-BA14-4e89-9FFD-07FFBE4334EE}
[TEST] JS Switch 0.2.10.1-signed.1-signed true {88c7b321-2eb8-11da-8cd6-0800200c9a66}
[TEST] Norwell History Tools 3.1.0.2.1-signed.1-signed true norvel@history
[TEST] QuickNote 0.7.6 true {C0CB8BA3-6C1B-47e8-A6AB-1FAB889562D9}
[TEST] Random Bookmark From Folder 1.0.1.1-signed true randombookmark@pikadudeno1.com
[TEST] RefControl 0.8.17.1-signed.1-signed true {455D905A-D37C-4643-A9E2-F6FEFAA0424A}
[TEST] ReminderFox 2.1.6.3 true {ada4b710-8346-4b82-8199-5de2b400a6ae}
[TEST] Update Scanner 3.3.1 true {c07d1a49-9894-49ff-a594-38960ede8fb9}
[TEST] VimFx 0.5.10.1-signed true VimFx@akhodakivskiy.github.com
[TEST] Work Offline 2.2 true {761a54f1-8ccf-4112-9e48-dbf72adf6244}
Add Bookmark Helper 1.0.10 true abh2me@Off.JustOff
Advanced Night Mode 1.0.13 true AdvancedNightMode@Off.JustOff
Age Unlimiter for YouTube 1.0.2 true ageless-yt-me@Off.JustOff
CipherFox 4.2.0 true cipherfox@mkfly
Classic Add-ons Archive 2.0.3 true ca-archive@Off.JustOff
Context Search X 0.4.6.26 true contextsearch2@lwz.addons.mozilla.org
Cookie Masters 3.2.0 true {a04a71f3-ce74-4134-8f86-fae693b19e44}
Crush Those Cookies 1.4.0 true crush-those-cookies@wsdfhjxc
Dismiss The Overlay 1.0.7 true behind-the-overlay-me@Off.JustOff
Expose Noisy Tabs 1.1.1 true expose-noisy-tabs@wsdfhjxc
Greasemonkey for Pale Moon 3.31.4 true greasemonkeyforpm@janekptacijarabaci
Greedy Cache 1.2.3 true greedycache@Off.JustOff
Home Styler 2.0.0 true homestyle@lootyhoof-pm
I don’t care about cookies 3.3.1 true jid1-KKzOGWgsW3Ao4Q@jetpack
JSView Revive 2.1.8 true {55e5dab6-f1cc-11e6-8a72-4981b17b32b7}
Moon Tester Tool 2.1.4 true moonttool@Off.JustOff
MozArchiver 2.0.1 true mozarchiver@lootyhoof-pm
NoScript 5.0.6 true {73a6fe31-595d-460b-a920-fcc0f8843232}
NoSquint 2.2.2 true nosquint@me.ebonjaeger.com
Open With 6.8.6 true openwith@darktrojan.net
Pale Moon Locale Switcher 3.1 true pm-localeswitch@palemoon.org
Reader View 2.2.0 true {1111dd1e-dd02-4c30-956f-f23c44dfea8e}
Snap Links Plus 2.4.3 true snaplinks@snaplinks.mozdev.org
Speed Start 2.1.6 true SStart@Off.JustOff
Stylem 2.2.6 true {503a85e3-84c9-40e5-b98e-98e62085837f}
Tab Mix Plus 0.5.8.1 true {dc572301-7619-498c-a57d-39143191b318}
uBlock Origin 1.16.4.30 true uBlock0@raymondhill.net
uMatrix 1.0.0 true uMatrix@raymondhill.net
View Source In Tab 1.0.3 true vstab@Off.JustOff
[TEST] Random Agent Spoofer 0.9.5.5 false jid1-AVgCeF1zoVzMjA@jetpack
[TEST] Zoom Page 15.8 false zoompage@DW-dev
Auto-Sort Bookmarks 2.10.12 false sortbookmarks@bouanto
BarTab Tycho 4.0 false bartab@infernozeus
BetterPrivacy 1.77 false {d40f5e7b-d2cf-4856-b441-cc613eeffbe3}
Color My Tabs 2.2.0 false color-my-tabs@wsdfhjxc
Complete YouTube Saver 5.7.36.1 false {AF445D67-154C-4c69-A17B-7F392BCC36A3}
Flashblock 1.5.20 false {3d7eb24f-2740-49df-8937-200b1cc08f8a}
Forecastfox (fix version) 2.4.8 false forecastfox@s3_fix_version
HTTPS Everywhere 5.2.21 false https-everywhere@eff.org
Internote 3.0.2.1-signed.1-signed false {e3631030-7c02-11da-a72b-0800200c9a66}
Mozilla Archive Format 5.2.1 false {7f57cf46-4467-4c2d-adfa-0cba7c507e54}
NoteStruck 1.0.4 false notestruck@franklindm
PHP Developer Toolbar 3.0.5.1-signed.1-signed false php_dev_bar@php_dev_bar.org
Popup Dictionaries With Audio 3.0.0 false {efb0aee9-a019-4341-bbeb-11e1630492f3}
Prevent Tab Overflow 7.2 false noverflow@sdrocking.com
Reasy 0.0.14.1-signed.1-signed false {fcff419f-5bfb-40cd-b52c-8f55dc2d0511}
RequestPolicy 0.5.28.1-signed.1-signed false requestpolicy@requestpolicy.com
RightBar 0.5.1-signed.1-signed false rightbar@realmtech.net
Save All Images 1.0.7 false save-images-me@Off.JustOff
Translate This Page, Text, or Link 2.1.0 false {8701e193-7b0a-4871-b1f8-8f89857c46a1}
User Agent Switcher 0.7.3.1-signed.1-signed false {e968fc70-8f95-4ab9-9e79-304de2a71ee1}
YouTube Video Player Pop Out 49.0 false {00f7ab9f-62f4-4145-b2f9-38d579d639f6}
ηMatrix 4.4.9 false eMatrix@vannilla.org

weighted random ambient playlist hotkey for foobar2000

this one is nasty:


global arr := ["ambient", "ambient2", "ambient3", "ambient4", "ambient5", "ambient6", "ambient7", "ambient8", "randambient2", "randambient2"]
Random, oVar, 1, arr.MaxIndex()
rand := arr[oVar]
Run "D:\foobar2000\foobar2000.exe" /runcmd=File/Scheduler/%rand%

foo_scheduler actions:

ambient#
Set playback order to “Repeat (Playlist)”
Set active playlist “ambient”
Start playback from track #123456


randambient2
Set playback order to “Random”
Set active playlist “ambient”
Start playback
1 seconds delay
Next track
1 seconds delay
Set playback order to “Repeat (Playlist)”

Herbs and supplements I like taking.

Vitamins and Minerals

  1. Liposomal Vitamin C
    • Benefits: 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.
    • Note: Best for those needing high doses or with sensitive digestion.
  2. MegaFood Men’s One Daily – Men’s Multivitamin
    • Benefits: 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.
    • Note: Free of iron and calcium/magnesium to avoid absorption competition.
  3. Global Healing Selenium
    • Benefits: Antioxidant that supports thyroid function, immune health, and DNA synthesis. May reduce oxidative stress and support cardiovascular health.
    • Note: Deficiency is rare in well-balanced diets but critical in areas with low soil selenium.
  4. Global Healing Iodine
    • Benefits: Essential for thyroid hormone production, supporting metabolism, brain development, and energy levels. May improve cognitive function and detoxify halogens (e.g., fluoride, bromide).
    • Note: Deficiency is common in iodine-poor regions; excess can harm thyroid function.
  5. Thorne Vitamin B Complex
    • Benefits: 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.
    • Note: High-potency formulas benefit those with deficiencies or high stress.
  6. 5-MTHF (Methylfolate)
    • Benefits: 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.
    • Note: More bioavailable than folic acid for certain individuals.
  7. Liquid B12 in Vegetable Glycerin (Sublingual)
    • Benefits: Supports energy, red blood cell production, and neurological function. Sublingual form enhances absorption, ideal for those with B12 deficiency (e.g., vegans, older adults).
    • Note: Often used for pernicious anemia or low stomach acid.
  8. Vitamin E
    • Benefits: Fat-soluble antioxidant protecting cell membranes from oxidative damage. Supports skin health, immune function, and cardiovascular health. May reduce inflammation.
    • Note: Mixed tocopherols are preferred for broader benefits.
  9. Plant-Derived Zinc and Zinc Orotate
    • Benefits: Supports immune function, wound healing, DNA synthesis, and testosterone production. Zinc orotate may have better cellular uptake. Critical for taste, smell, and skin health.
    • Note: Deficiency common in vegetarians or those with poor diets.
  10. Vitamin D3 Liquid
    • Benefits: Enhances calcium absorption for bone health, supports immune function, and regulates mood. May reduce risk of infections and chronic diseases.
    • Note: Liquid form allows flexible dosing; deficiency common in low-sunlight areas.
  11. Vitamin K2
    • Benefits: Directs calcium to bones and teeth, preventing arterial calcification. Supports bone density and cardiovascular health. Works synergistically with vitamin D3.
    • Note: Found in fermented foods; supplementation useful for non-dietary sources.
  12. Emulsified Vitamin A
    • Benefits: Supports vision, immune function, skin health, and reproductive health. Acts as an antioxidant and aids gene expression.
    • Note: High doses can be toxic; emulsified form improves absorption.

Antioxidants and Anti-Inflammatory Compounds

  1. High Dose Astaxanthin + Lutein + Zeaxanthin
    • Benefits: Potent antioxidants supporting eye health (protecting retina from UV damage), skin health, and reducing inflammation. Astaxanthin may improve exercise recovery and cardiovascular health.
    • Note: High doses should be monitored to avoid side effects.
  2. Japanese Knotweed Trans-Resveratrol
    • Benefits: Antioxidant with anti-aging, cardiovascular, and anti-inflammatory properties. May improve insulin sensitivity and brain health.
    • Note: Bioavailability is low unless paired with enhancers like piperine.
  3. Global Healing Turmeric Extract
    • Benefits: Contains curcumin, a potent anti-inflammatory and antioxidant. Supports joint health, digestion, and brain function. May reduce risk of chronic diseases.
    • Note: Bioavailability improved with black pepper (piperine).
  4. Thorne Meriva-HP (Curcumin Phytosome)
    • Benefits: Highly bioavailable curcumin form for enhanced anti-inflammatory and antioxidant effects. Supports joint mobility, pain relief, and immune health.
    • Note: Superior absorption compared to standard turmeric.
  5. Alpha Lipoic Acid
    • Benefits: Universal antioxidant (water- and fat-soluble) that regenerates other antioxidants (e.g., vitamin C, E). Supports glucose metabolism, nerve health, and anti-aging.
    • Note: May benefit diabetics for neuropathy management.
  6. Quercetin
    • Benefits: Flavonoid with antioxidant, anti-inflammatory, and antihistamine properties. Supports immune health, heart health, and may enhance zinc uptake in cells.
    • Note: Found in onions, apples; supplements useful for allergies.
  7. N-Acetyl-L-Cysteine (NAC)
    • Benefits: Precursor to glutathione, a master antioxidant. Supports liver detox, respiratory health (mucus thinning), and immune function. May protect against oxidative stress.
    • Note: Useful for acetaminophen overdose and chronic lung conditions.
  8. CoQ10 or Ubiquinol
    • Benefits: Supports mitochondrial energy production, heart health, and antioxidant defense. Ubiquinol is the more bioavailable form. May reduce statin-related muscle pain.
    • Note: Levels decline with age; benefits cardiovascular patients.
  9. PQQ (Pyrroloquinoline Quinone)
    • Benefits: Promotes mitochondrial biogenesis, enhancing energy production and cognitive function. Antioxidant properties support brain and heart health.
    • Note: Emerging research; often paired with CoQ10.

Marine and Plant-Based Supplements

  1. Krill Oil
    • Benefits: Rich in omega-3s (EPA/DHA) and astaxanthin. Supports heart, brain, and joint health. More bioavailable than fish oil due to phospholipid content.
    • Note: Sustainable alternative to fish oil; may reduce cholesterol.
  2. Health Ranger Spirulina
    • Benefits: Nutrient-dense algae rich in protein, vitamins (B, K), minerals, and antioxidants (phycocyanin). Supports immune health, detoxification, and energy.
    • Note: Ensure sourced from clean waters to avoid contaminants.
  3. Health Ranger Chlorella
    • Benefits: Algae high in chlorophyll, vitamins, and minerals. Supports detox (binds heavy metals), immune health, and digestion. May improve cholesterol levels.
    • Note: Often paired with spirulina for complementary benefits.
  4. Organic Psyllium Husk
    • Benefits: Soluble fiber promoting bowel regularity, blood sugar control, and cholesterol reduction. Supports gut health as a prebiotic.
    • Note: Must be taken with ample water to prevent choking.
  5. Collagen Peptides
    • Benefits: Supports skin elasticity, joint health, and bone strength. May improve hair/nail growth and gut lining integrity.
    • Note: Sourced from bovine, marine, or chicken; benefits dose-dependent.
  6. Broccoli Sprouts
    • Benefits: High in sulforaphane, an antioxidant supporting detox, anti-cancer pathways, and brain health. May reduce inflammation.
    • Note: Fresh sprouts more potent than supplements.
  7. Sesame Seeds for Calcium
    • Benefits: Rich in bioavailable calcium for bone health, plus magnesium and zinc. Supports heart health and hormone balance.
    • Note: Whole seeds less digestible; use tahini or ground seeds.

Herbal and Botanical Extracts

  1. Full Spectrum Dandelion Extract
    • Benefits: Supports liver detox, digestion, and kidney function (diuretic). Rich in antioxidants, may reduce inflammation and blood sugar.
    • Note: Leaves, roots, and flowers have distinct benefits.
  2. Magnolia Bark Extract
    • Benefits: Contains honokiol and magnolol, with anti-anxiety, anti-inflammatory, and antioxidant effects. May support sleep, stress relief, and gut health.
    • Note: Potential interactions with sedatives; dose carefully.
  3. Pau D’arco Extract
    • Benefits: Antifungal, antibacterial, and anti-inflammatory properties. Supports immune health and may combat candida or infections.
    • Note: Limited human studies; traditionally used in South America.
  4. Elderberry Extract
    • Benefits: Rich in antioxidants (anthocyanins), supports immune function, and may reduce cold/flu duration. Anti-inflammatory and antiviral properties.
    • Note: Best taken at onset of symptoms.
  5. Milk Thistle
    • Benefits: Contains silymarin, supporting liver detox and regeneration. May protect against oxidative stress and improve insulin sensitivity.
    • Note: Useful for liver conditions or heavy alcohol use.
  6. Astragalus
    • Benefits: Adaptogen supporting immune function, heart health, and stress resilience. May enhance longevity and kidney function.
    • Note: Traditionally used in TCM; limited large-scale trials.
  7. Ginger
    • Benefits: Anti-inflammatory and anti-nausea properties. Supports digestion, immune health, and may reduce muscle pain or menstrual cramps.
    • Note: Fresh or dried forms effective; supplements standardized for gingerols.
  8. Cubeb Pepper
    • Benefits: Antimicrobial and antioxidant properties. Supports respiratory health, digestion, and may have anti-inflammatory effects.
    • Note: Less studied than black pepper; used in traditional medicine.
  9. Matcha Green Tea
    • Benefits: High in catechins (EGCG), an antioxidant supporting metabolism, brain health, and heart health. Provides calm energy via L-theanine.
    • Note: High-quality, ceremonial-grade matcha maximizes benefits.
  10. Cilantro (Heavy Metal Chelator)
    • Benefits: May bind heavy metals (e.g., mercury, lead) for detox. Rich in antioxidants, supports digestion, and has antimicrobial properties.
    • Note: Limited evidence for chelation; pairs with chlorella for detox.
  11. Organic Oregano Oil
    • Benefits: Potent antimicrobial (carvacrol, thymol) for infections, immune support, and gut health. May reduce inflammation and candida.
    • Note: Dilute to avoid irritation; short-term use recommended.

Mushroom Extracts

  1. Reishi, Shiitake, Cordyceps, Turkey Tail, Maitake, Chaga, Lion’s Mane
    • Benefits:
      • Reishi: Immune-modulating, anti-stress, supports liver and heart health.
      • Shiitake: Immune-boosting, supports cholesterol and heart health.
      • Cordyceps: Enhances energy, athletic performance, and lung function.
      • Turkey Tail: Immune support, potential anti-cancer properties (PSK, PSP).
      • Maitake: Supports immune health, blood sugar regulation.
      • Chaga: Antioxidant-rich, supports immune and skin health.
      • Lion’s Mane: Promotes neurogenesis, cognitive function, and mood.
    • Note: Dual-extracted (water + alcohol) forms maximize bioactive compounds.

Specialty Compounds

  1. Trimethylglycine (TMG)
    • Benefits: Supports methylation, reducing homocysteine levels for heart health. May enhance exercise performance and liver function.
    • Note: Often used with high-dose niacin or in NAFLD treatment.
  2. Glycine
    • Benefits: Amino acid supporting collagen production, sleep quality, and brain health. May reduce inflammation and improve insulin sensitivity.
    • Note: Found in bone broth; supplements useful for sleep.
  3. Silica
    • Benefits: Supports collagen formation, bone health, and connective tissue (skin, hair, nails). May improve joint flexibility.
    • Note: Derived from bamboo or horsetail; dietary sources include oats.
  4. C60 in Organic Olive Oil or MCT Oil
    • Benefits: Hypothesized to be a super-antioxidant, potentially extending lifespan and reducing oxidative stress. May support energy and inflammation control.
    • Note: Limited human studies; mostly animal research.
  5. Tru Niagen (Nicotinamide Riboside)
    • Benefits: Boosts NAD+ levels, supporting cellular repair, energy metabolism, and anti-aging. May improve brain and muscle function.
    • Note: Benefits most pronounced in older adults or NAD+ deficiency.
  6. MSM (Methylsulfonylmethane)
    • Benefits: Sulfur compound supporting joint health, reducing inflammation, and improving skin/hair health. May aid allergy relief.
    • Note: Often paired with glucosamine for arthritis.
  7. Glucosamine
    • Benefits: Supports cartilage repair and joint health, reducing osteoarthritis pain and stiffness. May improve skin hydration.
    • Note: Best as glucosamine sulfate; benefits vary by individual.
  8. Bromelain
    • Benefits: Pineapple-derived enzyme with anti-inflammatory and digestive benefits. May reduce swelling, aid recovery, and support sinus health.
    • Note: Best taken on an empty stomach for systemic effects.
  9. Allicin/Crushed Raw Garlic (Sit for 5 Minutes)
    • Benefits: Allicin has antimicrobial, antiviral, and cardiovascular benefits. Supports immune health, blood pressure, and cholesterol levels.
    • Note: Letting crushed garlic sit enhances allicin formation.

Oils and Topicals

  1. CBD Oil
    • Benefits: Anti-inflammatory, anxiolytic, and pain-relieving properties. May improve sleep, stress, and neurological conditions (e.g., epilepsy).
    • Note: Quality and dosing vary; legal status depends on region.
  2. Frankincense Oil
    • Benefits: Anti-inflammatory and calming; supports skin health, immune function, and stress relief. May aid respiratory health via aromatherapy.
    • Note: Dilute for topical use; limited oral evidence.
  3. Pine Oil
    • Benefits: Antimicrobial and decongestant properties. Supports respiratory health and may reduce inflammation via aromatherapy.
    • Note: Primarily used in diffusers or topically (diluted).
  4. Ginger Oil
    • Benefits: Anti-inflammatory and warming; supports digestion, pain relief, and circulation. May reduce nausea via aromatherapy.
    • Note: Dilute for skin application to avoid irritation.
  5. Cubeb Oil
    • Benefits: Antimicrobial and expectorant; supports respiratory and urinary tract health. May aid digestion and inflammation.
    • Note: Rare in supplements; used in traditional systems.
  6. Black Seed Oil
    • Benefits: Contains thymoquinone, with anti-inflammatory, antioxidant, and immune-modulating effects. May support respiratory, skin, and metabolic health.
    • Note: Strong taste; start with small doses.

Probiotics and Gut Health

  1. New Roots Probiotic Intensity
    • Benefits: Multi-strain probiotic supporting gut microbiome, digestion, and immune health. May reduce IBS symptoms and improve mood via gut-brain axis.
    • Note: High CFU counts beneficial for dysbiosis; refrigerate for potency.

Other Foods and Compounds

  1. Apricot Seeds (Just One)
    • Benefits: Contain amygdalin (vitamin B17), claimed to have anti-cancer properties. May support immune health in traditional use.
    • Note: High doses toxic due to cyanide release; controversial and poorly studied.
  2. Beets + Arugula with Nitric Oxide Dump Exercise
    • Benefits: Beets and arugula are rich in nitrates, boosting nitric oxide for better blood flow, exercise performance, and blood pressure. Exercise amplifies effects.
    • Note: Time meals to avoid digestive discomfort during workouts.

Beverages and Hydration

  1. Baking Soda Water
    • Benefits: May alkalize body, improve exercise performance, and relieve acid reflux. Supports kidney function in some cases.
    • Note: Avoid overuse to prevent electrolyte imbalance.
  2. French Press Organic Black Coffee
    • Benefits: Rich in antioxidants (chlorogenic acids), supports metabolism, cognitive function, and mood. May reduce risk of neurodegenerative diseases.
    • Note: Limit intake to avoid jitteriness or sleep disruption.
  3. Filtered Water with Health Ranger Mineral Drops, Organic Apple Cider Vinegar, and Himalayan Pink Salt
    • Benefits: Enhances hydration, replenishes electrolytes, and supports digestion (ACV). May stabilize blood sugar and improve mineral balance.
    • Note: Dilute ACV to protect tooth enamel.

Health Practices

  1. Fasting with Aforementioned Beverages and Vitamin C at 72-Hour Mark
    • Benefits: Promotes autophagy, fat loss, and metabolic reset. Vitamin C at 72 hours may reduce oxidative stress during prolonged fasting.
    • Note: Not suitable for all; medical supervision advised for extended fasts.
  2. Dry Brushing
    • Benefits: Stimulates lymphatic drainage, exfoliates skin, and may improve circulation. Promotes relaxation and skin health.
    • Note: Gentle pressure to avoid skin irritation.
  3. Deep Breathing Exercises (with HEPA Air Purifier)
    • Benefits: Reduces stress, improves oxygenation, and supports lung health. HEPA purifier ensures clean air, reducing allergens.
    • Note: Practice diaphragmatic breathing for max benefit.

Personal Care and Miscellaneous

  1. Sovereign Silver Bio-Active Silver Hydrosol
    • Benefits: Colloidal silver with antimicrobial properties; used for immune support and topical infections. May aid wound healing.
    • Note: Limited evidence; overuse risks argyria (skin discoloration).
  2. Carina Organics Unscented Moisturizing Shampoo
    • Benefits: Gentle, chemical-free cleansing for sensitive scalps. Supports healthy hair without synthetic irritants.
    • Note: Ideal for those with allergies or chemical sensitivities.
  3. Organic Olive Oil/Castile Soap
    • Benefits: Natural, non-toxic cleansing for skin and hair. Olive oil moisturizes; castile soap is biodegradable and gentle.
    • Note: Dilute castile soap to avoid dryness.
  4. Green Beaver Fluoride-Free Toothpaste
    • Benefits: Cleans teeth without fluoride, reducing risk of fluorosis in sensitive individuals. Natural ingredients support oral microbiome.
    • Note: Ensure adequate fluoride from other sources for cavity prevention.
Auto