Commodore logo

ShadowM's Q-Link Page

(last updated 2014-04-20)
Commodore logo
Q-Link main menu
Q-Link Main Menu
Commodore Software Showcase splash screen
Software Showcase splash screen

Quantum Link (Q-Link for short) was an online service for Commodore 64 users that started in the mid-80s and ran until Hallowe'en 1994 ("Sunset" announcement); it later went on to become America Online (AOL). Here's a video of a Q-Link session from 1989, digitized by Raymond Day; you can even hear his modem dialing in at the beginning. This is a promotional video from 1986 done by Q-Link's ad agency. And this is a video of Q-Link's predecessor, PlayNet. I was a PlayNet subscriber myself, briefly, and was on Q-Link from summer '87 until the night it went dark.

In 2005, the original server (which was accessed via modem over a phone line) was reverse-engineered by Keith Henrickson, Jim Brain, and others, and released as a TCP/IP server written in Java. It had its debut at the SWRAP 2005 expo, where it generated tremendous excitement (here's the video I took of Jim's presentation at the show).

Unfortunately, few people joined the project to code, and interest began to fade. I gave a presentation at ECCC 2008 called "Hacking the Q-Link Source: How to get involved in the Q-Link Reloaded Project", but by that time, problems had begun to arise. First the domain the server was hosted on was allowed to expire, then the database the server ran on was lost in a hard drive failure. Eventually, the service had not run for several years. Rather than watch Q-Link fade into oblivion a second time, I decided to run a server myself and make the source available to anyone who wants it.

My Q-Link server ran on a Raspberry Pi from 2013-01-10 to 2013-10-06, but I wanted to use the Pi for other things, so Q-Link is now running in its own virtual machine. For their March 2013 issue, Linux Journal asked its readers to tweet what they'd done with their Raspberry Pi; my tweet (and this web page) was mentioned on their letters page!

NOTE: The server is running under Java 8 as of 2014-03-07.

Connecting to Q-Link
Tips for using Q-Link
The Q-Link Source Code
To Do List/Status
back to main Commodore page

Connecting to Q-Link

You can connect to my Q-Link server using the Q-Link client disk (not a web browser) at (if you have trouble using the URL, try the IP address, which you can find by using ping or nslookup). I didn't use the dump I have of the Q-Link Reloaded database, but instead created one from scratch using the instructions referenced below, so use a fresh Q-Link disk for this server. If there end up being multiple Q-Link servers out there, you'll need to use a different disk for each one. Here's a disk image of a fresh Q-Link disk.

Just for the sake of completeness, here are some more Q-Link disk images (Q-Link Reloaded does not support them):

There's a recent (early 2014) project to re-create Habitat/Club Caribe on a Stratus VOS machine (which is what the original Q-Link server ran on); they have some of the original Habitat source in C and PL/I. Here's the Club Caribe disk (again, not supported by Q-Link Reloaded). Note that side B is raw data (no directory or track and sector pointers). In fact, the contents of the directory header sector read as follows:


I've registered a channel on NewNet (#qlink) for people to ask questions and have other discussions about Q-Link. If you find a bug, don't hesitate to describe it in channel (or email me at shadowm at lyonlabs dot org); odds are I'll find a stack trace in the logs that points to the problem. A list of steps that will trigger the bug is always helpful, and the date and time you experienced the issue is helpful when inspecting the log file.

Here are some tips on getting it up and running; see also

I use only Linux on my own machines, so if you use a different operating system, you'll have to adapt it. If people want to send working instructions for other operating systems, I can put them up on this page. Note that after the initial run of Q-Link, you can go back and change your modem settings with the command LOAD"CHANGE ACCESS",8,1.
Hayes settings
Hayes settings (click to enlarge)

If you have trouble connecting, the easiest way to verify whether it's your setup or my server is to telnet to port 5190 on my server like this:

telnet 5190
Hit Enter a few times; you should see this:
If you get that, the problem is probably the way you have your Q-Link client configured.

You should connect to Q-Link with a real Commodore 64 (although it's possible with an emulator). The Q-Link client uses a serial connection; you cannot connect with a Commodore 64 Ethernet card (e.g. 64NIC+, Flyer, &c.). The most common way of doing it is to use a serial interface plugged into the user port of the '64, with a null-modem cable running to the serial port of a PC. On the PC, you run software which translates the serial data coming from the '64 to TCP/IP network packets, which get sent out over the internet to the Q-Link server. Your '64 is none the wiser, and thinks it is connected via modem. Most people use tcpser for this, which is available in most Linux distributions. You pass it the same dummy phone number you used when setting up Q-Link (see below). The command I use to start tcpser under Linux is:

tcpser -d /dev/ttyS0 -s 1200 -i"e0&k0&c0" -n"" -tsS

For this configuration, I use the Hayes-compatible settings in Q-Link. Note: if you have trouble using the URL, try the IP address, which you can find by using ping or nslookup.

manual settings
manual settings (click to enlarge)
It's also possible to dispense with the PC entirely and use something like a Lantronix UDS-10 instead. These are the settings I use on the Lantronix ("Remote IP Adr" should of course be whatever currently resolves to):
*** Channel 1
Baudrate 1200, I/F Mode 4C, Flow 02
Port 00000
Remote IP Adr:, Port 05190
Connect Mode : D5
Disconn Mode : 80
Flush   Mode : 00

With both a Lantronix and the VICE emulator, I use the manual dial settings in Q-Link; just hit Enter when prompted to dial Q-Link.

If you want to use an emulator, naturally all your friends will make fun of you, but it can be done. Here's how I got it to work using the VICE emulator under Linux. The main idea is to get VICE to use netcat to do the serial-to-TCP/IP translation that software or a Lantronix box does when using a real '64 (note the pipe symbol in the last screenshot). See your system's documentation for netcat (or nc; on some distros, those two names point to the same program). A helpful Mac user advises that the version of nc supplied with OS X may be broken and that it would be better to build GNU netcat instead. Beware that netcat (or nc) may still be running after you exit Q-Link, holding open the local port you are trying to use. You may need to restart VICE between runs, or even exit VICE entirely and kill the netcat process.
userport/baud rate
userport/baud rate
device: run a program
device: run a program
program to run
program to run
program and parameters
program and parameters

Here are some tips for using Q-Link on the '64:

The Q-Link Source Code

I think part of the reason there wasn't more involvement from people willing to code for the project is that the source was not generally available (people wanting to work on it were asked not to share the source, even though it was released under GPL). I checked out a copy from the trunk on 2011-08-13 and checked it into my own Subversion repository, and I'm making it available to anyone who wants to study it. (Note: the repo was upgraded to Subversion 1.8.8 when this server was upgraded on 2014-04-20.) I've made only small changes so far; you can check the revision history to see. Here are the URLs:

Don't wget the ViewVC!
Don't download the ViewVC! Checkout using Subversion.

I'm also making available my notes and SQL recipes to help in exploring the source; there's information in my ECCC slides that may be of interest as well. If you find any errors, please let me know (shadowm at lyonlabs dot org). The best protocol reference I've seen so far is in the reference/protocol subdirectory of the source.

For NetBeans users, here's how you can check out the code and create a project:

If you like, instead of just including martyr.jar in the second-last step, you can extract the entire martyr IRC library from this tarball and set up a NetBeans library, in order to get code completion. From NetBeans' main menu, select Tools / Libraries, create a new library called martyr-0.3.9, and fill in the blanks. Classpath is the jar file, and Sources is src/ where you extracted. There's no formal Javadoc, but there are API descriptions that will pop up when you do code completion.

To create the database, make sure you have MySQL installed, then follow the instructions in Mike Naberezny's notes, which you can find in reference/mike_n/01-getting-started.txt in the directory where you checked out from the repository. Make sure to add the extra tables he mentions; I'll commit an updated DDL at some point that also fixes some null dates.

I can't spend a lot of time helping people to get the source built, but any reasonably skilled Java programmer should be able to handle it. If your only interest is in running a server "to see how it works", please don't contact me. I'll only help people I think are sincerely interested in working on the code. If you want commit rights, send me some patches first (shadowm at lyonlabs dot org) and we can discuss them (see the To Do List for ideas).

There's quite a lot of reference material, graphics, disk images, comm dumps, &c. in the tree, including Keith Henrickson's original reverse-engineered server, written in C++. As Keith did much of the original work to decode the Q-Link protocol, it's only fair to mention this thread, which contains a response that looks like it's from him. I know there have been bounties in the Commodore community before; getting Keith to do more work on the project certainly seems like a good reason for one.

To Do List

As far as documentation goes, the main thing we need is a clear and concise description of the Q-Link protocol. There are bits and pieces in the references directory of the source (the best one is here), but we need an easy-to-read document that says "To do that, send instruction XX with code like this."

The biggest thing missing in the protocol implementation is the routines surrounding the download and upload of files: the necessary commands to display the menus for browsing and selecting them (and uploading descriptions).

An administrative tool is needed for things like user maintenance, editing bulletins, and so forth. I worked on one for a while, but it is not complete.

//who command broken  Probably the most well-known bug in Q-Link Reloaded is that in chat, using the //who command not only trashes the user's session, but makes it impossible to get back into chat at all, even after restarting the '64 and signing back in. Here's a server stack trace from someone using this command... and here's another.

"stuck" account  A person's account can sometimes be "stuck" in a signed-on state, giving the user the message "This account is already signed on" and emitting an entry like this in the log when the user tries to log in again. (This stack trace may be the cause of such an event; it occurred at about the same time a user reported it.)

posting doesn't always work  Here's a server stack trace from someone trying to reply to an existing post on a message board.

It's been reported that when an online game ends, one player returns to People Connection normally, while the other experiences a crash of the Q-Link client.

SQL errors  There are a lot of places where SQL statements are generated without proper hygeine (doubled single-quotes, &c.). Generally speaking, the whole database layer could use a rewrite.