E2 Client Developers (clientdev)

  • Do you think the Java Chatterbox is lame, and think you can do better?
  • Do you like the E2 node tracker, but think it can be improved?
  • Does your computer catch on fire from all the super buggy pre-alpha quality software you test?
  • Are you fluent in the programming language Ada?

If you said yes to any of those questions (except the last one - you need serious help if you know Ada that well), join clientdev so everyone can share in the misery together.

Clientdev Home

Venerable members of this group:

N-Wing, Devon, sleeping wolf, Toxick, jobby, rdude, jaybonci@, rycerice, Illumina, ascorbic@, call, ccunning, Oolong@+, wonko, Anml4ixoye, Ahab, Theus, Error404, spiregrain, in10se, ssd, elem_125, alisdair, Simpleton, dTaylorSingletary, kozmund, RPGeek, QuietLight, MALTP, BlakJak, StrawberryFrog, weivrorrim, Shatner's Bassoon, ariels, isogolem, themanwho, booyaa, jrn, OldMiner, jonas, DTal, in10se, quintopia, Old_New
This group of 44 members is led by N-Wing

This writeup was last updated: June 16, 2009

E2 Explorer

Current Version: 0.9 beta
Download Location: http://www.surveytome.com/e2/e2explorer/

Note to Users: I welcome any feedback about this client both good or bad


  • September 3, 2008 - New version released. See the changelog below for details.
  • June 20, 2008 - New version released. See the changelog below for details.
  • May 2, 2008 - Officially announced the E2 Annex which has some tie-ins with the client.
    New version released! See the changelog at the bottom of the writeup for a list of new features, updates, and bug fixes. Remember, new releases are based on user feedback, so please /msg me with any questions, comments, or complaints.
  • April 2, 2008 - Public beta released! Please read the FAQ (below) if you have any questions or run into any problems. Most problems are the result of users not having the Microsoft .NET Framework installed.

Ever wish you could...

  • ...categorize your bookmarks into folders?
  • ...vote on or C! a writeup even when you don't have any votes/cools left?1
  • ...easily pick out your friends (or foes) in the chatterbox, other users list, or in writeups?
  • ...have the chatterbox refresh itself, or that you could scroll back and look at the conversation you missed?
  • ...quickly remove a message from the chatterbox display because someone decided to add a URL, and it made the display too wide?
  • ...fully customize the appearance of the E2 web site?
  • ...easily find out what writeup received a vote after you receive the "You gained/lost 1XP" message (or even better, know when you get a vote even when you don't gain/lose XP)?
  • ...have New Writeups, Cooled Writeups, Editor Cools, and the other nodelets refresh automatically without having to reload the page?
  • ...get lists of your writeups with the highest and lowest reputation/upvotes/downvotes/C!s?
  • ...get up-to-the-minute statistics such as merit, devotion, addiction, node-fu, total or average reputation/upvotes/downvotes/C!s?
  • ...easily soft link your writeups without individually clicking all of the hard links and pipe links in your writeups?
  • ...compose, edit, or save your writeups offline?
  • ...get a list of the writeups you have voted on or C!ed?
  • ...remember what messages you sent to who and when you sent them?
  • ...easily view all of your deleted writeups in one place?
  • ...track the statistics of other writeups and users?
  • ...open any node in a scratch pad (not just your own), or save any node to disk?
  • ...help reduce E2's server lag?

Well now you can!

E2 Explorer: What is it?

The E2 Explorer is a full featured e2 client. This client is more than just a node tracker or chatterbox client, it allows you to do much of what you can do directly from E2, but adds more features and a customizable interface.

Some of you might be familiar with my old client, the E2 Link and Logger Client. The E2 Explorer is much different than the E2LnL in that it focuses more on using the Everything2 web site rather than just generating statistics and talking in the catbox. Nearly everything the average noder can do on E2 can be done within the client - read nodes, view nodelets, vote, C!, bookmark, chat, etc. Most of the user interface is browser-based, so it is easy and intuitive to use.

Some of it's major features include:

  • Browser - browse E2 in a web browser-like interface. You can perform almost any action that you would from the E2 web site
  • Chatterbox Client - chat in the auto-refreshing chatterbox, and scroll back for as long as you have been online to catch up on any conversation you missed
  • Node Tracker (your writeups) - track changes to your writeups and session including: XP, merit, C!s, totals, averages, and more.
  • Node Tracker (other nodes and writeups) - track any other user, node, or writeup to see how it changes over time. Fun for tracking your friends' writeups, or to see how the C! you just gave someone changes their reputation and XP.
  • Soft Linker - automatically soft link a writeup or node (not just your own).
  • Homenode List Generator - create lists and statistics about your writeups for use on your homenode such as: writeups with highest/lowest reputations, writeups with most cools, writeups with the most/least upvotes, etc.
  • Nodegel Visualizer - create a graph of your writeup reputations over time for use on your homenode.
  • Offline Scratch Pad - Write and save nodes on your computer for later publishing

On a related note, this client optionally (and on a voluntary basis) helps to feed the E2 Statistics Project located at the newly created E2 Annex(http://www.surveytome.com/e2/stats/). Please consider contributing to this project if you find it interesting or useful.


To use this client you will need the following:


General Features and Browser Interface

  • Easy to use browser-like interface
  • Supports multiple users/usernames
  • Customizable interface using skins (i.e., style sheets)
  • Multi-threaded
  • Automatically checks for updated versions
  • Displays nodelets including: new writeups, cooled writeups, editor cools, session information, other users, available rooms (all, not just outside, noder's nursery, and political assylum), chatterbox, and message inbox. Nodelets are auto-refreshed as appropriate (i.e., if there haven't been and new writeups for a while, the new writeups nodelet will refresh less frequently).
  • Lets you cast/queue votes and C!s even when you have spent your daily allotment. You can then submit them later.
  • (Nearly) instant notification of upvotes and downvotes (including what writeup received the vote), XP changes, level changes, cools, and new messages.
  • (Nearly) instant notification of stat updates including merit, devotion, addition, totals, and averages.
  • Toolbars for all node types including:
    • e2node - open my writeup, save, track, bookmark, add to favorites, soft link, and create writeup
    • writeup - open, save, track, soft link, vote, cool, bookmark, add to favorites, msg author, and mark author as friend/foe
    • superdoc - open, save, track, bookmark, and add to favorites
    • room - bookmark, add to favorites, visit
    • user - bookmark, add to favorites, or track
    • usergroup - bookmark, add to favorites, track
  • Allows you to mark users as Friends or Foes and highlights these users as appropriate to that you can easily pick them out in writeups, other users, and the chatterbox.
  • Allows you to add writeups to your "Favorites" which is basically an offline bookmark that can be grouped into folders.
  • Pipe Links and external links are distinguishable from normal Hard Links.

Node Tracker (Your Writeups), Nodegel Graph, and Homenode Lists

  • Node tracker tracks changes to your writeups over any period of time that you have been using the client. It will tell you changes in reputation, upvotes, downvotes, and C!s as well as listing the past or present status of your writeups.
  • Nodegel Graph displays your writeups by reputation over time in a graph that can be pasted onto your homenode.
  • Homenode lists are generated that can be pasted into your homenode including:
    • General User Statistics - including Minimum, Maximum, Total, and Averages for Reputation, Upvotes, Downvotes, Total Votes, and Cools; XP; Merit; Devotion; Addiction; Karma, and more.
    • Top X Writeups With The Highest Reputation
    • Top X Writeups With The Lowest Reputation
    • Top X Writeups With The Most Upvotes
    • Top X Writeups With The Least Upvotes
    • Top X Writeups With The Most Downvotes
    • Top X Writeups With The Least Downvotes
    • Top X Writeups With The Most Total Votes
    • Top X Writeups With The Least Total Votes
    • Top X Writeups With The Highest Upvote Percentage
    • Top X Writeups With The Highest Downvote Percentage
    • Top X Cooled Writeups With The Highest Reputation
    • Top X Cooled Writeups With The Lowest Reputation
    • Top X Non-Cooled Writeups With The Highest Reputation
    • Top X Writeups With The Most Cools
  • List of users you have give a C! to
  • List of users that have given a C! to you

Node Tracker (Other Writeups)

  • Track any node, writeup, or user and see how their stats change over time

Chatterbox Client

  • Auto-refreshes chatterbox content
  • Auto-refreshes Message Inbox
  • Auto-refreshes Other Users
  • Other Users are sortable by various options
  • Stores any number of messages so that you can scroll back and read things you missed
  • Saves your outgoing messages
  • Allows you to clear a message from the chatterbox (in cases where someone keeps repeating themselves, or adds a long message that made the display too wide)
  • Large, multi-line talk box
  • Utilized the "Friends" and "Foes" list to appropriately display messages for users.
  • Easily /msg, visit the homenode, add to friend/foes by clicking on someone's name
  • View, delete, or archive messages in your Message Inbox
  • Access the complete list of chatterbox commands (NOTE: not all commands can be used by all users)
  • View other users and what room they are in - see a friend in another room, just click to join them
  • Saves a transcript of recent chatter

Scratch Pad

  • Create, edit, and preview writeups either online or offline
  • Save copies to disk, or publish them directly to E2
  • Create Nodeshells
  • Customizable fonts and sizes
  • Soft link your writeups before or after you publish them
  • Supports all the new writeup types


  • The browser interface is fully customizable through the use of "skins". Users with knowledge of CSS can easily edit or create new skins.
  • I would love to hear from anyone who is good with CSS who is willing to create new skins for the client. You will receive full credit for them.

Other Features

  • Automatically downloads and displays your node heaven and node angels and their content for you to review.
  • Vote or C! writeups even when you don't have any votes or C!s (even if you are still level 1). Your votes and C!s will be saved until you have some to spend. If you decide to always save your votes instead of submitting them immediately, you can save them up until you have enough to spend your full daily votes and get the full XP bonus.
  • Votes are automatically saved so that you can go back and view them later. If you visit a writeup that you have voted on in the past, this information is saved as well.
  • View reputation/vote information for writeups (if you have voted on them) when you do a User Search on another user (E2 does not display this information).
  • Soft link a writeup, or all the writeups in a node automatically
  • Numerous customizable settings

Where to Get It, and What you Get

You can download the client from http://www.surveytome.com/e2/e2explorer/

The download is a self-extracting executable which contains the following:

  • E2Explorer.exe - the executable that runs the program. This is the file that you will double-click to start the client.
  • E2ExplorerDB.mdb - a Microsoft Access database. You do not need Access installed to use this program.
  • Skins Folder - this folder contains a stylesheet and several images used for the user interface

Technical Information

The entire application was coded in C#, and requires the Microsoft .NET Framework 2.0 (or higher) to run. Database connectivity is achieved with ODBC. While I referrenced my old client when creating this, nearly everything is re-written from scratch since this was such a huge change. The information that the client uses comes mainly from E2's XML Tickers or the xmltrue interfaces.

The database was created with Microsoft Access 2003. While Access has its limitations, I chose it because it requires no additional distributables or installations for it to work. If you have a copy of Microsoft Access, you are welcome to check out the structure of the database, but please note that I will not help you fix anything if you change the schema, or add, edit, or delete data manually. If you break it, just download a new copy.

Supported Node Types

Questions, Comments, Suggestions, Complaints...

...bugs, corrections, requests, RFEs, money, secrets, and anything else can be sent to me. Feedback (especially constructive criticism) is highly appreciated. If it is short, feel free to /msg me. Anything long can be emailed to "bestsellers AT consultant DOT com". If you are interested in helping with the documentation or in creating skins, images, or icons, please contact me as well.

Frequently Asked Questions

Below are some of the most frequently asked questions and their answers. Please note that most of the questions I receive are answered in this writeup or in the Help File, so please consult both of them first. To ask a question of your own, see the heading above for contact information.

This is, by far, the most commonly asked question:
Q. Why am I getting the error, "The dynamic link library mscoree.dll could not be found in the specified path..."?
A. You will receive this error if you have not installed the Microsoft .NET Framework. Please read the Requirements section above for information on how to install the framework.

Q. Can I view the source code?
A. I have not yet decided to release the source code. If I do, I will link to it from the download location (see above). Regardless, I would be glad to answer any questions on my algorithms, or general questions on how it all works.

Q. Will you add/change/improve Feature X?
A. Possibly. Maybe. There's still a lot that can be done with this application. I do take suggestions and feature requests, but I do all of this in my free time, so don't expect an immediate turn-around. I will most likely place a higher priority on the most common RFEs, so please provide feedback!

Q. Will you notify me when you release a new version or a patch?
A. The short answer: Yes. However, unless we are working closely together on a specific problem, I probably will not notify you directly. The application automatically checks for updates every time you log in with a connection to the Internet. In other words, I will notify you through the application itself. You are also free to visit this writeup at any time to see the current version and changelog.

Q. Why does your client sometimes work very fast, and sometimes very slow?
A. Whenever the E2 web site is experiencing a lag, the client will experience the same lag. You are free to log into a different E2 server (if you happen to know of the others) to try and alleviate the problem.

See Known Issues below for additional information.

Who uses the E2 Explorer Client?

The following people have contacted me to let me know that they use my client and/or have some of its output displayed on their homenodes (/msg me to get your name added).

As of the last time I looked, these users have output generated by the client on their homenodes.

DogDaze, E2D2, in10se, RPGeek

As of the last time I looked, these users do not have output generated by the client on their homenodes, but have reported that they use it for other purposes.

Aerobe, Ancientsnow, Apollyon, archiewood, Arviragus, AspieDad, Augustine, BookReader, chappyzoodle, cruxfau, darl, DTal, etgar, fidomaster, GhettoAardvark, golFUR, graceness, joshuarat, katherine, krenseby, lostneuron, mad girls love song, Mortuorum Dialogi, npecom, Oolong, passport, rp, Senso, shaogo, sirspens, StrawberryFrog, tWD, Two Sheds, vandewal, Venkman, waverider37, wertperch, Wntrmute, wordnerd

User Comments

Below are some selected user comments regarding the client. Be forewarned - anything you say, can and will be used against you in this writeup.

  • in10se says I love to talk to myself. And my client is better than a kick to the groin. Really! Give it a try!
  • mad girls love song says E2 Explorer is great. i can't tell you how awesome it is to be able to save things i want to vote on for when i have more votes.
  • fidomaster says This is brilliant - it really catches e2 up to the rest of the Internet. I've been wishing for this kind of functionality since I started lurking e2 almost five years ago. Kudos.
  • Bitriot says Damn, dude, you're a wizard
  • Apollyon says This is unfathomably good. for about three or four minutes I just stared agog at the home page. well done.
  • wertperch says This thing is GOOD
  • Apollyon says You deserve a medal for your efforts here, really. I'm thinking the E2 equivalent of a military cross.
  • Send me your comments!

Known Issues

Known problems with the client will be listed here. I will work on fixing bugs, or requesting that edev add patches to E2.

  • Random Nodes has not been coded yet.
  • Some characters might display strangely due to character encoding issues. Typically this happens when a noder creates their writeups in a word processing program and then copies and pastes it into E2. I will work on specific issues as they are reported.
  • Send me any bugs you have found. Remember, this is beta software!


Thanks to the following for inspiration and ideas from projects they have created for the E2 community:
cow of doom, dann, fuzzie, JeffMagnus, N-Wing, Pyrogenic, Simpleton (e2interface gave me so many ideas), and wick

Thanks also go to golFur who was my original beta tester


This lists changes since the release of the public beta. Older changes can be found at the E2 Annex.

Version 0.9.20080903

  • significantly decreased node load times
  • decreased the number of requests to E2 by improving cachinggetblanknodes()
  • bug fix: If a writeup was deleted before cached votes for that writeup were submitted, the cached votes could not be removed
  • can view list of unvoted writeups (Voting and C!s->Voting Ideas)
  • upvotes and downvotes were being overwritten improperly in certain cases
  • fixed bug in Super Soft Linker

Version 0.9.20080620

  • Ability to delete friends and foes
  • Improved DB/memory caching features
  • Added an easter egg
  • Updated welcome page
  • Numerous optimizations and bug fixes

Version 0.9.20080502

  • Identifies all writeups you have voted on (takes time depending on the number of votes you have spent - see Voting Oracle)
  • New welcome page
  • Streamlined some of the background processes
  • Fixed a minor bug with one of the homenode lists: 'total votes' was displaying 'total downvotes'
  • Added code to better handle Nothing Found, Permission Denied, and Findings: nodes in the node cache
  • Added support for node_id searching.
  • Better support for the E2 Node Statistics Project
  • Various optimizations and bug fixes
  • Send me your comments and suggestions to help make this client better

Version 0.9.20080408

  • Added proxy support to the login screen
  • Added a Back button to the browser
  • Added link to the chatterbox client from the chatterbox nodelet and message inbox nodelet
  • Added the ability to choose a new theme
  • Fixed bug in configurations where theme was not displayed, so if changes were saved, the stylesheet was removed. This problem would correct itself if you logged out, and logged back in, but it was annoying.
  • Minor interface changes
  • Fixed a minor issue with calculating estimated statistics in the User Search interface (dealt with cached node values)

1 Okay, technically you can't vote on or cool something if you don't have any votes or cools left, but the client will save your votes and cools and allow you to submit them later. That way you don't forget all those great writeups by the next day.

Now that E2 has it's own auto-refreshing chatterbox, this is no longer as useful as it used to be...

Notelet Nodelet Squawkbox Client

Version: 1.0 (released July 2, 2003)
Download location: http://www.pitt.edu/~rttaylor/e2/squawkboxclient.js

Note to readers: I welcome any feedback on this code - good or bad.

What is it?

Yet another Notelet Nodelet Utility.

The Notelet Nodelet Squawkbox Client is an auto-refreshing chatterbox client. Unlike many other chatterbox clients, this one works directly within E2 as opposed to running a separate application, or opening another browser window.

As the name implies, the client uses the combination of the Notelet Nodelet and the squawkbox to do all of this. A single JavaScript file "glues" these resources together. Once you have set it up, you simply navigate to the squawkbox through a link or the search box, and the script automatically starts working.

How do I set it up?

First, you need to make sure you have some hard drive or web space to save a file to. You then create a .js file named squawkboxclient.js and include the source code listed below (or download it from the location specified at the top of this writeup). Then just upload the file to your web site or to a specific location on your computer.

Next, make sure you have the Notelet Nodelet turned on. You can do this by selecting it from your User Settings under the Nodelets heading. Once you have turned it on, you should see it in the column on the right with all the other nodelets. You then add the single line of code specified below to your notelet.

You're done! Just go to squawkbox and try it out.

Source Code

The .js Code

The squawkboxclient.js file should contain the following code:
// nodetitle is case sensitive
var nodetitle = 'squawkbox';

// you can change this to whichever server you use
var e2server = 'http://everything2.com';

// feel free to remove this link to the squawkbox
document.write('<a href="/?node=squawkbox">Open the Squawkbox</a>');

// only refresh the page if the user is at the squawkbox so that
// normal E2 use is not disrupted by unwanted refreshes
if (document.title == nodetitle + '@Everything2.com')
    // the refresh time is in milliseconds so 1000 = 1 second
    // (i.e., 60000 = 1 minute)
    // change it as you see fit, but don't make it too low or you 
    // may overload the server
    setTimeout('refresh()', 60000);
function refresh()
    // don't refresh if the user is in the middle of typing a message
    if (document.forms[2].message.value == '')
        document.location.href = e2server + '/?node=' + nodetitle;

Notelet Nodelet Code

If you saved the .js file to a web site, go to the Nodelet Editor to add the following HTML tag:

<script type="text/javascript" src="http://www.mydomain.com/squawkboxclient.js"></script>

Where http://www.mydomain.com/squawkboxclient.js is the URL of the JavaScript file you uploaded.

If you saved the .js file to your hard drive, go to the Nodelet Editor to add the following HTML tag:

<script type="text/javascript" src="file:///c:/mydocuments/squawkboxclient.js"></script>

Where c:/mydocuments/squawkboxclient.js is the file system path of the JavaScript file you saved to your hard drive.

If you are really pressed for space in your notelet with either of these methods, you can probably leave off the type="text/javascript" attribute.

Testing it out

If you want to "try before you buy", you may enter http://www.pitt.edu/~rttaylor/e2/squawkboxclient.js for the URL in your notelet. If you like it, please download your own copy, as I don't need hundreds of requests to that server. Note that the test file uses everything2.com as the primary server, so if you typically use another server, you will be taken to http://everything2.com after the first refresh.

Words of Wisdom

Please be respectful and consciencious when using this. Do not leave your browser on the squawkbox if you are not chatting (or at least actively lurking). Do not set your refresh interval to low, or you may bog down the server.

Frequently Asked Questions

Q. Are there any compatibility issues?
A. I tested this with Mozilla 1.3, Internet Explorer 6, and Netscape 7 and found no problems. Please let me know if this does not work with your browser, and I'll see what I can do.

Q. If it refreshes on a timer, won't that cause it to sometimes refresh while I'm in the middle of typing a message?
A. No. The script checks to see if there is any text in the message field before refreshing. If so, it stops, and it is then up to you to press Talk.

Q. I am a super elite uber-god content editor edevite, so have plenty of room in my notelet for your entire source code, but when I tried it, it didn't work. Why?
A. The source code references the document forms array through the use of square brackets ([ ]). Obviously this is how hard links are made, so it gets messed up. If anyone knows how to get around this, I'd love to hear it.

Q. Will you add Feature X to your client?
A. Maybe. Feel free to send me RFEs.

Q. Why?
A. Because.

1 Apparently it doesn't work from GeoCities.
2 Thanks m_turner for this idea.

		[jmweeks@winston ~/bin]$ ./generate_e2_docs
		Downloading old revision (0.33; 0.33)...
		Generating diff:
			t h e  m o d u l e s → Method list
		Generating documentation...

User-Agent: e2interface-perl/0.34 (Linux 2.4.20 i686 GNU/Linux)
Content-Type: text/html
Last-Modified: Thu, 07 Aug 2003 17:33:33 GMT
X-Project-Homepage: http://joseweeks.com/e2interface
X-Support-Email: <jose@joseweeks.com>


...because you know you want to script e2.

i n t r o

e2interface is a set of Perl modules that make it simple, often trivial, to post data to and retrieve data from everything2.com. If you are writing an e2 client of any sort, if you wish to create a proxy between e2 and any obscure protocol or encumbrance, if you wish to include e2 data in a dynamic website, if you want to run perl -e one-liners from the command line that fetch e2 data and funnel it into one program or another, e2interface might simplify your task profoundly. If you enjoy wrestling with XML parsers and URL encoding and quirks in the system, e2interface will probably ruin all your fun.


e2interface is object-oriented, it's portable, it's simple to use, and it's public domain. And, since code audits are going to be necessary for any widely-used e2 client, it provides a centralized point that handles your sensitive data, that, without user-interface or other extraneous code, can be easily audited, and that, since it is written in an interpreted rather than compiled language, you can be confident is not host to some clever compiled-in trojan.

Okay, kids, that's the pitch, the fast sell, and whether you bought it or not, I think it's time (this being Perl, after all) to get our hands right down in the grease. Well, first I'm gonna go into your standard disclaimer section, which you can probably skip right over.

t h e   f i n e   p r i n t


  • perl 5.006
  • expat (http://www.jclark.com/xml/expat.html). expat is packaged with ActiveState's Windows perl distribution; for others, expat can either be built from source or (in most cases) installed from binary packages. On my debian system, installation is a simple apt-get install expat expat1-dev.
  • The perl modules XML::Twig and LWP (see installation below)

Requirements for threading support:

  • perl 5.8.0


e2interface is now available on CPAN. To install from CPAN, type the following:

    bash$ perl -MCPAN -e shell
    cpan> install E2::Interface

Module dependencies should be resolved automatically.

Manual Installation:

  1. Download the tarball: http://joseweeks.com/e2interface/E2-Interface-0.34.tar.gz.
  2. Extract the package (e.g. tar xzf E2-Interface-0.34.tar.gz
  3. cd to the directory you've just created, and type the following:
        bash$ perl Makefile.PL
        bash$ make
        bash$ make test
        bash$ make install

    You'll probably have to be root to complete the make install.

If you're on a system that does not have a make executable (say, for example, windows), and you don't want to install one, you can instead do the following:
  1. Create a directory called "E2" somewhere in your perl path
  2. Extract all the files that end in .pm from the tarball to the directory you've created.

f u n d a m e n t a l s

Okay, so, the code....


	use E2::Interface;
	my $e2 = new E2::Interface;
	$e2->login( $user, $pass );
	print "Hello, " . $e2->this_username . ", you are currently ";
	if( ! $e2->logged_in ) { print "NOT "; }
	print "logged in.\n";

And that, folks, will either print Hello, $user, you are currently logged in. or Hello, Guest User, you are currently NOT logged in., based on whether or not $user and $pass were accepted by the e2 server. Of course we could have checked the return value of login to test for the same thing if we really were into the whole brevity thing.

But anyway, this is E2::Interface, which is the base class to this whole set of modules. It'll log you in, log you out, handle all the funky HTTP/cookie/useragent complexities, manage background threads, clone ... well, we'll get to that heavy stuff later. For now we'll move onto things that are a little more immediately-useful.

....like E2::Node and E2::Ticker, which represent the two branches of e2interface. That is, those modules that load data from the nodegel proper (E2::Node and its descendants), and those modules that load data from special XML Tickers (E2::Ticker and its descendants). All the really useful classes fall into one of these two categories.


	use E2::Node;
	my $node = new E2::Node;
	$node->login( "username", "password" ); # Inherited from E2::Interface
	# Load some arbitrary node and print its generic node info.
	if( $node->load( "Butterfinger McFlurry" ) ) {
		print   "Title:      " . $node->title;
		print "\nAuthor:     " . $node->author;
		print "\nCreatetime: " . $node->createtime;
		print "\nNode type:  " . $node->type . "\n";

The preceding code should output the following:

Title:      Butterfinger McFlurry
Author:     donfreenut
Createtime: 2001-03-12 17:25:41
Node type:  e2node

(title, author, and createtime correspond to the title, author (creator) and creation time of the node in question. That is, the whole node, as opposed to, say, particular writeups in that node.)

Now, E2::Node deals with "nodes" in the generic sense of the word. That means it deals with e2nodes (those nodes that can contain writeups), writeups, superdocs, users, usergroups, rooms, documents, whatever. Don't confuse E2::Node with E2::E2Node, which deals, in particular, with e2nodes and writeups.

What E2::Node is all about is loading nodes, which it does with the following methods: load, load_by_id, and load_from_xml. The first two fetch a page based on either title or node_id (and, optionally, type—see the documentation for E2::Node below), and then all three parse the document they've received and populate a bunch of internal variables, which we can then retrieve via the access methods.

So is E2::Node just one of those generic superclasses that you never instantiate on its own? Well, not really. I mean it is a generic superclass, but it's also smart enough to determine, while loading a node, just what type of node it's loading. Say, in the above example, $node is aware that it is, itself, an object of the E2::Node class rather than one of its descendants. While loading "Butterfinger McFlurry," it discovers that the node it's loading is an e2node. It then re-blesses itself into the appropriate subclass (in this case, E2::E2Node). This class-change only takes place on instances of E2::Node (if one of its subclasses tries to load a node of an incompatible type, it throws an exception—see below for an explanation of e2interface's exception-handling mechanism).

Besides allowing access to information stored in nodes, certain specific nodetypes have particular actions associated with them (example: e2nodes can be created and can have writeups added to them). These are implemented in the appropriate subclass of E2::Node.


	use E2::Ticker;
	my $ticker = new E2::Ticker;
	# List New Writeups
	print "New Writeups:\n";
	print "-------------\n";
	foreach( $ticker->new_writeups ) {
		print "$_->{title}\n";
	# List Other Users
	foreach( $ticker->other_users ) {
		print $_->name;
		print '$' if $_->{editor};
		print '@' if $_->{god};

E2::Ticker is basically a collection of subroutines that fetch tickers, parse them, and return lists of hashrefs that represent the values listed in those tickers. Occasionally, tickers pass values not associated with any member of the list (example: the Time Since ticker returns the current time, which, after a call to time_since to fetch a list of values, can be retrieved with a call to time_since_now). Those tickers that require a more complex interface are implemented as subclasses to E2::Ticker.


Error-handling in e2interface is implemented using Perl's exception mechanism, eval{ } and Carp::croak. For anything more serious that a boolean "this method was unsuccessful" return, an exception will be thrown. The main exceptions are the following:

Usage error, method called with improper parameters. (e.g. a bug in the caller's code). A description of proper usage of that message follows after the colon.
'Unable to process request'
HTTP communication error.
'Invalid document'
Invalid document received.
'Parse error:'
Exception raised by XML parser. The error XML::Twig generated will follow after the colon.
'Wrong node type:'
Attempted to load an incompatible node type (trying to load an e2node with E2::User, for example, would generate one of these). The (invalid) type is listed after the colon. NOTE: This exception will only be thrown by E2::Node and its descendants.

Each exception is returned as a string. They can be tested for with regexps, for example:

/^Parse error: (.*)/

The exceptions that have names ending in colons have more specific data following that colon. Also, all exceptions are generated by calls to Carp::croak( "..." ), so they contain line number information at the end of the string. In other words, when testing for exceptions, always test the beginning of the string.

	my $user = new E2::User;
	# Try...
	eval {
		if( !$user->login( $user, $pass ) {
			print "Unable to login.";
		} else {
			$user->load( $user->this_username );
			print "Your XP number is " . $user->experience . "\n";
	# Catch...
	if( $@ ) {
		if( $@ =~ /^Unable to process request/ ) {
			print "Network exception caught: $@\n";
		} elsif( $@ =~ /^Parse error: (.*)/ ) {
			print "Parse exception caught: $@\n";
		} else {
			print "Unknown exception: $@\n";

We could also replace the "catch" part of the example with the following:

	&handle_exception( $@ ) if $@;
	# ...
	sub handle_exception {
		my $exception = shift;

NOTE: An unhandled exception will terminate your program's execution.


Network access is slow. Methods that rely upon network access may hold control of your program for a number of seconds, perhaps even minutes. In an interactive program, this sort of wait may be unacceptable.

(If this section seems confusing, you can safely ignore it. It was added to the library to address a specific shortcoming in perl (the kludge required to share objects across threads), and if you don't need threading, you really don't need to know any more from this section.)

e2interface supports a limited form of multithreading (in versions of perl that support ithreads--i.e. 5.8.0 and later) that allows network-dependant members to be called in the background and their return values to be retrieved later on. This is enabled by calling use_threads on an instance of any class derived from E2::Interface (threading is cloned, so use_threads affects all instances of e2interface classes that have been cloned from one-another). After enabling threading, any method that relies on network access will return (-1, job_id) and be executed in the background.

This job_id can then be passed to finish to retrieve the return value of the method. If, in the call to finish, the method has not yet completed, it returns (-1, job_id). If the method has completed, finish returns a list consisting of the job_id followed by the return value of the method.

A code reference can be also be attached to a background method, using the thread_then method.

A simple example of threading in e2interface:

	use E2::Message;
	my $catbox = new E2::Message;
	$catbox->use_threads;	# Turn on threading
	my @r = $catbox->list_public; # This will run in the background
	while( $r[0] eq "-1" ) { # While method deferred (use a string
				 # comparison--if $r[0] happens to be
				 # a string, you'll get a warning when
				 # using a numeric comparison)
		# Do stuff here........
		@r = $catbox->finish( $r[1] ); # $r[1] == job_id
	# Once we're here, @r contains: ( job_id, return value )
	shift @r;			# Discard the job_id
	foreach( @r ) {	
		print $_->{text};	# Print out each message
Or, the same thing could be done using thread_then:
	use E2::Message;
	my $catbox = new E2::Message;
	# Execute $catbox->list_public in the background
	$catbox->thread_then( [ \&E2::Message::list_public, $catbox ],
		# This subroutine will be called when list_public
		# finishes, and will be passed its return value in @_
		sub {
			foreach( @_ ) {
				print $_->{text};
			# If we were to return something here, it could
			# be retrieved in the call to finish() below.
	# Do stuff here.....
	# Discard the return value of the deferred method (this will be
	# the point where the above anonymous subroutine actually
	# gets executed, during a call to finish())
	while( $node->finish ) {} # Finish will not return a false
				  # value until all deferred methods
				  # have completed 

t h e   m o d u l e s

This document, this writeup, is intended as a supplement to the more extensive documentation in the modules themselves, which should be accessible in man pages titled according to the package names (example: man E2::Interface). Their HTML equivalents are available at http://joseweeks.com/e2interface/.

What follows is a list of all the modules in e2interface and all of their public methods, and then a couple example scripts to show the package in action.

Inheritance map

                 /                                      \
            E2::Node                                E2::Ticker
               /\                                    ____/\
              /  \_______                           /    \ \______
         ____/\   \      \                     E2::Search \ \     \
        /      \   \  E2::User                            /  \  E2::Message
    E2::E2Node /    \                                    /    \
              /     /\_____                  E2::UserSearch   /\___
     E2::Writeup   /  \    \                                 /  \  \   
                  /    \ E2::Usergroup                      /    \  E2::Session
       E2::Superdoc     \                      E2::ClientVersion  \
                      E2::Room                                  E2::Scratchpad

Method list

    attempts to login to Everything2.com with the specified USERNAME and PASSWORD.
    can be called after setting cookie to verify the login.
    attempts to log the user out of Everything2.com.
    process_request HASH
    requests the specified page via HTTP and returns its text.
    clone OBJECT
    copies various members from the E2::Interface-derived object OBJECT to this object so that both objects will use the same agent to process requests to Everything2.com.
    debug [ LEVEL ]
    sets the debug level of e2interface.
    return the name of this client, "e2interface-perl".
    returns the version number of this client.
    returns the username currently being used by this agent.
    returns the user_id of the current user.
    domain [ DOMAIN ]
    returns, and (if DOMAIN is specified) sets the domain used to fetch pages from e2.
    cookie [ COOKIE ]
    returns the current everything2.com cookie (used to maintain login).
    agentstring [ AGENTSTRING ]
    returns and optionally sets the value prependend to e2interface's agentstring, which is then used in HTTP requests.
    returns the text of the last document retrieved by this instance in a call to process_request.
    returns a boolean value, true if the user is logged in and undef if not.
    use_threads [ NUMBER ]
    creates a background thread (or NUMBER background threads) to be used to execute network-dependant methods.
    These methods disable e2interface's threading for an instance or a set of cloned instances.
    finish [ JOB_ID ]
    handles all post-processing of deferred methods, and returns the final return value of the deferred method.
    thread_then METHOD, CODE [, FINAL ]
    executes METHOD (which is a reference to an array that consists of a method and its parameters, e.g.: [ \&E2::Node::load, $e2, $title, $type ]), and sets up CODE (a code reference) to be passed the return value of METHOD when METHOD completes.
      These methods return, respectively, the title of the node, the node_id, the author, the user_id of the author, the createtime (in the format "YYYY-MM-DD HH:MM:SS"), or the type, of the current node. They return undef if there is no node currently loaded.
      Boolean: "Does this node exist?"
      load TITLE [, TYPE ] [, SOFTLINK ]
      load_by_id NODE_ID [, SOFTLINK ]
      load_from_xml XML_STRING
      These methods load a node based upon, respectively, TITLE, NODE_ID, or XML_STRING. They populate a number of internal variables, which are accessable through the access methods listed above.
      is used enable nodetype autodetection on an object that would normally not allow it.
        clears all the information currently stored in $node.
        Boolean: "Does this node have a writeup by me in it?"; "Is this node softlocked?"
        These methods return a list of softlinks, firmlinks, or sametitles.
        returns a list of E2::Writeups corresponding to the writeups in the currently-loaded node. It returns an empty list if this node contains no writeups, and undef if there is no node currently loaded.
        get_writeup [ NUM ]
        get_writeup_by_author AUTHOR
        These methods return references to E2::Writeup objects. get_writeup returns the NUM'th writeup in the current node (or, if NUM is not specified, the writeup immediately succeeding the last writeup returned by get_writeup). get_writeup_by_author returns the writeup in the current node that was written by AUTHOR. get_my_writeup returns the writeup in the current node written by the currently-logged-in user. See the E2::Writeup manpage for information about accessing writeup data.
        returns the number of writeups in the current node. Returns undef if there is no node currently loaded.
        returns the number of the next writeup that get_writeup will, by default, return. Returns undef if there is no node currently loaded.
        vote NODE_ID => VOTE [ , NODE_ID2 => VOTE2 [ , ... ] ]
        votes on a list of writeups. There should be a NODE_ID => VOTE pair for each writeup to vote upon. NODE_ID is the node_id of the writeup, and VOTE is either -1 or 1, (downvote or upvote, respectively).
        add_writeup TEXT, TYPE [ , NODISPLAY ]
        adds a new writeup to the current node. TEXT is the text of the writeup, TYPE is the type of writeup it is (one of: "person", "place", "thing", or "idea"), and NODISPLAY, if true (it defaults to false), tells E2 not to display this writeup in "New Writeups". It returns true on success and undef on failure.
        create TITLE
        creates a new node (a "nodeshell") of title TITLE, then loads this new node.
        clears all the information currently stored in $writeup. It returns true.
        These methods return, respectively, the writeup's type, its parent's title, its parent's node_id, its "marked for destruction" status (boolean: is it marked for destruction?), the number of C!s it has received, and the text of the writeup.
        returns a list of the users who've cooled this writeup.
        returns a hashref concerning the reputation of this writeup.
        cool [ NODE_ID ]
        attempts to cool (C!) a writeup. If NODE_ID is specified, it attempts to cool the writeup with that id, otherwise it attempts to cool the currently-loaded writeup.
        vote -1 | 1
        attempts to vote on this writeup (-1 for a downvote, 1 for an upvote).
        reply TEXT [, CC ]
        sends a "blab" message reply to the author of the currently-loaded writeup. If CC is true, it sends a copy of the message to you, the sender.
        update TEXT [ , TYPE ]
        updates the currently-loaded writeup. TYPE, which defaults to the type the writeup was prior to the update, is the type of writeup this is (one of: "person", "place", "thing", or "idea"). During the update, the writeup is re-loaded, so any changes should be immediately visible in this object.
        These return, respectively, the username, user_id, the time of account creation, and the last time the specified user was seen on E2.
        These return, respectively, the username and user_id of this user's alias (for message forwarding) if he indeed has one.
        returns the text of the "User Bio" section of the user's homenode.
        These return, respectively, the XP number of the user in question, the level number, and the level including description text ("13 (Pseudo God)", etc.).
        These return, respectively, the number of writeups written by the user in question, and the number of C!s he has spent.
        returns a relative URL to the homenode image of the user in question.
        These return the name and id, respectively, of the most recent node written by this user.
        These return the strings that are displayed in the user's homenode regarding his mission drive, specialties, motto, and his employer or school.
        returns a list of hashrefs corresponding to the groups which this user is a member. It only lists membership in 'gods', 'Content Editors', and 'edev'. Hash keys include 'title' and 'id'.
        returns a list of hashrefs corresponding to the nodes that this user has bookmarked. Hash keys include 'title' and 'id'.
        clears all the information currently stored in $superdoc.
        returns the superdoc text of the currently-loaded superdoc.
        clears all the information currently stored in $room.
        returns the description string of the currently-loaded room. It returns undef if no usergroup is loaded.
        returns a boolean value: whether or not the currently-logged-in user can enter this room.
        clears all the information currently stored in $group.
        returns the description string of the currently-loaded usergroup. It returns undef if no usergroup is loaded.
        returns a list of hashrefs corresponding to each member of the currently-loaded usergroup. It returns an empty list if the usergroup has no members, and undef if no usergroup is loaded.
        returns a list of hashrefs corresponding to each item in the currently-loaded usergroup's weblog.
      new_writeups [ COUNT ]
      fetches the New Writeups ticker from everything2 and returns a list of hashrefs (sorted reverse-chronologically). If COUNT is specified, it returns "COUNT" values, otherwise it returns the server's default count.
      other_users [ ROOM_ID ]
      fetches the Other Users ticker from everything2 and returns a list of hashrefs (sorted by descending XP). If ROOM_ID is specified, only users in the specified room are listed.
      fetches the Random Nodes ticker from everything2 and returns a list of hashrefs.
      cool_nodes [ WRITTEN_BY ] [, COOLED_BY ] [, COUNT ] [, OFFSET ]
      fetches the Cool Nodes ticker from everything2 and returns a list of hashrefs (sorted reverse-chronologically). Results can be filtered by "WRITTEN_BY" and "COOLED_BY", which should be usernames. If COUNT is specified, this method returns "COUNT" values. COUNT has a server default of 50, and a max of 50 as well. OFFSET specifies how many values back to start in the list, and is used for paging through Cool Nodes.
      fetches the Editor Cools (or "Endorsements") ticker from everything2 and returns a list of hashrefs (sorted reverse-chronologically). If COUNT is specified, it returns "COUNT" values, otherwise it returns the server's default count.
      time_since [ USER_LIST ]
      fetches the Time Since ticker and returns a list of values. If USER_LIST is not specified, it returns a list with one value, that corresponding to the currently-logged-in user.
      returns a list of available rooms. The first item in this list is the "go outside" superdoc.
      best_users [ NOGODS ]
      returns a list of Everything2's Best Users. If NOGODS (boolean) is specified, site admins are not included in the listing.
      node_heaven [ NODE_ID ]
      returns a list of the currently-logged-in user's node heaven (deleted writeups). If NODE_ID is specified, it returns a list with a single element, the deleted writeup corresponding to that NODE_ID. If the specified NODE_ID is not a deleted writeup, or if the user has no deleted writeups, this method returns an empty list.
      returns a list of maintenance nodes (example: "E2 Nuke Request").
      returns a hashref to the current user's "raw vars" hash on E2. It consists of a number of key/value pairs.
      loads the site-independant list of ticker nodes. E2::Ticker holds its own default list, but extremely paranoid clients can call load_interface to make sure it's using the up-to-date list of ticker interfaces.
      returns the list of xml interfaces used to load xml tickers. It returns a hashref with keys corresponding to the names of the interfaces and values corresponding to the node title of the corresponding ticker.
      returns the "random wit" that was fetched by the last call to random_nodes. Returns undef if none have been fetched.
      returns the "now" value returned by the last call to time_since. Returns undef if that method has not been called.
      use_string STRING
      can be used to load a ticker from an XML string rather than the everything2.com server. It's used internally for debugging the tickers, and can be used to cache ticker pages (see E2::Interface::document).
        returns the current public room's topic. This topic is updated as a side-effect to both list_public and set_room, so if neither of these methods have been called, topic will return undef.
        returns the current room name.
        returns the current room's node_id.
        fetches and returns any public messages in the current room that have been posted since the last call to list_public, as well as updating the topic, room, and room_id.
        list_private [ DROP_ARCHIVED ]
        fetches and returns any private messages that have been posted sincethe last call to list_private. If DROP_ARCHIVED is true, only messages that do not have the 'archive' flag will be returned.
        resets the public message ticker, so the next call to list_public will retrieve all available public messages (they will all be considered "unfetched").
        resets the private message ticker, so that in the next call to list_private, all private messages will be considered "unfetched."
        send MESSAGE_TEXT
        sends "TEXT" as if it were entered into E2's chatterbox. This message need not be escaped in any way. It returns true on success and undef on failure.
        sends the private "blab" message MESSAGE_TEXT to user_id RECIPIANT_ID. If CC is true, sends a copy of the message to the sender as well. Returns true on success and undef on failure.
        archive MSG_ID_LIST
        unarchive MSG_ID_LIST
        delete MSG_ID_LIST
        These methods archive, unarchive, or permanently delete the messages in MSG_ID_LIST (this is a list of message ids).
        perform HASH
        performs multiple archive, unarchive, and delete operations on a list of messages.
        set_room ROOM_NAME
        changes the current public room to ROOM_NAME. It returns true on success, 0 if ROOM_NAME is already the current room, and undef on failure.
        $search->search KEYWORDS [, NODETYPE ] [, MAX_RESULTS ]
        performs a title search and returns a list of hashrefs to the titles found (with "title" and "node_id" as keys to each hash). NODETYPE is the type of node intended ("e2node" is default; other possibilities include "user", "group", "room", "document", "superdoc", and possible others). MAX_RESULTS (if set) is the maximum number of results to return.
        writeups [ USERNAME ] [, SORT_BY ] [, COUNT ] [, START_AT ]
        does a "writeups by user" search on the user (USERNAME defaults the username of the currently-logged-in user; if no user is logged in, USERNAME must be specified or a "No username specified" error is thrown) for COUNT number of writeups (defualt is 50), starting at START_AT (which is an offset from the highest writeup as ranked by SORT_BY--more on that later), which defaults to 0. If -1 is passed as the COUNT, this method will fetch ALL writeups by the specified user. For many users, this would be a pretty big hit on the database. The suggested method is to space calls to writeups over a period of time, perhaps only displaying a page at a time/etc. When you receive less writeups than you asked for, you'll have hit the final page of the writeups search.
        sort_results [ SORT_BY ] [, COUNT ] [, START_AT ]
        sorts and returns a list of writeups (E2::Writeups) fetched from e2 by writeups. COUNT is the maximum number of writeups to fetch (-1 for ALL, which is the default), START_AT is an offset from the highest ranked writeup (ranked by SORT_BY), which defaults to 0.
        compare OLD_USER_SEARCH
        compares this E2::UserSearch with another, returning a list of hashrefs corresponding to each writeup that differs between the two.
        returns statistical information about this usersearch. This is loaded by calling compare.
        clears all stored session values.
        fetches the personal session from e2 and makes available all of the access methods below. If a user is not logged in, the only session information fetched will be the servertime (retrievable via time) and this user's username and user_id (retrievable via this_username and this_user_id, which are inherited from E2::Interface).
        These methods return the user's number of votes left today, number of cools left today, their current experience number, their current number of writeups, and the current server time. Example server time: "Sun Mar 16 15:58:20 2003".
        These methods return values corresponding, respectively, to whether the current user has been borged and whether the current user has been forbidden to post writeups. Both return boolean values, but forbidden, if true, is a text string describing the lock.
        returns the user's change in experience since that previous time he updated his user session (or loaded an epicenter nodelet). It is only defined if either the user's experience number or writeup count has changed since the previous update.
        returns information about requirements the user must meet to reach the next level. It is only defined if either the user's experience number or writeup count has changed since the previous update (either by a call to update or by loading the epicenter nodelet).
        fetches the list of registered clients from e2.
        returns a hashref to the information about registered clients on e2.
        load [ USER_ID ]
        fetches a user's scratchpad.
        update [ TEXT ] [, SHARE ]
        If TEXT is specified, this method updates the text of the currently-logged-in user's scratchpad. If SHARE is specified, it tells the server whether this scratchpad is to be publicly shared or not.
        These methods return, respectively, the boolean: "Is this scratchpad publicly shared?"; the username of the user to whom this scratchpad belongs, and the text of this scratchpad.

e x a m p l e   c o d e


	# shownode.pl
	# fetches and prints a node
	use E2::E2Node;
	my $title = shift or die "Usage: shownode.pl TITLE\n";
	$node = new E2::E2Node;
	# Load node by title
	$node->load( $title );
	# Output node title
	print $node->title . "\n--------------------\n\n";
	# Loop through writeups, printing them out as we go
	foreach( $node->list_writeups ) {
		print $_->title . " by " . $_->author . "\n\n";
		# Quick & dirty HTML -> text conversion
		# (ignores <pre>, tables, embedded lists, etc.)
		my $t = $_->text;
		# Paragraphs
		$t =~ s/\s+/ /sg;
		$t =~ s/\s*<br(>| .*?>)\s*/\n/isg;
		$t =~ s/\s*<p(>| .*?>)\s*/\n\n/isg;
		$t =~ s/<\/h.>/\n\n/ig;
		# Misc
		$t =~ s/<li(>| .*?>/\n    */isg;
		$t =~ s/<hr(>| .*?>/\n-----\n/isg;
		# Bold, italic, etc.
		foreach( qw/b strong/  ) { $t =~ s-<$_>(.*?)</$_>-*$1*-isg }
		foreach( qw/i em cite/ ) { $t =~ s-<$_>(.*?)</$_>-/$1/-isg }
		# Remove the other tags and convert entities
		$t =~ s/<.*?>//sg;
		$t =~ s/&gt;/</sg;
		$t =~ s/&lt;/>/sg;
		$t =~ s/&amp;/&/sg;
		# Print
		print "$t\n\n--------------------\n\n";
	# Output softlinks
	print "Softlinks:\n";
	foreach( $node->list_softlinks ) {
		print "($_->{title})  ";
	print "\n";


	# e2messages.pl
	# Fetches and prints unarchived private messages
	use E2::Message;
	my $user = shift;
	my $pass = shift;
	if( !$user || !$pass ) {
		die "Usage: e2messages.pl USERNAME, PASSWORD\n";
	my $msg = new E2::Message;
	# Log in;
	$msg->login( $user, $pass ) or die "Unable to log $user in\n";
	# Load all unarchived messages
	my @private = $msg->list_private( 1 ); # The "1" means "drop archived"
	if( ! @private ) {
		print "No unarchived messages.\n";
	print "Unarchived messages\n";
	print "-------------------\n\n";
	# Output the messages
	foreach( @private ) {
		print "($_->{group}) " if $_->{group};
		print "$_->{author}: $_->{text}\n";

Update - I wrote a caching e2 proxy. If you're in edev, you have the URL (check your inbox)... If you're not but you have a strong desire to see it in its horribly incomplete state, /msg s_alanet. And those of you viewing this page through the proxy... Salud! More information below under "The Implementation."


E2 has some problems. We've got a huge database to store, and hefty bandwidth requirements. We don't have the cash to buy a shiny cluster to host the site, or a bigger, phatter pipe to feed it through. There isn't really cash to hire full time developers or editors, though we have a lot of really wonderful volunteers that should be paid.

I was thinking about the whole distributing e2 thing, and I realized that we need a stopgap. An interim measure. Maybe a long term measure (after all, making a fully distributed e2 system is a big task - it might not be done for years!).

I was also thinking about the difference between e2 and a blog. I like my friend's blogs because they're very personal. I look at whose I want. If they're fancy I can have little discussion in the comment boards with my friends. I post stuff, they post stuff back - it's a lot of fun. But not very interesting for other people. E2 is the opposite - it's all about high quality writing for everyone to enjoy. If I post a story about my dog, it had better be good, not just some drivel that only people who have seen my dog will appreciate. Factual information - which would be boring on a blog - has a strong presence here.

We also have a lot of neat tools - the e2 node tracker, the E2 Nodegel Visualizer, and a lot of really cool clients.

How - I thought to myself - could these wonderful things be combined? It seems like they're all connected... but how?

And then it all came together.

The Idea

An Everything2 Hub - or an E2 Blog, or whatever you want to call it.

What I have in mind is a website that you can drop into your webspace on your ISP or university. It's a PERL or PHP script that automagically does everything to set itself up - a seed, so to speak. It probably uses flat files for maximum compatibility.

  • It provides a blog syched with your daylogs. You post as you see fit - it deals with making sure the right daylog writeup on E2 is appended to, edited, or created. Sort of a blogger for the E2 set. It also displays the blog entries (including converting hardlinks to href's).
  • It shows statistics relevant to you - latest writeups, for instance. People who are interested in you can hit your e2 hub and see what you've written. Optionally, more statistics could be available - most popular writeups, "goodest" writeups, least voted on writeups, etc.
  • It provides a cached view of E2. Click on a link in the blog and it'll take you to a cached view of the node. You only hit e2's server if you want to.
  • It provides "user services" to the owner of the blog. An integrated node tracker would be a good start (and pretty much a necessary feature to do the statistics). A nodegel visualizer would also be useful - in fact, there could be a whole subsection devoted to managing one's homenode. In addition, a scratchpad would be good (saving E2 from rendering lots of pageviews of the scratchpad), and the ability to make rough drafts of writeups, then upload them when they're ready, would be even better.

Basically what I'm talking about is a web-based client integrated with a web-based user info tool. A hub for your everything experience.

The Implementation

In the process of writing this thing, I've found some lingering XML malformations in E2's code. I've submitted patches for these. If you're using the e2hub and you get a blank page, it's probably because you hit a page with an unescaped character, like a bare & or something.

I also went through and cleaned a lot of stuff up in the code... It caches user information, nodes, and displays them. I'm about ready to call it 1.0 - I have a few issues with Simpleton's wonderful E2Interface library, mostly relating to me using it in ways it was not designed to be used, and when I clear those up, I'll be posting the code to the hub somewhere.

Last updated 15:52 23/2

So I've actually started to code some of the stuff mentioned here. Specifically, what I have at this point is a web-based caching E2 proxy. In other words, it grabs data from the various XML sources in the site to generate an e2-look-alike. It's got a 100 megs of cache space, and it keeps data cached for one hour. This is all tweakable. Right now it supports viewing nodes and users. If you try to view something else it will tell you to go back to E2 and look at it. The whole thing is templated.

This is the key to the hub concept, in my mind. Without a cache - without an interface to E2 - then I'm just talking about fancy newsletters. Now that I have a pretty solid cache implementation, I can really go somewhere.

If you have any questions, feel free to contact me.


It's also not hard to imagine such a tool being turned towards making E2 more approachable. How often have you heard, "It seems nice, but I just don't think I'd fit in..."? We are losing talented contributors every day because they don't know what to make of hot nude thespians. Sure, it's a part of E2's charm.... but we're reaching the end of where charm can take us. We need quality to reach the next stage of development.

How better to attract quality contributors for music writeups than a hub that focuses on, say, "Music Reviews"? Or a "Computer Science" hub that focuses on terminology and concepts? A "classical literature" hub? E2 is a big place. If we want to lure in experts and promote really quality writing, we're going to have to start filtering things to fit the audience. Metanodes are a good start, but they're not enough.

It should always be easy to start free-associating - clicking through the database, wherever the information flow takes you. But if we want to attract serious contributors, we need to be able to present them focused information.


There are a lot of other areas that this concept could be extended along - letting people check their messages from their hub, for instance, or making a hub "farm", sort of like Sourceforge does for software projects or LiveJournal does for blogs. Such a site could even charge people a small fee for advanced functionality, or faster service - thus helping E2 stay afloat.

Call for Comment

But of course, all this is just conjecture. I would like to make it, or something like it, a reality. E2 should live on! So please, if you have any comments, thoughts, or suggestions on this, drop s_alanet a message or e-mail me at <bgarney@purdue.edu>. I'll note them down here (as well as thanking you profusely for your willingness to tolerate my ramblings :). If you are struck by the urge to start coding this, talk to me, too... I'd like to help (I don't have time to write it on my own).

And the responses come in...

Ouroboros says re Everything2 Hubs: like a "distributed" E2?
you said "re hubs: Except here we have everyone talking to a central server. On Making E2 Distributed, I was talking about a fully distributed, peer to peer model. This is just a bit more hierarchical."
(That is to say, this is an extension to the existing architecture whereas distributed e2 in my mind is a total redesign.)

PhillC sez re: Hubs. I like the idea, but perhaps the easiest 4 hubs would be E2 People, E2 Places, E2 Ideas, E2 Things. They could all be easily pulled from the DB.
you said "re hubs: True... Though given the arbitrary nature of the people/place/idea/thing distinction, I think topical hubs would be more useful."

HongPong sez:

well i think it would be good to get better clients available for everyone. there is no good reason for scratch pads. however i think it will be more effective to look at where e2 is getting processor eaten. also i think it would be good to have a perl/PHP script which could generate fuzzy connections from your nodes to other topical nodes... within topics and those of your friends...

i kno from my metanodes that e2 has a broad-level anarchy to its organization. my general idea is to make a new 'metanode' node type which appears bold in the softlinks.. ie my Middle east would always appear bold. this would point people to topical indices... eventually fuzzy math + something like voting could be used to create topic fields. think fractal organization

have you seen this thing called 'helloworld' which works by making fuzzy collections of data. http://www.cooperatingsystems.com/helloworld/factsheet/index.html

i support anything making topical stuff and metanodes better. i think in particular it could be possible to flag certain nodes and have it generate others you might be interested in... but how to do this without crushing the server...

me sez:

"re hubs: A goal of the E2 hub is to offload things from the central server. I think that a generic mechanism to 'cache' unfinished writeups would serve nicely in that role, as it would give people a chance to collaboratively review or individually rewrite wus before posting them on the live server. The scratchpad is a very convenient part of e2, but it's also a source of database usage and system load.
A huge portion of e2's load is caused by the complexity of its pages. Every pageview results in dozens and dozens of comples queries, as well as in the execution of lots of code. Making the system more complex by adding filtering rules or nodetypes will do nothing to reduce pageviews caused by casual browsing, while making page renders more expensive. Quite the opposite of what we wish to accomplish!
On the other hand, if we write a hub that works to off-load as much as possible - both caching content for casual browsers, as well as providing a "draft then upload" paradigm for nodes in progress, we cut two expensive operations out of the loop - we reduce page renders for passive consumers by at least an order of magnitude, and page renders/database updates caused by writing/rewriting.
As of 1pm PST today, E2 has gotten fifty thousand hits. What if we could reduce that to 25k?

(Addendum to that: helloworld does look pretty neat... but for E2, I think that a web based solution will be more amenable than a program to download and run.)

This document was last modified April 2, 2008.

NOTE: Development on this client has discontinued (though the download is still available).
Please check out my new client at E2 Explorer.

E2 Link and Logger Client

Current Version: beta

Download Location: http://www.pitt.edu/~rttaylor

Note to users: I welcome any feedback regarding this client (good or bad).

--== features, requirements, FAQ, user comments, and changelog below ==--


New Patch! (posted May 2, 2003)
If you were/are experiencing problems with the Node Tracker, please download the newest version which contains a patch that solves the problem.

Fixed! (see above) Temporary Problems! (posted May 1, 2003)
There is currently a problem with the client parsing the User Search XML Ticker. Since it is not parsing the ticker correctly, it is reporting that all your writeups are gone. Don't fret! I'm working on a patch which should be available soon.

In the good news department, I'm working on a completely redesigned client which I am writing from the ground up. It will not suffer from problems such as the one above. ;-)

What's New in Version 0.9.9.x? (posted April 6, 2003)

  • Log Viewer Nodelet
  • New Toolbar buttons
  • Bugfixes for Catbox, softlinker
  • New Database format and access
  • Minor updates to Homenode List Generator, Nodegel Visualizer, Catbox, Offline Scratchpad
  • (More details in the "Features" and "Changlog" sections below)

What is it?

The E2 Link and Logger Client is an all-in-one, multi-threaded, multi-user, GUI, E2 Client that performs many of the same features as several other E2 utilities currently available to noders. What makes the E2 Link and Logger Client different is that unlike the other utilities that only perform a single function or are only available for command line use, this one combines nearly all of the features of many different clients into one GUI application.

This client implements most of the features* of all the applications below (and in some cases, more). They are all excellent programs, and if you do not meet the minimum requirements for the E2 Link and Logger Client, I suggest you check them out:

You may also wish to check out the soft links under "Small helpful scripts for noders", "e2client", and "Integrated Noding Environment" for additional E2 utilities.

* Full list of features below

What's with the name?

"E2 Link and Logger Client". Cheesy? Maybe, but it describes what the client does. The E2 part is obvious, but here's the rest:


To use this client you will need the following:

  • Windows 98/NT/2000/Me/XP - Other operating systems may be supported in the future (see Technical Information below; Win98 users should view Known Issues below)
  • Microsoft .NET Framework - You can download this for free from http://msdn.microsoft.com/netframework/downloads/ or from http://windowsupdate.microsoft.com. Many newer computers, people who regularly visit Windows Update, or people who receive automatic updates from Microsoft may already have this installed. While it is a large download, it is very likely that you will need it in the future, as many new .NET applications will be created, and all new Microsoft products will be written using .NET. Mono may be supported in the future (see Technical Information below)
  • Microsoft Data Access Components (MDAC) 2.6 or higher - You can download this for free from http://www.microsoft.com/data/download.htm. Many applications use MDAC, so it is likely that it is already installed on your computer.


General Features / Interface

  • Easy to use Graphical User Interface
  • Supports multiple users/usernames
  • Supports multiple E2 Servers (login to whatever server you prefer)
  • Multi-threaded
  • user customize numerous features for the Chatterbox Client, Node Tracker, and Soft Linker
  • automatically checks for updated versions
  • comes with a Windows HTML Help file

Chatterbox Client

Node Tracker

  • tracks Everything User Search information including reputation, upvotes, downvotes, and C!s
  • tracks number of writeups, XP, and karma (golden trinkets)
  • calculates merit, devotion, node-fu, WNF, mean, median, mode, total rep, cools percentage, and writeup type percentages (all calculations are based on current statistics, so will be more accurate than the values calcuated only once per day the E2 web site)
  • can view your changes over any saved time period
  • creates homenode lists: general user statistics, writeups with the highest/lowest reps, cooled writeups with the highests/lowest reps, writeups with the highest upvote/downvote ratio, writeups with the most/least votes, writeups with the most upvotes/downvotes, writeups with the most cools (for sample output, see here)
  • creates nodegel visualizer graph as reputation vs time (for sample output, see here)

Writeup Editor/Offline Scratch Pad

Soft Linker

  • auto-creation of soft links by writeup or by node
  • select any of your own nodes, or enter additional titles to softlink
  • choose the number of "clicks" for each link


Where to get it

You can download the install file from http://www.pitt.edu/~rttaylor

The download consists of a single self-extracting executable (created with ZipCentral) which is only about 100-200 KB (give or take depending on the current version). By running this file, you will decompress/install a few files to a single folder (no registry entries, and no changes to your system folders):

  • E2LinkAndLogger.exe - the main executable file
  • E2LinkAndLogger.mdb - a database for storing information used by the application (this will be swappable in future releases to allow noders to use any DBMS they prefer. MS Access files just happen to be easy to distribute.)
    NOTE: You do not need Microsoft Office or Microsoft Access installed for this application to work.
  • AxInterop.SHDocVw.dll - a library file that allows the application to utilize web browser like functions
  • Interop.SHDocVw.dll - another library file for web browser features
  • E2LinkAndLoggerClientHelp.chm - a windows HTML help file
  • README.txt - not all releases will contain a README file; you should always refer to this writeup for the most up to date information

After installing, simply run the E2LinkAndLogger.exe file to start the client.

Technical Information

The entire application was coded in Visual C#, and requires the Microsoft .NET Framework to run. Database connectivity is achieved with OLEDB. Though I used the other applications listed above for ideas and comparisons, I did not use anyone else's algorithms or code (it probably would have taken me longer if I had tried - I'm horrible at reading other people's code), so any problems are my own. Most of the features requiring information directly from Everything2 are implemented through the use of E2's XML tickers. I chose to use this language and platform for two main reasons:

  1. I needed to learn .NET for my job, and needed a project to play with.
  2. Regardless of the anti-Microsoft hype, they still have the most used operating system, and I wanted the client to be available to the most number of users.

That being said, do I have plans to port this to other platforms or languages? It's very likely that I will try and port it to Linux once Mono is complete and stable. However, there is one obstacle preventing this. The interface I use for the catbox client uses an ActiveX browser, which as it turns out is a scaled down version of Internet Explorer. I searched high and low for a component that could take HTML text and tags as input and display the parsed output properly and support JavaScript, but this was all I could find. If anyone knows of a library that can do this, or knows of a Mozilla library for Mono, please let me know. I'm itching to get Internet Explorer specific code out of my application, so that I can allow the user to choose their own browser.

It is not open source at this time, however, I am willing to answer questions, share ideas, and help other clientdev (or potential clientdev) members with problems they may be having with other clients, or who are just wondering how this works.

Questions, Comments, Complaints...

...suggestions, bugs, corrections, requests, RFEs, praise, beer, and anything else go to me. Feedback (especially constructive criticism) is highly appreciated. If it is short, feel free to /msg me. Anything long should be emailed to "bestsellers AT consultant DOT com". If you are interested in helping with the documentation or in creating toolbar icons, please contact me as well - I will give you full credit in the application and this writeup.

Frequently Asked Questions

Below are some of the most frequently asked questions and their answers. Please note that most of the questions I receive are answered in this writeup or in the Help File, so please consult both of them first. To ask a question of your own, see the heading above for contact information.

This is, by far, the most commonly asked question:
Q. Why am I getting the error, "The dynamic link library mscoree.dll could not be found in the specified path..."?
A. You will receive this error if you have not installed the Microsoft .NET Framework. Please read the Requirements section above for information on how to install the framework.

Q. Can I view the source code?
A. As of now - no. I am extremely unhappy as to how the application parses the XML tickers, and do not want to share the code until I fix this. (I was a complete newbie to XML when I started this.) I do not have any sort of time table as to when this might be. However, I am more than happy to answer any questions about the basic algorithms I used to make the app work.

Q. How can I disable Feature X in your client?
A. First, the Help file (Help->Contents) will answer most of these questions. You can turn on and off almost any feature in the Preferences window (Edit->Preferences). To turn off the Nodegel Visualizer, set the height and width settings to "1".

Q. Will you add/change/improve Feature X?
A. Possibly. Maybe. I have a lot of plans for this application - it's far from complete. I do take suggestions and feature requests, but I do all of this in my free time, so don't expect an immediate turn-around. I will most likely place a higher priority on the most common RFEs, so please provide feedback!

Q. Will you notify me when you release a new version or a patch?
A. The short answer: Yes. However, unless we are working closely together on a specific problem, I probably will not notify you directly. The application automatically checks for updates every time you log in with a connection to the Internet. In other words, I will notify you through the application itself. You are also free to visit this writeup at any time to see the current version and changelog.

Q. Why does the chatterbox client open Internet Explorer instead of my default browser when I click any of the links?
A. This is not a bug with the client itself. It is a .NET bug that has been confirmed by Microsoft (see Microsoft Knowledge Base Article #327135), and should be fixed with the next Service Pack for the .NET framework. It relates to the BeforeNavigate2 event not being fired. This behavior only affects the catbox and private messages areas - all other links in the application should open in your default browser.

Q. Why does your client sometimes work very fast, and sometimes very slow?
A. Whenever the E2 web site is experiencing a lag, the client will experience the same lag. You are free to log into a different E2 server (if you happen to know of the others) to try and alleviate the problem.

See Known Issues below for additional information

Who uses the E2 Link and Logger Client?

The following people have contacted me to let me know that they use my client, and/or have some of its output displayed on their homenodes (/msg me to get your name added).

As of the last time I looked, these users have output generated by the E2LnL client on their homenodes.

Angry Safer, arieh, Bacon the Rambler, BlueDragon, booyaa, BrianShader, briglass, CapnTrippy, CloudStrife, Damodred, Davidian, DogDaze, DroppedD, dTaylorSingletary, DWarrior, Footprints, glindsey, golFUR, GoodKingNerdnor, haggai, in10se, illsorted, isogolem, JeffMagnus, Jembeth, joes3029, Just_Tom, Lennon, machfive, MALTP (sort of), mauler, McCart42, Mikebert, morven, npecom, NickABusey, No Springs, novasoy, O Boy, pao, Randofu, Redalien, RoyHoo33, RPGeek, RubenAzarja, sekicho, sideways, Sontra, spiregrain, TanisNikana, Tato, TenMinJoe, The Big See, The Lush, thisfred, trembling, ttflyer, weasello, Wntrmute, WolfDaddy, wordnerd, zoinksbear

As of the last time I looked, these users do not have output generated by the E2LnL client on their homenodes, but have reported that they use it for other purposes.

=nerochiaro=, 1010011010, 10998521, 2s, 54b, 69lovesongs, Achromatic, adamk, Ahab, Albert Herring, althorrat, amnesiac, Anml4ixoye, anodyne, apelet, artifex, atesh, baffo, balseraph, bane221, bishopred1, Bitriot, BlakJak, blondino, bol, Brontosaurus, BrooksMarlin, bruenet, BurlyBob, caknuck, Chase, Chelman, Chihuahua Grub, chinakow, chris___, Chris Hook, Cliopatria, cole_p, corwin, CredoQuiaAbsurdumEst, Dag, Damodred, dann, DarkSarkas, davidrhoskin, DelayedReactionMan, Devon, diesterne, dg, dmandave, Disco Jesus, Dreamvirus, Droidkevin5, earthen, e-lainey, elem_125, eliserh, Excalibre, fantomex, finrod, fire_makes_it_better, flippet, fuzzie, GeniusDan, GhettoAardvark, Great Neb, grimly fiendish, gwenllian, hashbrownie, Heisenberg, hi_2k, hoopy_frood, ICO, ilteroi, izubachi, jasonm, jaubertmoniker, jmpz, JoeBaldwin, John Ennion, Johnny, Johnny Boy, Junkill, jwfxpr, kailden, kalen, KillerPenguin, koreykruse, Koutetsu, kthejoker, liveforever, LSK, LX, malcster, mcai7et2, mcd, Milen, mirv, Monomer, moosemanmoo, Mortice, Mr. Frog, mrichich, Mumra, Nero, Nic, nine9, nosce, not_crazy_yet, OberonDarksoul, oblivius, Omicron, Orpheum, Palpz, Paranda, patseal, perhapsadingo8yrbaby, Posmella, princess loulou, purple_curtain, PyramidHead, QuantumBeep, quepasacalabaza, QuietLight, Rancid_Pickle, ravenword, rawprawn, ReiToei, robin, Rubyflame, rycerice, Ryouga, s_alanet, sabby, sauron, SciPhi, scuzzy, Serial Number, Servo5678, SharQ, shazamed, shyy, Simpleton, sketerpot, smileloki, snarkyloki, solaraddict, soriyya, spazgirl, Stavr0, stewacide, StrawberryFrog, Swift^, slyph, tallman, tandex, teos, tes, theotherlight, Tlogmer, TMPman, trk, turkeyphant, Two Sheds, ugle, v0idhawk, VAG, vandewal, vd, Velox, Vimes, vitonis, WeeboHyren, werejackal, wertperch, Wiccanpiper, willfe, wonko6942, WonkoTheSane, xmod2, Yantarei

User Comments

Below are some selected user comments regarding the client. Be forewarned - anything you say to me can and will be used against you in this writeup.

  • RoyHoo33 says just downloaded e2 link and logger, and... well, Christ on a Cracker this program rocks! This is going on my very short list of desktop shortcuts. lemmie know when there's a version 2.
  • Chihuahua Grub says I've yet to use the scratch pad or soft linker, but so far this e2 client is more boss than Bruce Springsteen and twice as rockin'. This biz gets you mad props.
  • CloudStrife says Dude! Your e2 link'n'logger thing is absolutely FAN-F*CKING-TASTIC!!! I love it!
  • sekicho says re E2 Link and Logger Client: MMmmmmm.... this is the best thing since sliced pizza. You rock, in10se.
  • machfive says This link and logger program is great ... A+ job.
  • Anml4ixoye says Wow! Very Cool Client! ... Really excellent job.
  • novasoy says ... This is a handy tool!
  • Bitriot says re E2 Link and Logger Client: Excellent.
  • pao says I like the new chatterbox in the client (have it loaded now). I'll be downloading the new version. Thanks again for a great program!
  • dTaylorSingletary says This is really nice so far. I'll need to play with it more, but the interface is surprisingly awesome. Great job.
  • BurlyBob says The client is working, even through my proxy. Very nice.
  • werejackal says well, it's an excellent start! :) promises to be very elegant.
  • in10se says I love to talk to myself. And my client is better than a kick to the groin. Really! Give it a try!
  • Great Neb says re E2 Link and Logger Client: this is super cool...


Thanks to the following for inspiration and ideas from projects they have created for the community:
cow of doom, dann, JeffMagnus, N-Wing, Pyrogenic, and wick

Thanks also go to my beta testers for catching the things I did not. Show them your love:
fuzzie and pao

Known Issues

  • IMPORTANT: Several users have had trouble using the Node Tracker in Windows 98. If you turn off the "User Statistics" list (under the Node Tracker tab in your Preferences), it will keep the application from freezing up, but it still won't show you your results even though the information is properly stored in the database. Everything else in the application seems to work fine for these users. Again this only affects noders who use the Node Tracker in Windows 98.
  • When E2 is experiencing one of its notorious lags, the client will too. You are free to log into a different server in the client just as you could the web site to try and get a quicker response time.
  • Fixed: Borged users are not displayed as such in the Other Users area of the Chatterbox Client. This is not a client bug, but a bug with E2's Other Users XML Ticker II. I have notified edev of the problem.
  • Users who have the right to see cloaked users, cannot see cloaked users in the client. This is not a client bug, but another bug with E2's Other Users XML Ticker II. I have notified edev of the problem.
  • The mode statistic under the Personal Session tab for the Node Tracker does not work right for users with multiple modes (i.e., bi-modal, tri-modal, etc). It does display a correct value, but it only displays the highest mode if you have more than one.
  • The Friends List and Ignore List (under preferences) does not work. It's not a bug - it's just not coded yet.
  • Catbox links open in IE (not your default browser). This is a .NET bug (not a bug with the client). Please see the FAQ above for details.


Note: Since the application has several different independent parts, each part has its own changelog - General/Interface, Chatterbox Client, Node Tracker, Soft Linker, Writeup Editor/Offline Scratch Pad, and Preferences.

General Features / Interface Changlog

Version beta

  • 04/06/2003 - added an Easter Egg (let me know if you find it) :-). It's actually just a feature I wanted.
  • 03/17/2003 - change to toolbar, use a combination of new buttons and a combobox
  • 03/17/2003 - numerous changes that should be transparent to the user including reworking of the database, new preferences setup on the backend, optimizations, etc, etc
  • 03/16/2003 - removed password from database (CHANGE THE DATABASE FIELDS AT YOUR OWN RISK)
  • 03/15/2003 - added improved error log output (see error.log file) including detailed error message and stack trace

Version beta (first full-public release)

  • 11/19/2002 - added customized icons
  • 11/17/2002 - added and linked help file
  • 11/16/2002 - added feature to output error log file
  • 11/14/2002 - automatically checks for version updates
  • 11/12/2002 - minor bug fix for switching E2 servers

Version beta (first semi-public beta release)

Node Tracker Changelog

Version beta

  • 04/06/2003 - minor bugfix for handling node titles with HTML encoded data (thanks sekicho)
  • 03/16/2003 - allow user to select whether ties are counted as one single item or as individual items in the homenode list generator (RFE by CloudStrife, weasello)
  • 03/16/2003 - allow multiple characters to be inserted for the Nodegel Visualizer characters to users can have things like ♥ and ♣ for their plot points

Version beta

  • 11/24/2002 - patched "index array out of bounds" bug
  • 11/23/2002 - patched problem with nodegel visualizer causing infinite loop for a small number of users

Version beta (first full-public release)

  • 11/12/2002 - added link to user edit page from 2 node tracker tabs (thank for the RFE by pao)
  • 11/09/2002 - added mean to E2 User Statistics List output

Version beta (first semi-public beta release)

Chatterbox Client Changelog

Version beta

  • 03/15/2003 - added support for one-click usergroup private message replying (RFE by s_alanet)
  • 03/15/2003 - added option to show or hide archived messages (hidden by default)

Version beta

  • 12/05/2002 - auto-scroll to last message (RFE by Damodred)
  • 12/04/2002 - improved threading features

Version beta

  • 11/27/2002 - different colors for old messages and new messages
  • 11/27/2002 - added reply-to links to the private message area (one of the most request features)
  • 11/24/2002 - added context sensitive links to the Other Users area to allow users to send private messages, or visit the same room as any user currently listed as being online with just a click
  • 11/23/2002 - bug fixed and optimized catbox parsing function - should also decrease download time

Version beta (first full-public release)

  • 11/11/2002 - no longer displays archived messages (thanks to a suggestion by pao). I will probably add option to view them in the preferences, but for now it is assumed that the user archived them because they didn't want to view them every time they looked at their private messages
  • 11/11/2002 - added a convenience feature; new messages are shown in black text, previously read/displayed messages are shown gray so that you can easily find your place and follow the conversation

Version beta (first semi-public beta release)

Writeup Editor/Offline Scratch Pad Changelog

Version beta (first semi-public beta release)

  • 04/06/2003 - bugfix for preview mode
  • 03/16/2003 - example softlinks now displayed on the preview feature of the offline scratchpad

Version beta (first full-public release)

  • 11/16/2002 - added ability to export writeups to text files
  • 11/11/2002 - minor protocol bug fix for the preview feature using a Mozilla based browser (thanks to pao for finding the bug)

Version beta (first semi-public beta release)

Soft Linker Changelog

Version beta

Version beta (first semi-public beta release)

  • 11/06/2002 - minor bug fix for multiple selections and progress display
  • 10/31/2002 - multi-threaded the soft link feature and allowed an abort of the process

Nodelets Changelog

Version beta

Version beta

Version beta

Preferences Changelog

Version beta

  • 03-16/2003 - added option on how to treat ties in the homenode list generator
  • 03/15/2003 - added option to show or hide private archived messages

Version beta (first full-public release)

  • 11/12/2002 - added new (dbonly) option to show or hide archived private messages

Version beta (first semi-public beta release)

  • 11/06/2002 - added a soft linker tab for the sleep time option
  • 10/27/2002 - added current E2 server to preferences (readonly in prefs window; changeable at login only)
  • 10/19/2002 - added interactive preferences
  • no interactive preferences; preferences were changes by modifying the database directly