RE: WordPress.com Forum Options

This started off, yet again, as just a comment to a post, but as usual it started spreading to multiple paragraphs so I figured a post would do. Also, I wanted to properly answer those discussion questions.

For long-term use, wordpress.com isn’t really a viable option for hosting a forum. That’s not to say you technically can’t run a forum here, but it’s just not practical.

As mentioned, a blog isn’t a forum or a wiki and this is due to fundamental differences that are just not possible to reconcile without an actual forum “module” of sorts. And since hosted sites don’t have the option of custom plugins, that leaves bbPress — from the same folks who bring you WordPress and integrates with existing blogs — or Vanilla forums, which is a nice minimal forum also with good WP integration.

Fun fact: The WP support forums are using bbPress!

Of course, that also means running your own WP installation with no back-end bug-fix and feature boost goodness that we’ve been spoiled with here.

There are forum plugins for WordPress, but my experience with many of those haven’t been positive. That’s not to say the plugin authors haven’t done the job as well as they can, but there’s just no match for proper stand-alone software packages like Vanilla or bbPress which comes with their own support communities, plugin ecosystem and excellent customization options.

Both forums have very low barriers for participation, just like WordPress, which I think is the biggest factor in achieving critical mass. After all, no one goes to an empty restaurant.

And I do think it’s good to have a blog alongside a forum. A forum should be for discussion, not for “news of the forum” or even rules, which I think distracts from the discussion. Put those in the FAQ page of the blog and you clear up the forum for discussion. A community should have the least number of barriers or steps for communicating, the core function of a community, and sometimes extra features can get in the way of just plain talking.

I also have some philosophical objections to ProBoards in that every post you do make there is technically their property. And there’s no “export” feature for all your content, which is something that even WordPress.com offers; so a bit of a deal-breaker for me there. I think the forum you create should be yours and your users’ just like your blog.

Onward to the The Discussion : I’ll go from 3 – 1 in order of increasing verbosity. ;)

Have you considered creating an online forum to complement your blog?

For this blog? No because it’s basically a brain dump.

But I do have plans for a community that’s in the works and it will be something different from what I’ve done before and it will most definitely have a separate blog for announcements and other forum related info. If I’ve learned anything from social media, it’s that the fewer boundaries there are to participation, the quicker your community will grow so I’m going to put those lessons to good use.

It will not be a new social network! ;)

Do you have a forum in conjunction with your blog? Or are you a member of a forum operated in conjunction with a blog?

Every forum I’ve run had some sort of separate feed for notices.

I think every discussion forum can benefit with a blog or some other separate entity to discuss happenings of the forum. This allows the discussions to be clear of clutter while making clear provisions for routine announcements, news etc…

I’ve seen that forums that are just forums and are still online have either been on the net for a very long time with an already established user base or have a separate blog or site for sharing information about the forum. Newer forums will definitely benefit from having a separate blog for forum matters.

The forums that don’t have them tend to clutter up very quickly with nonsensical rubbish (unless that’s the goal of the community) or just talk about the forum so a separate entity is a must to keep discussions clear.

Have you ever set up and operated an online forum?

Lots! :D

I used to run my own private network from around the mid 90’s to mid 2000’s before I stepped down as admin and we had a pretty big community. There were no “forums” in the conventional sense. It’s what would be called today a distributed forum or a cloud forum, in that posts are their own entities and were grouped only by tags (minimum of 1 and maximum of 5) and each tag is a mini-forum of sorts. A new “forum” is made when a new tag is created for the first time, but we were able to merge tags, and we could also feature popular tags. So in a way, it was a bit like Twitter’s hashtags.

My old network and forum

I’ve also hosted and moderated on open forums as well.

I can tell you, the hardest part of running a community is the moderation. There’s really no automated substitute for proper moderation and we found that being rude to new users is the best way ruin a fledgling community. Any posts asking questions that have already been answered can be locked with a link to the answer while sparing a snarky RTFM!

The community fell apart with too much and too little moderation. But it may come back soon.

And I found that requiring registration or otherwise stopping posts from appearing without moderator approval was also stifling discussion. ProBoards, for example requires registration for posting, which I think kills a lot of passerby posts. It kills spam too, but having to deal with spam is a small price to pay for quality feedback.

This is not specific to your blog, but I’ve seen many blogs block new comments from appearing until they’ve been approved. Some blogs have it setup so they need to approve at least the first post, but many need approval for every post. The peril of this is that I’ve posted on lots of blogs that I completely forgot about a little while later.

Did they approve the comment later? Did I get a reply? I don’t know because not only do I not remember where I posted, sometimes WordPress doesn’t show those replies or my comments in the “Comments I’ve made” section. I know this because sometimes I remember a post I’ve made and go back to the post only to find there’s a reply, sometimes in the form of a question, and it’s already weeks old. The train of discussion has been lost.

This is obviously a glitch, but I don’t know how many of those glitches have occurred or how many times those notifications have failed to reach me. I could check that email box on the comment form in case someone replies, but considering the large volume I get on a daily basis, I’m not keen to add to the collection. Plus I have no idea if that works all the time either.

The common reason for pre-approval of comments seems to be moderating spam and I think this is a faulty premise. I’ve never had a spam problem on this blog or really any other blog I’ve run (that was up to date and had Akismet installed) and all pre-approval and pre-registration does is prevent legitimate posts from users with little patience for jumping through hoops. The only restriction I’ve placed on new comments is prevent posts with more than 2 links from automatically appearing without my approval since many spam posts have lots of links.

Very few spam comments get through Akismet into the spam queue on my blog and even several of those have been legitimate as well.

On this blog, all comments appear immediately after posting. There’s no registration restriction or even an email requirement and as a result I’ve received very helpful feedback from anonymous or unregistered posters.

Imagine how much feedback has been lost due to this additional hurdle. This is one more reason that good moderation just cannot be automated. It has to be an active part of every community. You need to spend some energy dealing with questions, comments and of course spam to make sure a community grows with sane boundaries. But it’s important to do this without raising the walls of your community too high or else you run the risk of being ignored.

Discussion Forum Update (tables and classes)

A bit of a long post today to show the updated table schema for the discussion forum and a few of the classes. There are quite a few improvements from the last version of the table schema in that there is no longer a PostRelations table. This was only adding more complexity to the retrival and storage methods so I opted to use a simple ParentId field to take care of the relationships. Now there is also a LastActivity field in the Posts table so that when a new post is added, only this field needs to be modified. The ContentHash field stores a rolling hash of the plain text content so measuring the quality of the post for the threshold will be more consistent.

Forum database schema

The object models also got an overhaul.

Onward to those…

Forum Tables

Just finished deciding on the initial set of tables for the discussion forum.

I wanted to keep things as simple and as flexible as possible. In that regard, I tried to normalize as much as is practical and there is one table for both topics and replies and a seperate table defining Topic > Reply (Parent > Child) relationships. The tags are also assigned by the use of two tables; one for the tag itself and another specifying the relationship.

Since tags double as forums or categories, the tags also have a description provision. I wanted to make anyone browsing a particular tag feel like they’re on a forum page.

Clockwise : Posts table stores topics and replies, PostRelations define parent > child relationships, PostTags define categories, PostTagRelations specify which tags go with which topic

I also wanted to keep track of which authors created which tag. Authors are a unique table where each entry is per post since we want to enable anonymous posting. There is a MemberId field, however, that allows an author to be identified by a registered member profile. Following the same normalization pattern, there are PostAuthors and TagAuthors tables.

Author relationship tables

And, of course, the Members table. I’m still going to be using the MembershipProvider model, but with a few customizations. This table may change in the future, but it does what I need it to do for now.

Members table

And of course, the object models… You may notice from the namespace, I decided to call this project “Road”. Sufficiently vague to be interesting ;)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Road.Models
{
	public enum TopicStatus : byte
	{
		Open, Closed, Hidden, HiddenClosed, InTagPromoted,
		InTagPromotedClosed, Promoted, PromotedClosed
	};

	public enum TagStatus : byte
	{
		Open, Closed, NoAnon, AnonModerated, Moderated
	};

	public enum ReplyStatus : byte
	{
		Open, Hidden
	}

	public class Entity
	{
		public int Id { get; set; }
		public DateTime CreatedDate { get; set; }
		public DateTime LastModified { get; set; }
	}

	public class NamedEntity : Entity
	{
		public string Slug { get; set; }
		public string Name { get; set; }
		public string DisplayName { get; set; }
	}

	public class Creator : NamedEntity
	{
		public string Email { get; set; }
		public string IP { get; set; }
		public string Web { get; set; }
		public string Bio { get; set; }
		public string Avatar { get; set; }
	}

	public class PageEntity : NamedEntity
	{
		public Creator CreatedBy { get; set; }
		public string Summary { get; set; }
		public string Body { get; set; }
	}

	public class Tag : PageEntity
	{
	}

	public class Topic : PageEntity
	{
		public LazyList<Tag> Tags { get; set; }
		public PagedList<Reply> Replies { get; set; }
		public int ViewCount { get; set; }
		public int ReplyCount { get; set; }

		public float? Threshold { get; set; }
		public TopicStatus Status { get; set; }

		public Topic()
		{
			this.Id = 0;
			this.Status = TopicStatus.Open;
			this.ViewCount = 0;
			this.ReplyCount = 0;
			this.Threshold = 0;
		}
	}

	public class Reply : PageEntity
	{
		public int TopicId { get; set; }
		public float? Threshold { get; set; }
		public ReplyStatus Status { get; set; }

		public Reply()
		{
			this.Id = 0;
			Status = ReplyStatus.Open;
			this.Threshold = 0;
		}
	}
}

Note: The LazyList is a lazy loading helper class. There are several examples on the web if you Google the term so I haven’t decided which to use or if I’ll write my own. PagedList is an oldie, but goodie I’ve been using for quite some time. There are many examples of that on the web too.

“Threshold” on both Topic and Reply classes are quality measurements. I want to implement some sort of spam/quality filter that will set the threshold on each as they are entered into the database and allow the user to toggle which range to see. Anonymous users won’t be able to toggle the threshold so any search bots would also be spared any spam.

These few days, I’ve been running all over the place so once I settle down, next update on this, I’ll start posting some actual code.

Discussion Forum mockup

I love Sundays. Not just because there’s no post on Sundays as Vernon Dursley from Harry Potter would infer, but it’s because I get to sleep late some days.

This morning, I put together a quick HTML mockup of the original front page sketch of the discussion forum I talked about a few days ago. All in all, I’m pretty satisfied at how close it came to the Photoshop version and, aside from a few rough edges, I think it accomplishes pretty much everything I want in a “Home” page.

Now I just need to put together the “Tag” page where users can browse all posts under that tag (pretty similar to the “Author” page where users can see all posts under a particular user) and something like a very simple dashboard for the “My Account” page where users can keep track of their subscriptions.

I think it’s best to keep everything organized via feeds for this. If all subscriptions are done in RSS, I think it would be easier for mobile users as well.

I’ll make any changes to the HTML layout on the mockup and start the backend work soon.

Whatever happened to the Discussion Forum?

And when I say “Forum”, I don’t mean Facebook, Twitter or any other social networking site where people stick to their own little walls or flock to hashtags; I mean an actual discussion forum with many topics of interest and people share meaningful views and feedback on said interest. I mean the predecessor to the blog where there were categories for discussion and people posted in coherent sentences and in greater than 140 characters. I mean where you actually got to read an entire category, which means you got to see input from friends, acquaintances and enemies alike.

The bigger your world is, the smaller you feel

Are you part of a community of millions? Then, you know how a single plankton feels. It’s nice to think that your comments will be seen by millions of people, but the reality is that the larger your community, the less of a change there is that any significant number of people will see anything you post unless a moderator or admin sticks it to the front page. Much like how the Freshly Pressed front page works on WordPress.com.

What about the good old days of the internet before spam and porn (the latter is probably debatable for some) when people just posted to discuss topics of interest and share knowledge?

I thought about what it would take to really make a discussion forum usable, compatible with a large community and still feel small and cozy (this might be owing to my liking of small homes). The wheels started turning after I read how a WordPress blog can work nicely as a DIY Case Management System. It’s a brilliant, yet simple, solution to a seemingly complex problem.

First, let’s talk about what we can leave out of a forum.

Categories are dead; Tags are the future

Let’s face it, we don’t just stick to one or two topics of interest these days so it makes sense to be able to browse many at the same time. WordPress already does this and by moving away from categories and into tags, users can have the option of adding multiple tags to their posting options rather than be tied down to one category, theyreby circumventing arbritary limitations on appropriateness (“Your post doesn’t belong here!”). If a topic belongs to none of the existing tags, add your own!

Tags free the user to focus more on what they’re writing rather than where it belongs so the categorization can come from the body of the topic itself. Tags, after all, are a cross-sample of the content.

Groups are not Roles

And promoted or otherwise ostensible roles are silly in most online communities.

This might seem counterintuitive, but think about it: A group may have a set of actions they can perform which means certain groups have certain roles, but groups are not roles themselves. Groups within the same community may also be a source of contention as some people who have been around longer and accumulated more experience may leverage said credit to grow weeds of narcissism. So groups can be a bad thing if that leads to an unwarranted sense self-importance.

Ranks are usually only appropriate when there needs to be a clear reason as to why an admin or moderator needs to show that they’re an admin or mod other than to satiate egos. Breaking down the high walls between staff or authority and ordinary users is a key step in making a community feel like one.

Quicker & Easier to use = More usage

Many moons ago, Joel Spolsky wrote a wonderful treatise on Building Online Communities and while the post is old, the tennets still hold true.

One of the key issues he brings up is the number of steps required in order to post and navigate on a conventional forum. On many of the online communities, the registration, login, password reset and the actual content itself are on disparate locations and most require registration driving away potential contributors. So the trick is to combine most of it into one location without making the place look crowded and have the least number of steps necessary to start posting.

While Joel makes a point on registrations being unnecessary for the most part, if the process is made easy enough, and if it introduces features such as being able to subscribe to many tags at once, registration is a handy way of managing the community. There is, of course, little reason to prevent anonymous posting altogether since every community needs active moderation these days anyway and the majority of mischief can be handled via filters.

Putting it all together

Early this morning, I set about sketching up what would be my ideal discussion forum.

I elected to recycle the HTML5 version of my Simply theme rather than writing something from scratch in order to save time and not reinvent the wheel (and because I’m lazy).

The front page should have all the basics including the latest topics, a tag cloud, a form to add a new topic, a login and registration form. Naturally piling all this onto one page and showing them all at once is confusing, so I elected to use jQuery UI Tabs to organize things. Other than an individual topic view page and a “Home” or “My Account” page, which will serve to aggregate subscribe tags and manage the user profile and subscriptions, 90% of what a forum does can be described in these sketches.

The goal is to be more functional than Twitter while having the same ease of use and less bloated and restrictive than the forums at SomethingAwful.com while having the same capacity to accomodate a large userbase and varied interests.

The front page:

The front page is the "Topics" tab which shows the most recently added topics, the tag cloud and some quick stats. The topic view can look similar to this, possibly with larger text, and without the tag cloud or stats on the side.

Add new topic

The add topic page has a brief description on posting followed by the form. No categories here, only tags.

Login form

The login form shows only what's needed. Both the login and reset forms are together, so there's no jumping through hoops to reset.

Register form

The registration form also shows just the basics. Any more "personal options" would only take away from the community experience and discussion.

And that does it for what I want in a forum. There’s ample room for improvement for sure, but I think this “less is more” approach can help people bring the focus back to the discussion and not about the software itself. Also, the less there is to show, the less there is to fail.

Also note, there are no membership lists. Members will come into the spotlight as they’re posted and as long as they’re active in their tags of choice, they will be noticed and users can browse as many topics that are recently posted or as many topics on each tag(s) they want. No need for something like “Freshly Pressed” or “Readomattic” to get noticed no matter how many posts are made every minute.

I may actually turn this mockup into a working project and add features like author subscriptions, like blog subscriptions we have here, and write it up possibly ASP.Net and MVC when I have the time, but for now, the images will have to do.