Skip to content

nutjob-laboratories/merk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2,326 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


Open Source IRC Client
A multiple-document interface IRC client for Windows, Linux, and macOS
Current stable release: MERK 0.051.650
Current development version: 0.051.692
Visit us at https://merk.chat!

Help Fund MERK!

I finally found a job! But MERK still needs your help. If you'd like to help me and help support MERK, please consider donating. Anyone who donates $50 or more will get their name immortalized on the "patrons" tab in MERK's "about" dialog. MERK will always be free, and will always be open source. Thanks for your time, and I hope you enjoy MERK! Let's keep IRC alive in the 21st century!

Downloads

All files are packed in ZIP archive files, unless otherwise noted. All files available for direct download below are for the current development version of MERK. If you have previously installed MERK and would like to update to a new version, just download the installer and install MERK again; your install will be updated to the latest version.

Type Platform Download
User Guide PDF MERK User Guide
Current Release All MERK 0.051.650 Release
Zip Archive Cross-Platform Python Download MERK 0.051.692 (12.99 MB)
Zip Archive Linux Executable Download MERK 0.051.692 (99.04 MB)
Flatpak Linux Flatpak Download MERK 0.051.692 (72.85 MB)
Zip Archive Windows Executable Download MERK 0.051.692 (49.93 MB)
Windows Installer Windows Setup Download MERK 0.051.692 (47.03 MB)

Summary

MERK is a graphical open source Internet relay chat client. The current development version is 0.051.692. It uses a multiple-document interface, much like the popular Windows IRC client mIRC. MERK is written in Python 3, using the PyQt5 and Twisted libraries, and runs on Windows, Linux, and macOS. MERK has a rich plugin framework; plugins can be created, written, and exported directly inside the application with no need of outside tools. MERK is updated frequently with new features and bugfixes.

MERK is explicitly designed to be easy and intuitive to use, but powerful. Users never have to delve deeper into the interface than they want to.

MERK has a new domain! You can visit this repository at https://merk.chat, get the latest release at https://download.merk.chat, and download the latest development version from https://latest.merk.chat.

MERK is still in active development, but it works, and can be used for most IRC activities. The current stable release of MERK is version 0.051.650. MERK has a user guide, which can be viewed here. The CHANGELOG reflects changes in the client in the current development version which will be present in the next release.

Join me on the official MERK IRC channel, #merk on the MansionNET network! Connect to MansionNET in the client as one of the built-in server suggestions, or at irc.inthemansion.com, port 6697 (via SSL). I'm also an IRCop on MansionNET! I'm usually in #merk and #lobby.

Running MERK on Windows

MERK has a version built with PyInstaller which you can run without having to install Python or any of the requirements. You can download the current stable release (0.051.650) here. For more information on MERK and how it works, check out the user guide.

To run the current development version of MERK, download this zip file and unzip to any directory, and double click on merk.exe to run the client. If you download the installer, unzip and double click on setup.exe to install MERK. You can install MERK any place you'd like.

If you have previously installed MERK and would like to update to a new version, just download the installer for the newer version and install MERK again; your install will be updated to the newer version. To update the merk.exe version, extract the zip file, overwriting the older version of MERK.

A note: all command-line arguments, as documented below, work on the all versions of MERK.

Running MERK on Linux

MERK has a version built with PyInstaller which you can run without having to install Python or any of the requirements. For more information on MERK and how it works, check out the user guide. MERK supports both X11 and Wayland.

To run the current development version of MERK, download this zip file and unzip to any directory, and double click on merk to run the client, or execute merk from a console window.

If you have Flatpak installed, you can install the Flatpak distribution. Download the Flatpak of MERK, and save it. Then, navigate to where ever you saved the file with the console, and enter:

flatpak install --user merk-latest.flatpak

You may have to restart your window manager for the entry in the application menu(s) to appear. The same instructions work for releases of MERK, just replace merk-latest.flatpak with the filename of the Flatpak release. To update MERK to the latest version, just download the Flatpak of the latest version and install it.

A note: all command-line arguments, as documented below, work on the all versions of MERK.

Running MERK on macOS

First, install Python 3.13 with HomeBrew.

brew install python@3.13

Now, download MERK. Extract the zipfile to a directory of your choice using your favorite archive/zip program. With that done, we need to build a virtural environment to run MERK in. Open a console, and navigate to wherever you extracted MERK to, and execute these commands:

python3.13 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install pyqt5 Twisted

If you'd like to connect to servers via SSL/TLS, run these commands to install the necessary libraries:

pip install pyOpenSSL service_identity

You're all set! You can run MERK with:

python merk.py

To run MERK from a shortcut or script, you have to make sure that the virtual environment is initialized before you can run merk.py. For example, if you installed MERK into /Users/your_name/merk, you could execute:

source /Users/your_name/merk/.venv/bin/activate && python /Users/your_name/merk/merk.py

A note: all command-line arguments, as documented below, work on the all versions of MERK.

Running MERK with Python

First, make sure that all the requirements are installed. Next, download MERK. Extract the zipfile to a directory of your choice using your favorite archive/zip program. Open a command prompt, navigate to the directory you extracted MERK to, and type:

python merk.py

Python Requirements

MERK requires Python 3.09+, PyQt5, and Twisted. PyQt5 and Twisted can be installed by using pip:

pip install pyqt5
pip install Twisted

To connect to IRC servers via SSL, two additional libraries may be needed:

pip install pyOpenSSL
pip install service_identity

MERK is being developed with Python 3.13 on Windows 11 and Python 3.12 on Linux Mint 22.3. Most development work is being done on Linux.

If you're running Windows, and you're getting errors when trying to run MERK, you may have to install another library, pywin32. You can also install this with pip:

pip install pywin32

To run properly on Linux and macOS, the latest version of all required software is recommended. For Linux systems using Wayland, you may need to recompile PyQt5 with Wayland support. The Linux binary supports display on systems with both X11 and Wayland.

There are four libraries that comes bundled with MERK:

Features

  • Runs on Windows, Linux, and macOS
  • Stand-alone binaries for both Windows and Linux are available
  • Flatpak distribution for Linux is available
  • Supports multiple connections (you can chat on more than one IRC server at a time)
  • Connect to IRC via TCP/IP or SSL/TLS
  • SASL support
  • A built-in list of over 80 IRC servers to connect to
  • Open source (GPL 3)
  • Built-in documentation!
  • Uses a multiple document interface, much like popular Windows IRC client mIRC
    • Unlike mIRC, MERK is completely free and open source!
  • Features include...
    • Extensive command-line options
      • Over 30 different command-line flags, allowing for connecting to multiple servers on startup, disabling or enabling options, and more
    • Dark mode
    • Full scripting engine
      • Includes a built in script editor, with syntax highlighting
      • Automatically execute scripts on server connection (to join channels, login in ChanServ, etc.)
      • Scripts have rudimentary flow control, including if, goto, and loop
      • Variables (called "aliases" in MERK parlance) are scoped locally if created in scripts, and globally if created in the text input widget.
      • Over 80 different commands are available for scripts or for use in the client
      • 19 script-only commands
    • Macros
      • Macros can take arguments, just like "regular" commands
      • Macro functionality is done with scripts, allowing for complex behaviors
    • Application-wide hotkeys
      • Hotkeys can execute any command, script, or macro
      • Command is executed in whatever subwindow is active
      • Hotkeys can be set in scripts, from commands, or through the hotkey manager
    • Automatic logging of channel and private chats
      • Includes a utility to export logs to JSON, CSV, "human readable", or your own custom format
        • "Human readable" logs look more like "traditional" IRC logs
      • Logs are stored in JSON, so parsing/scraping your own logs in easy
    • Audio notifications
      • Can be triggered by seven different events, with each one able to be turned on and off
      • Uses any WAV file as the notification sound, and can be set in the GUI. MERK uses a built-in public domain "bell" sound by default
    • Very configurable, without having to manually edit a configuration file
      • Control application behavior, logging, features, the GUI, and more
      • Over 300 different settings can be changed, allowing you to customize MERK to look and function exactly the way you want it to look and function
      • Almost all settings can be changed in the settings dialog without a restart
      • Settings can be changed on-the-fly with scripts and hotkeys using the /config command
    • All text colors (and backgrounds) can be customized
      • Individual channels can have their own color schemes
      • User input text can highlight channels, nicknames, commands, and more as you type!
      • Styles are saved and loaded automatically
      • Easy to use GUI text style editor is built-in
      • Changes to text style are immediate, without having to restart
      • Default text styles for both dark and normal mode
    • Built-in spell checker (supports English, Spanish, French, German, Portuguese, Italian, Dutch, and Russian)
    • Autocomplete for commands, nicknames, channels, and more
    • Emoji support
      • Insert emojis into chat by using shortcodes (such as :joy: 😂, :yum: 😋, etc.)
      • Built-in autocomplete for all supported emojis
      • A list of supported emoji short codes can be found here
    • ASCIImoji support
      • Insert ASCIImojis into chat by using shortcodes (such as (bear) ʕ·͡ᴥ·ʔ, (lol) L(° O °L), etc.)
      • Built-in autocomplete for all supported ASCIImojis
      • A list of supported ASCIImoji shortcodes can be found here
    • Full IRC color support
      • IRC colors are shown in topics in the channel information display
      • Colors and formatting can be optionally stripped from display
      • If colors and formatting in input are stripped from display, they will still be sent to the server.
    • MERK "markdown" support, for formatting messages with IRC control codes
      • Messages can use the italics, bold, strikethrough, and underline markdown tags
      • Inject IRC colors into input with plain text
        • Open a color block with <NUMBER to set the foreground color, and <NUMBER,NUMBER to set the foreground and background colors, and close the color block with >.
      • Colors and formatting is displayed in chat (with the option to turn this behavior off) and in channel topics
    • Plugins
      • All the information needed to write, develop, and export plugins can be found in the built-in documentation, the MERK User Guide
      • Plugins are written in Python, and have access to everything that Python has
      • Plugins have direct access to the Twisted IRC client objects used by MERK to connect to IRC
      • Plugins can react to most IRC events
        • Over 40 different IRC and application events
        • Individual plugin events can be enabled and disabled in the "Settings" dialog
        • Plugins can contain methods, written in Python, that can be directly executed by users with the /call command
      • Plugins can be created and edited directly in the application
        • A special version of the script editor, modified for Python, is used to create and edit plugins. Features include syntax highlighting, auto-indentation, and code generators for all events
        • Plugins can be imported from, and exported to, ZIP files, completely inside MERK
        • Example plugins are in both the documentation and here
      • Plugins can be installed by drag-and-drop, with the plugin manager, or from the command-line
      • Plugins can be uninstalled with the plugin manager, from the command-line, or by simply deleting the plugin's file(s)

Screenshots

Screenshots may not reflect the current release (0.051.650), and may reflect the current development version (0.051.692). More screenshots are in the MERK User Guide.


MERK connected to Libera and EFnet, on Windows 11, using the "windows" widget set.


MERK connected to Libera, EFnet, and MansionNET on Linux Mint 22.3, using the "Oxygen" widget set.


MERK connected to MansionNET on macOS 26.2, using the "Fusion" widget set in "dark mode".


The MERK connection dialog, the first thing users see when running MERK. All settings are saved automatically, including the connection script. The extra text (describing how the individual settings work) can be removed with the "Simplified dialogs" option in settings.


The text style dialog. The text style can be edited for all windows/channels, or for specific channels. Styles are saved by network, so they are applied no matter what server you're connected to. Changes, once saved, are automatically and instantly applied.


The first "page" of the settings dialog. MERK features over 300 settings that can be tweaked until MERK looks and works exactly like you want it to. All settings (except for "dark mode") are applied instantly.


The settings menu also includes many commonly used settings that can be toggled directly, without opening the settings dialog. All settings in this menu are applied instantly.


The channel list dialog, listing all visible channels on a server. The list can be searched. This screenshot shows the channel list for the Libera.chat network. The instructional text has been removed by toggling the "Simplified dialogs" option in settings.

Usage

usage: python merk.py [--ssl] [-p PASSWORD] [-c CHANNEL[:KEY]] [-a NICKNAME]
                      [-C SERVER:PORT[:PASSWORD]] [-n NICKNAME] [-u USERNAME]
                      [-S SERVER:PORT[:PASSWORD]] [-r REALNAME] [-h] [-d] [-x] 
                      [-t] [-R] [-o] [-P] [-f] [-s FILENAME][--config-name NAME] 
                      [--config-directory DIRECTORY] [--config-local] [-D] [-L]
                      [--scripts-directory DIRECTORY] [--user-file FILENAME] [-E]
                      [--config-file FILENAME] [--reset] [--reset-user] [-Q NAME]
                      [--reset-all] [--uninstall [FILE]] [--install FILE]
                      [SERVER] [PORT]


Connection:
  SERVER                Server to connect to
  PORT                  Server port to connect to (6667)
  --ssl, --tls          Use SSL/TLS to connect to IRC
  -p, --password PASSWORD
                        Use server password to connect
  -c, --channel CHANNEL[:KEY]
                        Join channel on connection
  -C, --connect SERVER:PORT[:PASSWORD]
                        Connect to server via TCP/IP
  -S, --connectssl SERVER:PORT[:PASSWORD]
                        Connect to server via SSL/TLS

User Information:
  -n, --nickname NICKNAME
                        Use this nickname to connect
  -u, --username USERNAME
                        Use this username to connect
  -a, --alternate NICKNAME
                        Use this alternate nickname to connect
  -r, --realname REALNAME
                        Use this realname to connect

Options:
  -h, --help             Show help and usage information
  -d, --donotsave        Do not save new user settings
  -x, --donotexecute     Do not execute connection script
  -t, --reconnect        Reconnect to servers on disconnection
  -R, --run              Don't ask for connection information on start
  -o, --on-top           Application window always on top
  -f, --full-screen      Application window displays full screen
  -s, --script FILE      Use a file as a connection script
  -P, --disable-plugins  Disables plugins
  -E, --enable-plugins   Enables plugins

Files and Directories:
  --config-name NAME    Name of the configuration file directory (default: .merk)
  --config-directory DIRECTORY
                        Location to store configuration files
  --config-local        Store configuration files in install directory
  --scripts-directory DIRECTORY
                        Location to look for script files
  --user-file FILE      File to use for user data
  --config-file FILE    File to use for configuration data
  --reset               Reset configuration file to default values
  --reset-user          Reset user file to default values
  --reset-all           Reset all configuration files to default values
  --uninstall [FILE]    Deletes an installed plugin
  --install FILE        Install plugin ZIP or Python module

Appearance:
  -Q, --qtstyle NAME    Set Qt widget style (default: Windows)
  -D, --dark            Run in dark mode
  -L, --light           Run in light mode

Commands

All of these commands can be issued in the client or from scripts, unless otherwise noted. Commands that do not start with / can only be issued in scripts. Commands that start with /_ are commands that are usually limited to IRCops, and usually display all output in server windows.

Commands Description
/admin [SERVER] Requests administration information from the server
/alias [TOKEN] [TEXT...] Creates an alias that can be referenced by $TOKEN. Call with only TOKEN as an argument to see TOKEN's value. If TEXT is a mathematical statement, it will be evaluated and the result used as the alias' value. Operations supported are parenthesis, addition (+), subtraction (-), multiplication (*), division (/), modulus (%), and exponents(**). Call without any arguments to see all aliases and their values
/away [SERVER] [MESSAGE] Sets status as "away". To specify what server to set the "away" status on, pass a hostID (the host and port used to connect to the server, in the format host:port, or the hostname used to connect) as SERVER
/back [SERVER] Sets status as "back". To specify what server to set the "back" status on, pass a hostID (the host and port used to connect to the server, in the format host:port, or the hostname used to connect) as SERVER
/bind SEQUENCE COMMAND... Executes COMMAND every time key SEQUENCE is pressed. Pass save as the only argument to save binds to the configuration file
/browser URL Opens URL in the default browser
/call METHOD [ARGUMENTS...] Executes METHOD in any plugin that contains that METHOD
/clear [SERVER] [WINDOW] Clears a window's chat display. SERVER is optional if WINDOW belongs to the same context. Pass * as WINDOW to clear the server window
/close [SERVER] [WINDOW] Closes a subwindow. SERVER is optional if WINDOW belongs to the same context. Pass * as WINDOW to hide the server window
/config [SETTING] [VALUE...] Changes a setting, or searches and displays one or all settings in the configuration file. Caution: use at your own risk!
/config export [FILENAME] Exports the current configuration file. Caution: use at your own risk!
/config import [FILENAME] Imports a configuration file into settings. Caution: use at your own risk!
/_connect SERVER PORT [REMOTE] Instructs a server to connect to another server. May only be issued by server operators
/connect SERVER [PORT] [PASSWORD] Connects to an IRC server
/connectssl SERVER [PORT] [PASSWORD] Connects to an IRC server via SSL
context WINDOW_NAME Moves execution of the script to WINDOW_NAME; can only be called from scripts
/ctcp REQUEST USER Sends a CTCP request to USER; valid REQUESTs are TIME, VERSION, USERINFO, SOURCE, or FINGER
/delay SECONDS COMMAND... Executes COMMAND after SECONDS seconds
/_die Instructs the server to shut down. May only be issued by server operators
/edit [FILENAME] Opens a script in the editor
end Immediately ends a script; can only be called from scripts
exclude WINDOW... Prevents a script from executing in WINDOW's context. Multiple WINDOWs can be specified. Can only be called from scripts
/exit [SECONDS] Exits the client, with an optional pause of SECONDS before exit
/fade [SERVER] [WINDOW] PERCENTAGE Sets transparency of a subwindow by PERCENTAGE. SERVER is optional if WINDOW belongs to the same context. Call without arguments to see current subwindow's transparency. Pass * as WINDOW to set the transparency of the server window
/find [TERMS] Finds filenames that can be found by other commands; use * for multi-character wildcards, and ? for single character wildcards
/folder PATH [PATH...] Opens PATH(s) in the default file manager
goto TARGET Moves execution of the script to TARGET. The only script-only command that can be issued from an if command. Can only be called from scripts
halt [MESSAGE...] Asks the user if they want to halt the script's execution, and displays an error MESSAGE. Can only be called from scripts
/help [COMMAND] Displays command usage information
/hide [SERVER] [WINDOW] Hides a subwindow. SERVER is optional if WINDOW belongs to the same context. Pass * as WINDOW to hide the server window
if VALUE1 OPERATOR VALUE2 COMMAND... Executes COMMAND if VALUE1 and VALUE2 are true, depending on OPERATOR. Valid OPERATORs are (is) (result is true if VALUE1 and VALUE2 are equal), (not) (result is true if VALUE1 and VALUE2 are not equal), (in) (result is true if VALUE1 is contained in VALUE2), (nin) (result is true if VALUE1 is not contained in VALUE2), (gt) (result is true if VALUE1 is a greater number than VALUE2; if either value is a string, the length of that string will be used as the value), (lt) (result is true if VALUE1 is a lesser number than VALUE2; if either value is a string, the length of that string will be used as the value), (ne) (result is true if VALUE1 is not an equal number to VALUE2; if either value is a string, the length of that string will be used as the value), and (eq) (result is true if VALUE1 is an equal number to VALUE2; if either value is a string, the length of that string will be used as the value). Can only be called from scripts
/ignore USER Hides a USER's chat; use * as multiple character wildcards, and ? as single character wildcards
/info [TARGET] Requests server information
input ALIAS MESSAGE... Requests input from the user in a dialog (with MESSAGE), and stores the input in ALIAS. If the user cancels the dialog or doesn’t input anything, ALIAS will be set to *. This command is blocking. Can only be called from scripts
insert FILE [FILE...] Inserts the contents of FILE where it appears in the script; Can only be called by scripts
/invite NICKNAME CHANNEL Sends a channel invitation
/ison NICKNAME(S)... Displays if the specified nicknames are online
/join CHANNEL [KEY] Joins a channel
/kick CHANNEL NICKNAME [MESSAGE] Kicks a user from a channel
/_kill CLIENT COMMENT... Forcibly removes CLIENT from the network. May only be issued by IRC operators
/knock CHANNEL [MESSAGE] Requests an invitation to a channel
/links [REMOTE [MASK]] Requests a list of servers the server is connected to
/list [TERMS] Lists or searches channels on the server; use * for multi-character wildcard and ? for single character wildcard
loop COUNT Begins a loop block, executing any scripting until the script encounters a pool command, before moving execution back to the line after the loop call. The code in between loop< and pool will be repeated COUNT times. Can only be called from scripts
/lusers [MASK [SERVERS]] Requests statistics about the server
/macro NAME SCRIPT [USAGE] [HELP] Creates a macro, executable with /NAME, that executes SCRIPT
/maximize [SERVER] [WINDOW] Maximizes a subwindow. SERVER is optional if WINDOW belongs to the same context. Pass * as WINDOW to maximize the server window
/me MESSAGE... Sends a CTCP action message to the current chat
message MESSAGE... Displays a messagebox with a short message. This command is blocking. Can only be called by scripts
/minimize [SERVER] [WINDOW] Minimizes a subwindow. SERVER is optional if WINDOW belongs to the same context. Pass * as WINDOW to minimize the server window
/mode TARGET MODE... Sets a mode on a channel or user
/move [SERVER] [WINDOW] X Y Moves a subwindow to X (left and right) and Y (up and down) coordinates. SERVER is optional if WINDOW belongs to the same context. Call without arguments to see the current subwindow's coordinates. Pass * as WINDOW to move the server window
/msg TARGET MESSAGE... Sends a message
/msgbox MESSAGE... Displays a messagebox with a short message
/nick NEW_NICKNAME Changes your nickname
/notice TARGET MESSAGE... Sends a notice
number ALIAS LOW HIGH MESSAGE... Requests number from the user, between LOW and HIGH, in a dialog (with MESSAGE), and stores the input in ALIAS. If the user cancels the dialog or doesn’t input anything, ALIAS will be set to 0 (zero). This command is blocking. Can only be called by scripts
only WINDOW... Restricts a script to only executing in WINDOW's context. Multiple WINDOWs can be specified. Can only be called from scripts
/oper USERNAME PASSWORD Logs into an operator account
/part CHANNEL [MESSAGE] Leaves a channel
/ping USER [TEXT] Sends a CTCP ping to a user
/play FILENAME Plays a WAV file
pool Ends a loop block. Can only be called from scripts
/print [SERVER] [WINDOW] TEXT... Prints text to a window. SERVER is optional if WINDOW belongs to the same context. Pass * as WINDOW to print to the server window
/prints [SERVER] [WINDOW] TEXT... Prints system message to a window. SERVER is optional if WINDOW belongs to the same context. Pass * as WINDOW to print to the server window
/private NICKNAME [MESSAGE] Opens a private chat subwindow for NICKNAME
/python [FILENAME] Opens a file in the Python editor
/quit [MESSAGE] Disconnects from the current IRC server
/quitall [MESSAGE] Disconnects from all IRC servers
/quote [SERVER] TEXT... Sends unprocessed data to the current or another server. To specify what server to send the data to, pass a hostID (the host and port used to connect to the server, in the format host:port, or the hostname used to connect) as SERVER
random ALIAS START FINISH Generates a random integer from START to FINISH, and stores it in ALIAS. Can only be called by scripts
read ALIAS FILENAME Reads FILENAME as a text file, and stores the contents in ALIAS. Can only be called by scripts
/reconnect SERVER [PORT] [PASSWORD] Connects to an IRC server, reconnecting on disconnection
/reconnectssl SERVER [PORT] [PASSWORD] Connects to an IRC server via SSL, reconnecting on disconnection
/refresh Requests a new list of channels from the server
/_rehash Causes the server to reprocess and reload configuration files. May only be issued by IRC operators
/rem [TEXT...] Does nothing. Can be used for comments
restrict SERVER|CHANNEL|PRIVATE Prevents a script from running if it is not being ran in a SERVER, CHANNEL, or PRIVATE window. Up to two window types can be passed. Can only be called from scripts
/restore [SERVER] [WINDOW] Restores a subwindow. SERVER is optional if WINDOW belongs to the same context. Pass * as WINDOW to restore the server window
/script FILENAME [ARGUMENTS] Executes a list of commands in a file
/show [SERVER] [WINDOW] Shows a subwindow, if hidden, and shifts focus to that subwindow. SERVER is optional if WINDOW belongs to the same context. Pass * as WINDOW to show the server window
/size [SERVER] [WINDOW] WIDTH HEIGHT Resizes a subwindow. SERVER is optional if WINDOW belongs to the same context. Call without arguments to see current subwindow's size. Pass * as WINDOW to resize the server window
/style [SERVER] [WINDOW] Opens a window's text style editor. Pass * as WINDOW to select the server window
target LABEL Creates a target for the goto command. If used as a target for goto, script execution will move to the line this appears on. LABEL cannot contain spaces. Can only be called from scripts
/time Requests server time
/topic CHANNEL NEW_TOPIC Sets a channel topic
/_trace TARGET Executes a trace on a server or user. May only be issued by server operators
/unalias TOKEN Deletes the alias referenced by $TOKEN
/unbind SEQUENCE Removes a bind for SEQUENCE. To remove all binds, pass * as the argument
/unignore USER Un-hides a USER's chat. To un-hide all users, use * as the argument
/unmacro NAME Deletes the macro named NAME
usage NUMBER [MESSAGE...] Prevents a script from running unless NUMBER arguments are passed to it, and displays MESSAGE. If the script can take one or more arguments, pass + as NUMBER. Can only be called by scripts
/user [SETTING] [VALUE...] Changes a user setting, or searches and displays one or all settings in the user configuration file. Pass * as VALUE to set a setting as blank. *Caution: use at your own risk!
/userhost NICK(S)... Requests information about users from the server
/version [SERVER] Requests server version
wait SECONDS Pauses script execution for SECONDS; can only be called from scripts
/wallops MESSAGE Sends a message to all operators
/warn [SERVER] [WINDOW] TEXT... Prints an error message to a window. SERVER is optional if WINDOW belongs to the same context. Pass * as WINDOW to print to the server window
/who NICKNAME [o] Requests user information from the server
/whois NICKNAME [SERVER] Requests user information from the server
/whowas NICKNAME [COUNT] [SERVER] Requests information about previously connected users
/window [COMMAND] [X] [Y] Manipulates the main application window. Valid commands are cascade, fade, fullscreen, hotkey, ignore, install, layout, logs, maximize, minimize, move, next, ontop, pause, plugin, previous, readme, restart, restore, settings, size, tile, and uninstall. Call with no arguments to see main window information and a list of subwindows
/xconnect SERVER [PORT] [PASSWORD] Connects to an IRC server & executes connection script
/xconnectssl SERVER [PORT] [PASSWORD] Connects to an IRC server via SSL & executes connection script
/xreconnect SERVER [PORT] [PASSWORD] Connects to an IRC server & executes connection script, reconnecting on disconnection
/xreconnectssl SERVER [PORT] [PASSWORD] Connects to an IRC server via SSL & executes connection script, reconnecting on disconnection

MERK "Markdown"

You can easily "inject" IRC colors and formatting into chat and topics using MERK "markdown".

To insert IRC colors, open a chat message with <NUMBER (to set the foreground color of the chat), or <NUMBER,NUMBER (to set the foreground and background colors of the chat, respectively). NUMBER can be any number from 0 to 15, the "traditional" 16 colors of IRC chat. Stop using the color formatting by "closing" the text with >. So, to display the words "Hello world!" in white on a red background, you'd use <0,4Hello world!>.

Number Description HTML Color
0 White #FFFFFF
1 Black #000000
2 Blue #00007F
3 Green #009300
4 Light Red #FF0000
5 Brown #7F0000
6 Purple #9C009C
7 Orange #FC7F00
8 Yellow #FFFF00
9 Light Green #00FC00
10 Cyan #009393
11 Light Cyan #00FFFF
12 Light Blue #0000FC
13 Pink #FF00FF
14 Grey #7F7F7F
15 Light Grey #D2D2D2

You can also use markdown tags! To send text in italics, start (and finish) a message with *. For bold, use **. To underline text, start and finish with __. To send a strikethough, start and finish with ~ (this tag is not supported by all IRC clients, though it will render properly on most modern clients). To send the message "Hello world!", you'd use *Hello* **world!**.

Tags can be nested, so <5,9***~Hello~ __world!__***> is a completely valid statement in MERK "markdown". The client can be configured to strip colors and formatting from display, but messages sent in "markdown" will still appear with the formatting in clients the message is sent to. In channel windows, topics are automatically changed into "markdown" when the topic is edited via the GUI.

Just like almost everything is MERK, "markdown" can be turned off in the settings. More information about "markdown" can be found in the MERK User Guide.

Plugins

MERK can load plugins! Plugins are written in Python, the same language that MERK is written in, and can react to over 40 different events. Each plugin has access to the Twisted IRC client that MERK uses to communicate with IRC servers, and can interact with both the client and any chat subwindows. The built-in "Plugin Manager" can edit, export, install, and create plugins, using a special version of the script editor just for Python code. The plugin editor features syntax highlighting, auto-indent, optional visible whitespace, and all the features you'd expect out of a basic text editor.

For more information on how plugins work, and how to write your own, the MERK User Guide has all the information you'll need. Here's an example plugin to help get you started. It creates a function that you can call directly with /call rainbow that sends a message to the current chat in rainbow colors. So, to send a "hello world" message to the current chat, you'd call /call rainbow Hello, world!:

from merk import Plugin
import random

class RainbowChat(Plugin):
    def rainbow(self,window,arguments):
        output = []
        colors = [0,9,11,4,13,8,7]
        msg = ' '.join(arguments)
        for letter in msg:
            output.append(f"<{random.choice(colors)},1{letter}>")
        if len(output)>0:
            chat ='**'+''.join(output)+'**'
            window.say(chat)

Example Command-line Usage

In the following examples, the first command-line is how you would do the task using MERK as a Python script, and second command-line is how you would do it using the MERK Windows or Linux executable. Note that the command-lines, other than the initial executable name, are the same!

Let's assume that you want to use the command-line to connect MERK to the 2600.net network and join the #linux channel:

python merk.py --channel "#linux" irc.2600.net 6667
merk.exe --channel "#linux" irc.2600.net 6667

Easy, right? Now let's try something a little more complex. Let's say you want to connect the the Libera network, which uses SSL/TLS. You want to use a different nickname than you normally use; you want to use the nickname merker, but you don't want to save this nickname as your default. When you join the network, you want to join two channels: #python and #merk:

python merk.py --donotsave -n merker -c "#python" -c "#merk" --ssl irc.libera.chat 6697
merk --donotsave -n merker -c "#python" -c "#merk" --ssl irc.libera.chat 6697

You can do some things with the command-line that you can't do with the GUI. Let's say that you're using MERK on a computer that someone else also uses for MERK. You want to store your configuration files in a different folder, just for your use. You always want to use light mode, no matter what the configuration file says, and you've stored some MERK scripts in the C:\Merk_Scripts folder. You don't want MERK to ask you for a server to connect to, you just want it to start up, and you can choose a server from the "IRC" menu:

python merk.py --light --config-name .mymerk --scripts-directory "C:\Merk_Scripts" --run
merk.exe --light --config-name .mymerk --scripts-directory "C:\Merk_Scripts" --run

Now, let's try something that commonly done with other IRC clients: connecting to multiple servers automatically on startup. You want to use your standard settings, but connect to three different IRC servers as soon as you run MERK: you want to connect to the 2600 network and DALNet, using standard TCP/IP,and Libera, using SSL:

python merk.py -C irc.2600.net:6667 -S irc.libera.chat:6697 -C us.dal.net:6667
merk -C irc.2600.net:6667 -S irc.libera.chat:6697 -C us.dal.net:6667

This command will start up MERK and connect to three of these servers without any extra effort!

You can do a lot of things from the command-line. For a really complicated example, let's try this scenario. Here's what this command-line will do:

  • Connect to Libera via SSL/TLS
  • Connect to DALnet via TCP/IP
  • Make sure that we reconnect automatically if we get disconnected from either of these servers
  • Join the #merk and #python channels on both networks
  • Make sure that we don't execute any connection scripts we have set up
  • Run in "light mode", regardless of what the configuration settings say
  • Run a MERK script file named stuff.merk on connection, for both connections

Here's the set of arguments that will make all of that happen:

python merk.py -Ltx -s stuff.merk -S irc.libera.chat:6697 -C us.dal.net:6667 -c "#python" -c "#merk"
merk.exe -Ltx -s stuff.merk -S irc.libera.chat:6697 -C us.dal.net:6667 -c "#python" -c "#merk"

All command-line options are what they say on the tin: optional. Just running the script with no command-line options will initially open up the connection dialog, and you can do just about everything completely inside the GUI.

Why does MERK exist?

It's simple. I don't currently like any of the other IRC clients. I've used many, many other IRC clients for Windows and Linux, and they just didn't feel right. They weren't customizable enough, didn't have features that I wanted, or just plain looked ancient. I wanted a GUI IRC client that looked and felt modern, and could be heavily customized. My previous IRC client was called Ərk, and although I liked developing it and working on it, I honestly didn't use it that much. I fell out of love with the "single window" interface that so many other IRC clients use, and decided to try something "new" (and by "new" I mean 30 years old). I remembered using mIRC back when I was younger, and decided to try and write a new client that used the multiple-document interface style I remember fondly. And thus, MERK was born!

I honestly think that MERK may be the most configurable IRC client ever created. With over 300 different settings to work with, you can configure MERK to look and operate exactly how you want. Want to display all channel userlists on the left, or not display userlists at all? You can do that. Want to turn off all the pretty stuff, and display only raw, (nearly) unaltered text? You can do that. Maybe you want to use text styles only on the chat display, and leave the userlists and text input alone? You can do that. One of the things I hated about XChat/Hexchat is how un-configurable the UI is, and how most other clients require plugins or scripts to change the client UI. I wanted a client where you could alter or change most aspects of the UI without needed external tools or editing configuration files manually. With MERK, you can change all settings in the client and see the effects instantly. There are a few settings that can only be changed by editing the configuration files, but they are for settings most users will probably never change; but you can still change them and MERK will compensate, and not break the client!

I mostly wrote MERK because I wanted a client that had all the features I wanted, no matter how obscure or "weird". I wanted a "pretty" client with advanced features; one that was easy to use, but "deep". MERK is easy to get started with, and has all the documentation you could want or need, bundled in; it's perfectly functional, even if you never open the "Settings" dialog. But if you want to really get into customizing MERK, you can. You can change almost everything about the UI, or how MERK functions "under the hood", if you wish, and you don't need tutorials and half a dozen websites to do it. Long story short, MERK is my "dream IRC client", and I hope it can become yours too!

What does MERK mean?

Well, if you were to pronounce "IRC" as a word and not an acronym, it would probably be pronounced /Ərk/. Since the client allows a user to connect to multiple IRC servers at the same time, well, that might be what the "M" stands for. Either that, or "multiple-document interface". "MDIIRC" doesn't exactly roll off the tongue, so we combined the "M" with the word-pronunciation of IRC, and came up with MERK!

Does MERK need any help?

Yes! MERK is being written by me, Dan Hetrick, a software developer that can not do everything that this piece of software needs. There's few things I need help with!

  • Icons and other graphics work. I am not a graphic designer, and I think that that shows in this project, heh. I need help with creating better icons, and a better logo for MERK. I'm doing my best, here, but I'm a computer programmer, not an artist!
  • Packaging. MERK now has PyInstaller-based distributions for both Windows and Linux, as well as a Linux Flatpak! I'd love to provide a pip package, but I don't have much or any experience with this. Help would be awesome!
  • Proxy server support. I'd like MERK to support connecting through proxy servers! My wishlist is to support SOCKS4/5 and HTTP, but I'm open to anything!
  • DCC chat and file transfers. The DCC functionality in Twisted is undocumented, and I'll be honest, I can't make heads or tails of it. I'd love to be able to add this functionality to MERK, but I need help!
  • Using MERK and giving me feedback. Let me know what you love about MERK and what you hate about MERK! Got ideas for ways you'd like to customize the client? Features you'd like? Let me know! I can't guarantee that I'll put in everything that you want, but I love hearing new ideas, and I love hearing about how people are using MERK!

Contacting me is easy! Drop me an email or say hi in the official MERK IRC channel: #merk on the MansionNET network (irc.inthemansion.com, port 6697 for SSL). I'm also an IRCop on MansionNET; I'm usually in #merk and #lobby.