The master password dialog is the first thing that appears when you
launch DuckClient.
DuckClient encrypts the passwords it stores for you, using a master password you supply.
If you click Cancel, you will still be allowed to continue, but automatic login will be disabled.
Connect
The connect dialog opens automatically after you enter your master
password. It can also be accessed by clicking Connect… in the
top menu bar.
The connect dialog has two modes, Quick Connect and Saved Connection. If
you have not entered any world information, only Quick Connect will be
available.
Quick Connect options
Hostname: This is the hostname or IP address you want to
connect to.
Port: The port number to connect to.
SSL encryption controls whether DuckClient uses SSL/TLS
encryption for this world.
When offered: Will use plaintext unless the host offers
encryption during telnet negotiation, in which case DuckClient will switch
to using encryption.
Always: Starts an encrypted session immediately,
without negotiating; it should be used for hosts that use a separate port
for encrypted connections. This is common for MUCKs and older MUSH
servers.
Never: Causes DuckClient to decline encryption if offered; use
this if a host tries to negotiate encryption, but has a broken
configuration.
Note: MU* servers generally do not have certificates
issued by a certificate authority, so DuckClient can't validate certificates
the way a browser would. Instead, it uses a form of certificate pinning.
On your first connection to an encrypted host, you will be asked to confirm
that the certificate is the correct one. After that, DuckClient will
remember the certificate and only alert you if it changes.
Username and Password: If these are set, DuckClient will
attempt to automatically log in.
Save as: If you check this box and enter a name, DuckClient will
remember the settings you entered, and they will show up as a saved world
next time. You can edit the resulting world's settings in the Edit Worlds
dialog.
World editing
The world editing dialog is available by clicking Edit,
Worlds….
The world edit dialog allows editing both world (server) and character settings.
World settings
World name: This is for your reference. It can be anything
you like, although DuckClient will warn you if you try to assign the same
name to two worlds.
Hostname or IP: This is the hostname or IP address you want to
connect to.
Port: The port number to connect to.
SSL encryption controls whether DuckClient uses SSL/TLS
encryption for this world.
When offered: Will use plaintext unless the host offers
encryption during telnet negotiation, in which case DuckClient will switch
to using encryption.
Always: Starts an encrypted session immediately,
without negotiating; it should be used for hosts that use a separate port
for encrypted connections. This is common for MUCKs and older MUSH
servers.
Never: Causes DuckClient to decline encryption if offered; use
this if a host tries to negotiate encryption, but has a broken
configuration.
Note: MU* servers generally do not have certificates
issued by a certificate authority, so DuckClient can't validate certificates
the way a browser would. Instead, it uses a form of certificate pinning.
On your first connection to an encrypted host, you will be asked to confirm
that the certificate is the correct one. After that, DuckClient will
remember the certificate and only alert you if it changes.
Character set determines how DuckClient interprets special
characters. For most servers you will want to leave this set to "UTF-8";
this setting is also compatible with ISO 8859-1 (aka "Latin1"). For
sites that use line drawing characters, such as sites that implement
"Fansi" graphics, you should choose "IBM Codepage 437". This only
affects how incoming text is displayed; outgoing text is always UTF-8.
Login style controls how DuckClient sends your username and
password. The default sends the username and password followed by ENTER.
For most MUDs you should choose the other option, which sends username,
ENTER, password, ENTER.
Local echo causes commands entered to be added to the output buffer. This is an aesthetic improvement for some MUD type worlds that have command prompts. It also allows outgoing commands to appear in the logfile.
Translate Unicode to ASCII before sending removes all characters beyond the 8-bit Latin1 character set before sending commands to the server. Where possible, Unicode characters are mapped to the nearest ASCII equivalent. This is useful when cut-and-pasting text from web pages and word processors into worlds that don't handle Unicode properly.
Connection-holding options are used to prevent idle
connections from being disconnected, either by the server or a network
router. Besides these user-adjustable options, DuckClient also
automatically enables TCP keepalives if the host OS supports them.
Send telnet pings periodically sends the telnet "no
operation" command. Most servers ignore this completely, making it a
good option if you don't want to affect your character's idle time.
Servers with no telnet negotiation support may respond with an error.
Anti-idle causes DuckClient to send a text command or blank
line to the server periodically. The minimum period is 10 seconds;
generally values from 180 to 300 seconds (3 to 5 minutes) are best for
preventing routers from dropping connections, and 3600 to 7200 seconds
(1-2 hours) for avoiding server idle timers. This setting takes
effect immediately on any open copies of the world being edited, for
ease of fine-tuning.
Automatically preview images will cause DuckClient to
automatically show thumbnail-sized previews of image URLs in the URL
list. Unchecking it will cause a placeholder image to appear instead;
clicking the placeholder will load the preview. DuckClient can't
successfully generate previews for all sites.
Important: This setting can have privacy
implications. If auto-preview is turned on and someone sends you a URL that
points to a server they control, they can obtain your IP address. This in
turn can provide an approximate real-world location for
you.
Start logging on connect causes DuckClient to start logging to
a file immediately after a connection is made to this world. Note that
while Chrome will warn you about overwriting, if you choose an existing
log file, it will actually append to the file. If you have Chrome
version 31 or later, you can select a logfile with the "Choose" button
and Chrome will remember it next time. This is a per-machine setting, so
logfile locations can vary from machine to machine.
User list: The right column allows you to enter the names and
passwords of characters, so DuckClient can automatically log you in when
it connects to a world. Each world has its own list. This feature will
be disabled if you haven't entered a master password.
Triggers
Triggers are used to change the text style to highlight certain
text passages, or to gag (ignore) undesired text. They can be very
useful to highlight text lines, such as pages and whispers, that you
want to stand out from the rest of the text on the screen. DuckClient
has a simple but powerful trigger system that can match patterns based
on either wildcards or regular expressions.
Edit Triggers dialog
When you click "Triggers" in the menu bar, the "Edit Triggers"
dialog will appear. At the top is a drop-down list to select which
world to edit triggers for; triggers in DuckClient are world-specific.
The default is the current open world, if there is one. All changes
to trigger settings take effect immediately for new text arriving on
any open copies of the world, for ease of fine-tuning.
Below the drop-down list is the trigger list for the selected world. If
you haven't created any triggers yet, it will be empty. Next to it
are up/down buttons that can be used to control the order in which
triggers are executed; simply highlight a trigger in the list and
click up or down to move it.
Below the trigger list are buttons to add and delete triggers, or
copy them to another world. Copying triggers can be useful if you have
characters on more than one world that uses the same type of
server.
Pattern types
DuckClient supports two kinds of trigger patterns: Wildcards, and
regular expressions (regexps).
Wildcard patterns
Wildcard patterns use a simplified version of the same pattern
substitution used by the DOS prompt or UNIX shell; this is sometimes
known as a "glob" pattern. The
character * matches any
number of characters (including none), and the
character ? matches exactly
one character. The entire line must be matched for the trigger to
activate.
Examples:
The pattern You say, "*" would match lines of the form, You say, "Hello.".
The pattern *(Public-shout) would match any line ending with the text (Public-shout).
The pattern ????! would match abcd! but not abc! or abcde!.
Regexp patterns
Regular expressions allow creating much more complex and specific
patterns. The topic of regular expressions is a complicated one, and
won't be described in depth here, as there are many useful tutorials online;
DuckClient uses JavaScript regular expressions, which are very similar
to Perl regular expressions, so a tutorial specific to one of those
languages will tell you what you need to know about regular expression
syntax. Examples below show some of what's possible:
Examples:
^You say, ".*"$ — identical effect to the first wildcard example.
^(Somewhere on the MUCK, )?\w+ has (partially )?(connected|disconnected|reconnected). — matches the local and remote forms of typical Fuzzball MUCK connection and disconnection messages.
It's possible to construct regexp patterns that are invalid and
impossible for DuckClient to parse; for example, by having mismatched
parenthesis. If this happens, the small checkmark to the right of the
pattern box will change to an exclamation point, and the trigger will
be ignored until the problem is corrected.
Character name substitution
The string %username%
will always be replaced with the current character name, in either
type of pattern, if auto-login was used to connect. This facilitates
making triggers for worlds where you have more than one character.
For example, the wildcard
pattern %username%* can be
used to highlight any line starting with your character name.
Trigger actions
The bottom left portion of the trigger edit dialog selects what will happen to a line of text that matches the pattern.
Main action
Change the text style: Checking this will open a pane on the right side of the dialog that will let you set the color and style of the line matched by the trigger. For regexp patterns, you can choose whether to style the entire line or only the matched text.
Gag (ignore) the line: The line will be discarded; it will not appear in the output window or in the log. The line will not be checked for matches against triggers below this one.
Do Nothing: The text style of the line won't be changed, however the checkboxes below will still take effect.
Additional actions (checkboxes)
Display in a separate window: When text matches the trigger, a new window will pop up and the text will display there instead of the main window. The Window name box sets the title of the window, and also uniquely identifies it; other triggers that reference the same name will display in the same window. This allows easily grouping multiple triggers. Any text in the Command prefix box will appear at the beginning of the input area whenever it's cleared; this is a convenient place to put channel prefixes, puppet commands, etc.
Omit the line from the log: The line will be left out of the log, but will still appear in the output window. A small circle-with-slash icon will appear to the left of the line as a reminder. Useful for keeping page or whisper conversations out of RP logs.
Stop processing other triggers: The matching line will not be checked for matches against triggers below this one. Can be used to create exceptions to other triggers.
Preferences
Clicking "Preferences" in the menu bar presents a dialog with some
miscellaneous, non-world-specific settings.
App behavior preferences
Activity notifications
Flash or bounce the application icon: This will attempt to use your operating system's "alert" function to notify you of activity in background windows. The results of this vary from platform to platform, but it genrally involves flashing or bouncing the task bar icon.
Display a desktop notification: This will pop up a small notification card showing activity in background windows, using Chrome's desktop notification mechanism. Support varies by OS. Clicking the card will take you to the window and tab that generated the notification. Note that ChromeVox interacts badly with desktop alerts, so it's best to keep them off if you're using it.
Play a sound: This will play a short beep when there's activity in a background window. To avoid beep spam, only the first instance of activity will cause a beep.
Output appearance
This section is pretty self-explanatory. Font selection and size
are stored only locally, and not synced to Chrome storage, because the
choices for these will often vary from machine to machine. Note that
entering a font name that does not match any font on the system will
cause DuckClient to revert to your system's default web font.
Tor Proxy Settings
Important considerations
DuckClient can make connections through a Tor proxy, for enhanced privacy. Before using this feature, keep in mind the following limitations:
This feature is EXPERIMENTAL and may have bugs that could leak identifying information. These bugs could be in DuckClient itself, or in the Chrome or nw.js runtime used to execute it.
Once you've logged in as your character, the server admin knows your identity, whether you're using Tor or not. Exception: If you created a character while connected via Tor, and only connect to that character with Tor, your identity may be hidden from the server admin.
Be very careful with URLs. If you're given a link, and you open it in a browser other than Tor Browser, your IP address is revealed to the owner of the web server the URL points to.
If you don't use SSL encryption, the owner of the Tor exit node can eavesdrop on your connection, or even hijack it. When using Tor, it's highly recommended that you only connect using SSL. (I am using SSL and TLS interchangeably here; most modern servers will actually be using TLS.)
The list of Tor exit nodes is public knowledge. If a server admin sees a lot of abuse coming from Tor users, they may block the exit nodes, preventing you from connecting.
With that in mind, there are some situations where Tor can be useful:
You don't want your ISP to see where you're connecting.
You don't want MU* server admins to know your IP address, which can be used to find your location.
Connection filtering by your ISP (or your government) prevents you from connecting to MU* servers.
Settings:
Host: The IP or hostname of the Tor proxy. This will almost always be 127.0.0.1, the local host.
Port: The port where the Tor proxy listens for SOCKS 5 connections. For Tor Browser this is usually 9150, for Orbot it's 9050.
Isolate connections: If checked, DuckClient requests that Tor create a fresh circuit for each host and character pair you connect with. This will cause your different connections to appear to come from different IPs, reducing the chances that someone will notice the two accounts are coming from the same person.
Important: The settings above are not enough; you MUST make sure that Tor is enabled in the world settings before connecting.
Restrictions:
URL detection defaults to off on connections routed through Tor, to avoid accidentally opening links with a non-private browser. If Tor Browser is your default system browser, and you're sure you know what you're doing, you can manually turn it back on.
Similarly, image preview is disabled.
To make it harder to identify connections coming from DuckClient, the following telnet negotiation commands are disabled while using Tor:
NAWS: Window size is retained between sessions, so this could be used to fingerprint particular clients.
TERMTYPE: DuckClient is an uncommon enough client that reporting it as a terminal type could be enough to fingerprint particular users.
Getting Tor
These days it's pretty easy to get Tor up and running.
Desktop: Go to the Tor Project website and download the Tor Browser Bundle. Use host 127.0.0.1 and port 9150 in DuckClient's Tor proxy settings.
Chromebooks: There is no ChromeOS build of Tor. However, if your Chromebook can run Android apps, you can install Orbot from the Play store, or by sideloading. Getting this to work is not entirely straightforward because Android and ChromeOS do not share the same localhost interface, and the 'Open proxy on all interfaces' option in Orbot doesn't seem to work. I've had success with the following:
Obtain an Android terminal app. There are many that will work; you just need a basic command shell. I use one simply called Terminal Emulator. You do NOT need root or su access, just a command prompt.
Open the terminal, and type "ifconfig" on the command line. Note the IP address of the "arc0" interface. (This is the bridge between Android and ChromeOS environments.)
In the Orbot settings, click "Custom Config" and enter "SocksPort 100.115.92.2:9050", replacing "100.115.92.2" with the IP address you noted in the previous step. Stop (if necessary) and then start the Tor service by clicking the large onion icon.
In DuckClient's Preferences, set the Tor Proxy Host to that IP address, and the port to 9050.
You will have to repeat this any time the arc0 IP address changes. It's not clear to me when, or if, that happens, but in theory it could.
It's highly recommended that you read the list of warnings linked from the Tor download page, so you understand better how to preserve your privacy. You may also want to read the FAQ, especially if you're in a situation where your connection is heavily filtered.
The main interface
Once a world is open, an interface will appear with (from top to
bottom) world tabs, an icon bar, an output window, and an input
area.
World tabs
If you have multiple worlds open, clicking the tabs will allow you
to switch between them. The names of background worlds that have
activity will turn red and underlined on their tabs. You can also
cycle through open worlds with Ctrl-Tab and Ctrl-Shift-Tab.
Icon bar
The icon bar has a status indicator on the left to show the state
of the connection, and a series of small icon buttons on the
right. Hovering the mouse over one will show a description of its
function.
and
reduce and enlarge the font size. These have exactly the same effect as changing the font size in the "Preferences" dialog, but are included here for convenience.
indicates the current logging
status; it will have a filename next to it, if logging is enabled, or
"No log" if it is not. Clicking the icon will toggle logging for the
current world. Note that while Chrome will warn you about overwriting
the file if you pick an existing file, DuckClient will actually append
to the file.
appears when
you've scrolled the output window back to read previous text. It
indicates that normal scrolling to the bottom when new text arrives
has been paused. To resume normal scrolling, scroll down to the most
recent text, click the pause icon, or send a command from the input
box.
pops the current tab out into its own window. The window can be
popped back in as a tab using the matching icon on its icon bar.
shows a list of windows associated with the current world. This
includes previously closed trigger windows. Clicking an item in the
list will raise it to the foreground, or re-open it, as
needed. Re-opened trigger windows will have their scrollback
intact.
will cause
the current world to be disconnected (if it's currently connected),
then attempt to establish a new connection. It's useful for
reconnecting to a world after a network problem has caused your
connection to time out, or if you've accidentally quit a world and
want to reconnect without losing your scrollback.
will
disconnect from the current world (if connected), close its tab, and
close the log file (if logging is enabled.)
URLs controls URL detection. Uncheck to stop DuckClient from scanning incoming text for URLs.
Auto-\ is only
available when connected to a MUSH-type server. When checked,
DuckClient will automatically add a backslash (\) in front of
characters that the MUSH parser would otherwise consume, like % and [.
If you're editing MUSHcode, you may need to enter these characters
un-escaped; in that case, you can turn off this feature by clicking
the checkbox.
opens a search
field; typing text here will search for it in the scrollback of the
current world.
Input area
Text to be sent to the server can be typed in the large, white
input box. Hitting Enter or clicking the large Send button on the
right will send the current text and clear the input box. The small
up/down arrows to the left allow retrieving previous commands from the
command buffer; you may also press Ctrl-Up and Ctrl-Down, or Ctrl-P
and Ctrl-N.
Summary of keyboard shortcuts
Keyboard command
Action
Ctrl-Tab
Cycle through open tabs
Enter
In the input box, send the current text to the server
Ctrl-Backspace or Ctrl-W
In the input box, delete the word to the left of the cursor.
Ctrl-Up or Ctrl-P
Recall previous command
Ctrl-Down or Ctrl-N
Recall next command
Ctrl-U
Clear the input box
Ctrl-F
Open the search bar
Miscellaneous technical details
Telnet negotiation
DuckClient recognizes the following RFC854 telnet negotiation options:
ATCP [0xC8] and GMCP [0xC9]: Not supported, always declined, but used to aid server identification. [ref]
AUTHENTICATION [0x25]: Declined, not supported. [RFC1416]
BINARY [0x00]: Accepted. DuckClient is always 8-bit clean regardless of whether this option is on. [RFC856]
CHARSET [0x2A]: Accepted. DuckClient will accept the first character set it supports out of the list proposed by the server. Supported character sets are the one the user has selected for the current world (either "UTF-8" or "IBM437"), "LATIN1", or "US-ASCII". Client behavior does not change based on this; DuckClient is just reporting to the server what it can handle. [RFC2066]
ECHO [0x01]: DuckClient will negotiate for client-side echo. Echo is always on in the text input box regardless of the results. [RFC857]
ENVIRONMENT [0x27]: Declined, not supported. [RFC1408]
"Kludge mode" aka. "obsolete line mode" aka. "line-by-line mode": Detected, but does not change DuckClient's behavior, since its default behavior is in line with what this mode expects.
LINEMODE [0x22]: Declined. Full linemode support is ridiculously complex (it's something like 50% of the code base of BSD telnet) and most hosts either support "kludge mode" or just do the right thing. [RFC1184]
MCCP [0x55] and MCCP2 [0x56]: Accepted, fully supported. [ref]
MSSP [0x46]: Accepted. The CODEBASE field of the server's response is used to determine the server type, and all fields are logged on the debug console. Currently no other use is made of this data. [ref]
NAWS [0x1F] (Negotiatiate About Window Size): Accepted, and fully supported.* [RFC1073]
SGA [0x03] (Suppress Go-Ahead): Accepted, but does not affect behavior -- DuckClient never sends telnet go-aheads. No modern servers use this except to negotiate "kludge mode." [RFC858]
TERMTYPE [0x18]: Supported; types sent are DUCKCLIENT, ANSI-256COLOR, and MTTS 13.* [RFC1091] [MTTS spec]
TLS [0x2E]: Accepted if user has set the world's TLS setting to "when offered," declined if it's set to "never." [ref]
In order to avoid negotiation loops, DuckClient will never transmit the same telnet negotiation response twice, except when indicating the end of the terminal type list.
* This option is disabled when connecting through Tor.
Release Notes
Known issues
The Window List dropdown, which lists open trigger windows for a client, is not properly accessible for keyboard and text-to-speech users.
Occasionally the client will not re-launch automatically after loading a settings backup file. Sometimes re-launching it initially fails due to lingering background processes. This usually resolves itself, although sometimes it may be necessary to manually terminate the running process.
Version 5.9
TLD list for link detection updated.
Root certificates updated.
Version 5.8
Fixed incorrect UTF-8 decoding when characters were split on packet boundaries.
Improved handling of ANSI escape sequences split on packet boundaries.
Fixed a problem with the Preferences dialog not opening in some cases.
Version 5.6
Build installer packages for the Windows standalone version.
TinyMUX @version output is now matched properly in the server ID code.
Fixed a missing byte in CHARSET negotiation responses.
Corrected IBM437 charset name to CP437.
Add per-machine preference to set scrollback buffer size.
Version 5.5
Tor support.
Blacklisted youtu.be links from URL preview, to avoid unexpectedly playing audio.
Wait for telnet negotiation before sending @version.
Changed launch settings for the standalone binaries so that nw.js won't phone home to Google.
Version 5.4
When using NAWS to report the window size, DuckClient now gives a more conservative estimate of the number of columns, to avoid accidental linewrap issues on servers that use this value to size text boxes.
Garbled or unsupported ANSI sequences no longer cause a client hang.
Fixed a race condition that could cause incoming text to appear out of order.
World settings are now properly saved when data is pasted into text entry fields with the mouse, not just when it's typed.
The Forge TLS library has been updated to v0.8.0. This fixes some compatibility problems.
Text entry box colors are now configurable in Edit/Preferences.
Version 5.3
Autologin now works on the first run with a pristine configuration; before, due to an initialization bug, it would not work until the program had been exited and relaunched.
Event handlers are now cleaned up properly when dialogs are closed with the X button or by pressing Esc. This fixes a bug where clicking a button could carry out the action multiple times. (Thanks to Ronnie for reporting both this bug and the autologin one.)
Image preview is disabled for youtube.com links. This hasn't worked since they stopped providing preview thumbnails in meta tags, and it kept playing audio by mistake.
The world list in the Edit World dialog is now a fixed width, to avoid formatting problems when there are worlds with long names.
Standalone version: A "server closed the connection" error will now appear when the server shuts down a TLS connection, matching the behavior of the ChromeOS version.
MUD Server Status Protocol (MSSP) support. Currently this is only used to passively determine what kind of server we're talking to.
Character set negotiation support. Not many servers support this yet (mostly PennMUSH) but we now respond to it. Accepted options are UTF-8 or IBM Codepage 437 (depending on the character set selected in the world settings); Latin-1; or US ASCII. Client behavior is not changed, we merely use this to tell the server what we can handle.
Version 5.2
URLs in the middle of other text that looks like a URL will be correctly identified in more cases.
Speculative fix for a race condition that was causing SSL connections to abort during negotiation.
Triggers with missing patterns will no longer cause all incoming text to disappear.
Null triggers (created by previous bugs) are now filtered out when loading world data.
Fixed a number of bugs in the trigger dialog caused when a world's trigger index numbers had gaps.
Chrome sync storage is now cleared before loading a restore file. This avoids intermingling old and new data.
Version 5.1
Fix disappearing text when the server sent packets with no newline that rendered down to an empty string after processing. Reported by the AresMUSH developer.
URLs with an IPv4 address in the host part were not being recognized properly.
Version 5.0
Major overhaul of the text formatting code.
ANSI styles now correctly carry over from line to line, unless explicitly cleared.
Styling for local echo text can now be adjusted.
Regexp-pattern triggers can optionally style only the matched text, instead of the whole line.
URLs no longer have zero-width spaces added. This made line breaks a bit more elegant, but turned out to cause problems with cut-and-paste.
URL detection can now be toggled.
A new world-specific setting filters Unicode before sending text.
The master password dialog will no longer appear util the client has fully initialized and is responsive.
Fixed errors in MCCP2 telnet negotiation that were causing disconnects and garbled text.
The log filename now truncates when the window is too narrow, instead of pushing the URL detection and Auto-\ checkboxes downward.
Version 4.5
TLS connections to Socio-Political Ramifications no longer fail with "Received TLS record out of order."
TLS certificates are now checked against a bundle of CA certificates, and the user is only prompted if this fails. This more closely follows what browsers do, and makes sense now that "real" certificates are easier to come by.
MUD Client Compression Protocol versions 1 and 2 are now supported.
Local echo is now supported. This is a pretty minimalist implementation -- currently there's no way to style the echoed text, but that will be added in a future release.
Autologin data will no longer be sent twice when a host takes more than two seconds to negotiate telnet options.
A race condition was fixed that could case doubled text in a trigger window when it's first opened, coupled with a dropped line in the main window.
The list of valid top-level domains for URL detection has been updated.
A summary of changes will open in a tab the first time a new version is run.
Version 4.4
Fix problem where only the last letter of the log filename was displayed in the icon bar.
Properly detect (and ignore) telnet go-aheads, instead of trying to display them as Latin1 characters.
Remove an extraneous space in the MTTS terminal ID, to better match the standard.
Properly handle @version output on servers that were compiled with clang.
Version 4.3
Fixed a nasty bug that prevented closed trigger windows from being reopened, even though text still went to them.
Version 4.2
Add second input box, for quick commands while composing longer responses.
World tabs now resize properly if they wouldn't fit the width of the window. (Bug introduced in v4.0)
Image preview fixes for Dropbox and Transfur.
Incorrect error message for error -103 (connection timeout)
Version 4.1
Fixed issue with focus not moving to the input box if the first character typed was not alphanumeric, ", or :.
Version 4.0
Replace ad-hoc slide-out dialogs with more conventional ones from jQuery UI.
Lots of code cleanup and refactoring.
Announce incoming text when a screenreader is in use, via AccDC's $A.announce() API.
Replace the menu bar with a more accessible widget.
Control labeling for accessibility.
Quick-connect feature with streamlined world entry.
Fix a bug where clicking the output window would select all the text; this was caused by a change in Chrome's handling of the user-select attribute.
Make Ctrl-Shift-Tab cycle backwards through world tabs.
Handle things gracefully if the user deletes the last world.
Don't spam the server with anti-idle commands if the user forgets to give a delay.
Remove the TCP keepalive option; just enable them automatically if the OS supports them.
Remember Auto-\ preference for worlds and trigger windows.
Allow | in the file portion of URLs.
Allow * in the path portion of URLs.
Remove Spectrum Colorpicker library, now that the native HTML5 color input type works in Chrome apps.
Re-enable image preview for Chrome versions >49, where the webview browser crash bug is fixed.
Support MUD-style two-line logins.
Replaced old tooltip timestamps in the output window with a toggleable timestamp column.
Preview refinements for YouTube links.
Version 3.8
Speculative fix for loading invalid data that blocks world manipulation.
Version 3.6
Disable auto-preview mode for URLs; a bug in Chrome is causing this to crash the client
Update the URL highlighter's list of top-level domains.
Fix world settings box showing incorrect status for the TCP keepalive setting.
Fix a bug in the code for modifying the user list for a world.
Version 3.5
Fix a bug that could cause error messages to appear excessively large.
Version 3.4
Accessibility: Make top menu titles more visible, and make them part of the tab order.
Accessibility: Make icon bar buttons part of the tab order.
Prevent URL preview code from getting caught in redirect loops and consuming excessive CPU.
Avoid adding URLs twice when they're on an unterminated line.
Misc code cleanup.
Version 3.3
Fixed a bug that could cause network error messages to appear in a ridiculously huge font.
Version 3.2
Improved telnet negotiation. We now successfully negotiate with some general-purpose telnet daemons as well as MU*s.
Proper network line endings (CRLF) on sent text.
Improved handling of prompts and other partial lines.
Text sent in the last packet of a closing connection is no longer dropped.
Different icon bar text font, to better use the available space.
Version 3.1
Fixed issue where adding new worlds would sometimes fail.
Updated help file.
Version 3.0
Triggers can now spawn new windows and route text to them.
Toolbar icons are larger and clearer, and connection information is presented more concisely.
Can now play a sound on activity.
Uses the new chrome.sockets API where available. This replaces polling for data with an event-driven interface, reducing latency, CPU load, and power consumption.
Support for sending TCP keepalive packets, on platforms where Chrome supports it as a socket option.
Support for sending "telnet pings" (telnet negotiation NOPs) for connection keepalive
Can now activate TLS encryption "on the fly" with hosts that support telnet negotiation.
Improved telnet negotiation — we now inform hosts about our window size and terminal type where appropriate.
256-color support using "xterm-256" ANSI codes. Support for 24-bit ANSI color is also included, but has not been tested.
Support for IBM code page 437, for sites that use line drawing characters for ANSI art ("Fansi")
Browser tab mode has been removed, due to a lack of upstream support for apps running in tabs.
Version 2.2
Remember URL list pane status between runs.
Version 2.1
Fix inability to open "Back up settings" menu option.
Version 2.0
A separate panel listing all URLs from the current session is now available.
Image previews are now available in the URL list panel.
Multiple triggers can be selected for deletion or copying.
Added ability to save and restore settings to/from a JSON file.
Moved licensing info to its own pop-up window, added review link to splash screen.
Cycle page title to indicate activity, when in tab mode and not focused.
Fix false positive in URL detection.
Indent wrapped lines in output; allow links to word break in more places.
Version 1.2
Fix some checkboxes showing incorrect values when a new world is created.
Version 1.1
Fix extraneous characters included in URLs that were followed by an apostrophe
and a period. ('.)
Version 1.0
First public release.
Version 0.38 (release candidate 5)
Make UTF encoding fix work for non-SSL connections, too.
Make anti-idle setting controls less confusingly enabled/disabled.
Version 0.37 (release candidate 4)
Encode utf8 properly when sending, decode properly when receiving.
Fix redundant text in SSL error messages.
Version 0.36 (release candidate 3)
Fix a URL handling bug affecting situations where a URL was in single quotes.
Fix a dumb bug that caused full logfile paths to still appear on Windows.
Improve handling of situations where we need to ask the user about an SSL certificate.
Fix server type autodetection for sites with very long MOTDs.
Improve wording of some error messages.
Version 0.35 (release candidate 2)
Save space in the world button bar by only showing the filename of the logfile, instead of the entire path.
Context-sensitive help for most dialogs.
Cosmetic improvements to various UI elements.
Version 0.34 (release candidate 1)
Change default font to provide something better than Courier on some systems.
Version 0.33 (beta)
Minor bug fixes in search functionality.
Fix some CSS that caused the input box to be too small on newer versions of Chrome.
Version 0.32 (beta)
Gagged lines are no longer logged.
Added "Omit from log" trigger action.
Fixed various URL matching bugs.
Added scrollback search functionality.
Fixed missing variable initializations that could cause clicks on icons in one world to affect another world's status.
Changed the storage method for triggers to avoid hitting the 4K limit on chrome.storage.sync entries.
Version 0.31 (beta)
Fixed a bug that could result in lines being left out of the log if a server sent a series of short packets in quick succession.
Fixed a bug that disabled automatic input box resizing.
Fixed a bug that could cause logging to fail if the saved logfile was missing.
Increased default window height to 590px, to allow room for all the license agreements.
Version 0.30 (beta)
Fixed a bug that sometimes caused words before URLs to be included in the URL.
Version 0.29 (beta)
Improved the URL recognition for URLs that end with a right parenthesis.
Marked browser tab mode as deprecated, as it relies on undocumented Chrome behavior and requires Chrome to be the default browser.
Added support for desktop notifications when DuckClient is in the background and activity occurs in an open world. (Can be disabled in Preferences.)
Minimum Chrome version is now 28.
Version 0.28 (beta)
Fixed an error in URL recognition when two URLs appeared on the same line. This bug was introduced in 0.27.
Version 0.27 (beta)
Improved link detection.
Fix error where accepting and saving a certificate sometimes failed to save it.
Version 0.26 (beta)
Fix issue with port number not being saved if user used up/down buttons instead of typing a new number.
Version 0.25 (beta)
Fix issues with logging filename retention (Chrome dev channel only)
Version 0.24 (beta)
Added SSL encryption support.
Improved link detection.
Improved server auto-detection.
Fix some minor console errors.
Version 0.23 (beta)
Added auto-detection of the server type we're connected to.
Added auto-escape functionality when a MUSH-style world is detected.
Pressing the browser reload button when running in a tab no longer leaves stale connections behind.
Version 0.22 (beta)
Fixed a reference error that prevented setting the default world.
Improved URL identification.
Fixed a bug that prevented setting the anti-idle timer.
Fixed a bug that caused the anti-idle timer to stop working after reconnecting.