How To Install Dreamwidth

Ever since 2007 or so I've been running and managing Since then we've been using the LiveJournal open source code to run the site. In the beginning the code was managed by a group of really great people and developers, however during the past 10 years or so LiveJournal has swapped hands far more then I can count. Even in the beginning the code wasn't all that easy to manage or upgrade, so much so that I believe I only updated the code-base once. It was nothing short of a nightmare.

After much thought and deliberation I've decided to switch my LiveJournal-based site over to using the Dreamwidth-based code. Dreamwidth utilized the LiveJournal code a few years back and has forked it and done some really awesome stuff with it. Most (if not all) of it remains to be BML/Perl which I really dislike but at least it's continually being updated and is managed at GitHub which I really enjoy using.

For those wishing to run Dreamwidth (or rather a Dreamwidth clone if you may) this guide should help a lot of you to get going. This guide is heavily based on the one Dreamwidth has provided however it includes a few new things.

Firstly you'll need your own server with which you have root access too. I used Ubuntu 14.04 x86_64 without any issues. It has about 160GBs of disk space and 4GBs of RAM. Remember, Perl likes to eat all your memory, so having lots of RAM is going to help a lot.

Update Your System

I started off with a fresh Ubuntu 14.04 install, a clean, blank slate. However, it's also important to make sure your system software is up to date. Simple.

apt-get update
apt-get upgrade

If you'd like to have man pages on your system (may already be installed):

apt-get install man

Next you'll need a bunch more software to run Dreamwidth.

Installing Necessary Packages

apt-get install git-core subversion apache2-mpm-prefork \
  libapache2-mod-perl2 libapache2-mod-apreq2 libapache2-request-perl \
  mysql-server wget unzip links vim libclass-autouse-perl \
  libdatetime-perl libcache-memcached-perl libhash-multivalue-perl \
  libgd-gd2-perl libhtml-template-perl libwww-perl libmime-lite-perl \
  libnet-dns-perl liburi-perl libxml-simple-perl libclass-accessor-perl \
  libclass-data-inheritable-perl libclass-trigger-perl libcrypt-dh-perl \
  libmath-bigint-gmp-perl liburi-fetch-perl libgd-graph-perl \
  libgnupg-interface-perl libmail-gnupg-perl perlmagick \
  libproc-processtable-perl libsoap-lite-perl librpc-xml-perl \
  libstring-crc32-perl libtext-vcard-perl libxml-atom-perl libxml-rss-perl \
  libimage-size-perl libunicode-maputf8-perl libgtop2-dev build-essential \
  libnet-openid-consumer-perl libnet-openid-server-perl libyaml-perl \
  libcaptcha-recaptcha-perl libdbd-sqlite3-perl libtest-simple-perl \
  libtemplate-perl libterm-readkey-perl \
  gcc libtest-most-perl libgearman-client-perl \
  libbusiness-creditcard-perl liblwpx-paranoidagent-perl \
  libtheschwartz-perl libfile-type-perl libjson-perl

Their instructions also included libtest-simpleunit-perl but I found this package was not necessary and haven't come across any issues without having installed it. This will download about 110MBs of data and then install it to your system. During this time you may be asked to setup MySQL, however it's very simple, and should only ask a couple questions such as setting up the root password for MySQL.

Set Apache to Use MPM Pre-fork

If you've used the above one-liner it should install the Prefork module for Apache, however it may not configure it to use it. By default my copy of Apache was set to use MPM Event. Easy enough to change though.

a2dismod mpm_event
a2enmod mpm_prefork

Install Extra Perl Modules

Next you'll need to install a few more Perl modules the Dreamwidth code will need to run. Each line below is a single command. To save you from having to run the first one twice, you should run these commands first:

locale-gen en_US en_US.UTF-8
dpkg-reconfigure locales

This just configures language locales on the system, which the Perl modules appear to require before being installed.

cpan Bundle::CPAN   # this will guide you through setting up CPAN
cpan GTop  
cpan Digest::SHA1
cpan Unicode::CheckUTF8
cpan MogileFS::Client   # this is necessary even if you don't use MogileFS
cpan TheSchwartz::Worker::SendEmail
cpan TheSchwartz::Worker::PubSubHubbubPublish
cpan Digest::SHA256
cpan Text::Markdown
cpan Image::ExifTool

Install Postfix

Next install Postfix and configure it. The configuration is relatively easy to go through. I won't get into how to configure it, there's Google for that.

apt-get install postfix

Set Timezone to UTC

For whatever reason Dreamwidth requires the timezone to UTC.

dpkg-reconfigure tzdata

Setup a 'dw' User Account

Add the account to the system:

adduser dw

Next add the user to the sudo group:

usermod -a -G sudo dw

Get the Dreamwidth Code!

These next few commands will have you run them as the dw user account.

su - dw
export LJHOME=/home/dw/dw
echo $LJHOME

The final command above should return /home/dw/dw.

Next you'll need to get yourself a free GitHub account. Once that is done fork the follow repositories:

Here's a quick overview of how the repositories will work together:

  • dw-free is the main repository and goes into $LJHOME
  • other repositories will go into $LJHOME/ext
  • personal config files go into $LJHOME/ext/local
  • All code from dw-free ($LJHOME) and the additional repos under $LJHOME/ext are automatically live when you start your server. There's no need to run any additional syncing steps anymore.

Setup dw-free

# clone a copy of the repository onto your machine
cd ~/
git clone $LJHOME

# and let's make it aware of the dreamwidth repository so we can grab updates later
git remote add dreamwidth
git fetch dreamwidth
# we also want to sync up with the main branches
git branch --set-upstream develop dreamwidth/develop 
git branch --set-upstream master dreamwidth/master

You'll want to replace the USERNAME bits with your GitHub username. This will make your repository an authenticated version that can push changes back to Github, as opposed to only being able to pull them.

I am leaving out the setup the dw-nonfree code since I did not use that repository, however you can refer to their guide for more information on how to set it up.

Database Setup

MySQL should already be installed, setup and running at this point. Next you'll need to create a couple databases. First get logged into MySQL.

mysql -u root -p

Next you'll run a couple commands to actually setup the database(s):

create database dw;
grant all on dw.* to 'dw'@'localhost' identified by 'SomePassword';

Next you'll add a database for TheSchwartz.

create database dw_schwartz;
grant all on dw_schwartz.* to 'dw'@'localhost' identified by 'SomePassword';

You can then quit out of MySQL.

Setting Up The Configuration Files

The next part may be the most time consuming part. You'll need to edit your configuration files. There are three really important configuration files for the whole install, so it's good to learn which configuration values are store in each file.

## copy over your config files, and tell them to take priority
## over config files in any of the repos
mkdir -p ext/local/etc
echo "highest"  > ext/local/.dir_scope
cp doc/ ext/local/etc/
nano ext/local/etc/

Note that the $IS_DEV_SERVER flag is set to 1 in the template given. Be sure to set this to 0 for a production site, as there are big security issues involved with leaving the flag set to 1.

Next, you need to change your local variables in the file. This is where your passwords are configured, as well as many of the variables which define your domain. You will want to change at least your $DOMAIN and the %DBINFO structure.

cp doc/ ext/local/etc/
chmod go-rwx ext/local/etc/
nano ext/local/etc/

Note that there are two DBINFO blocks; make sure to get them both.


Once you've updated your configurations you'll want to run a check script which looks over your install to make sure any necessary packages and software have been installed. I believe the first time I ran this one or two packages came up missing. Fortunately the script let's you know which packages are missing and even provides necessary commands to get them installed.

bin/ --no=ljconfig

Populate the database

Now let's get some structure and initial data into the database.

$LJHOME/bin/upgrading/ -r --innodb
$LJHOME/bin/upgrading/ -r --innodb # at least for now we have to run this twice
$LJHOME/bin/upgrading/ -r --cluster=all --innodb
$LJHOME/bin/upgrading/ -p

Next, you'll populate the dw_schwartz database:

mysql -u dw -p dw_schwartz 

Create a system user account

Now, we'll create a initial system account. This lets you login as the system user and generate invite codes and set privileges to other user accounts.


Load Translation Strings

Next, you'll run a tool to load in translations strings.

$LJHOME/bin/upgrading/ load

Configure Apache

You will need configure Apache next. You'll want to do this as the root user account. Put the following into /etc/apache2/sites-available/stage.conf:

User dw
Group dw
UseCanonicalName off

StartServers 1
MaxSpareServers 2
MinSpareServers 1

DocumentRoot /home/dw/dw/htdocs

PerlSetEnv  LJHOME /home/dw/dw
PerlPassEnv LJHOME

PerlRequire  /home/dw/dw/cgi-bin/

Now you'll want to disable the default site, and enable this new site:

a2dissite default
a2ensite stage

Go ahead and restart Apache. Hopefully you'll get no errors.

/etc/init.d/apache2 restart

Extra Notes

It appears for some reason the default language is set to en_DW in the $LJHOME/etc/ Change:

@LANGS = qw( en_DW );


@LANGS = qw( en );

There also appears to be an issue with some of the code utilizing remote_ip instead of client_ip. It's possible this is due to the code being older and being developed for older versions of Apache then what I have installed. Fortunately it's easy to fix. You'll need to edit a bit of code here. On line 173 of /home/dw/dw/cgi-bin/DW/Request/

# returns the ip address of the connected person
sub get_remote_ip {
    my DW::Request::Apache2 $self = $_[0];
    return $self->{r}->connection->remote_ip;


# returns the ip address of the connected person
sub get_remote_ip {
    my DW::Request::Apache2 $self = $_[0];
    return $self->{r}->connection->client_ip;

Next in /home/dw/dw/cgi-bin/Apache/ on line 1919 change:

sub get_remote_ip
    my $apache_r = BML::get_request();
    return $apache_r->connection()->remote_ip;


sub get_remote_ip
    my $apache_r = BML::get_request();
    return $apache_r->connection()->client_ip;

Getting the Shopping Cart Working

If you'd like to get the basic shopping cart working, you'll first want to setup API keys for PayPal. Just login to your PayPal account, go to Tools and then under Manage your business click on API Access. Go through the setup process there. Once finished you'll end up with an API username, password and signature. Note, that some menu options or page locations may be different within PayPal when you read this. You'll copy those into the $LJHOME/ext/local/etc/ file. Now open up the $LJHOME/ext/local/etc/ file and locate %SHOP. You can edit this to your liking (setting pricing and such). It should look something like this when you're done:

# shop/pricing configuration
    %SHOP = (
        # key => [ $USD, months, account type, cost in points ],
        prem6  => [  20,  6, 'premium', 200 ],
        prem12 => [  40, 12, 'premium', 400 ],
        paid1  => [   3,  1, 'paid', 30    ],
        paid2  => [   5,  2, 'paid', 50    ],
        paid6  => [  13,  6, 'paid', 130   ],
        paid12 => [  25, 12, 'paid', 250   ],
        seed   => [ 200, 99, 'seed', 2000   ],
        points => [],     # if present, sell points
        vgifts => [],     # if present, sell virtual gifts
        rename => [ 15, undef, undef, 150 ],

Getting YouTube API

If you'd like to utilize YouTube/embeds on your site, first edit the $LJHOME/ext/local/etc/ and edit this:

# additional domain from which to serve the iframes for embedded content
# for security reasons, we strongly recommend that this not be on your $DOMAIN

I have two domains, so I just put the URL on the secondary domain.

Next, you'll need to get an API access key to YouTube. For this I ended up Googling 'YouTube API key'. Basically you just need to go here and register your site and choose the YouTube Data API. Copy over your key(s) into the $LJHOME/ext/local/etc/ file and you should be all set.

Adding Privs

As a rule of thumb I don't use the system account. I setup my own account and add any necessary privileges onto the account which I may need. The ones I used are as follows. To add these to my personal account, I do this from the system account $URL/admin/priv/. Here's what I add. They're mostly privileges which let me manage the FAQs and help requests.

faqadd *
faqedit *
vgifts *

Setting Up Workers

For your website to be fully functional you'll want to configure some workers to handle various jobs around your website. I mostly just went off the wiki page for this.

Other Recommended Reading

So there you have it, that's how you can setup your own Dreamwidth-based website! v3.0

Over the last couple of weeks we've been hard at work optimizing the code that runs During this milestone our main goal was to not only optimize our code but also make sure it was ready for newer versions of PHP and MySQL. During the optimization we also decided to change the layout of the site so that it was cleaner, and hopefully allowed everyone to easily manage their games and libraries and easily perform tasks within the site. We've also been hard at work on making sure to secure our code and functions on the site. Check out a few screenshots from the upcoming v3.0.

I hope that within the next couple weeks we can roll out this new update to everyone. After this next milestone is finished we're hoping to dive back into getting new features added such as groups, more privacy settings, connections to Twitter and Facebook so people can share updates to their social pages, and more!

Personal Anime List

I recently wrote about my new anime list site, but I finally took a little time to build my own Bootstrap based page which lists all my anime (watching, completed, on hold, dropped and plan to watch). Currently I may open up the site to a few people, friends and see how well it does. If anyone wants to help me test things out, feel free to drop me a comment 😄


You can check out the page here.

A New Chat Server

I've been running a Jabber server for friends and family for a few years now. I've gone between using OpenFire on OS X and Linux to 3rd party hosted solutions to ejabberd. One of the main reasons I am writing this was because I saw something on Ars Technica about setting up your own private chat server. While I was currently using the iChat Server which comes built into Mac OS X Server, my Xserve has been on the fritz for the last couple weeks (I think the NIC on the logic board is becoming unsoldered which causes connections to come and go) and I was looking for a replacement.

The Ars Technica article kind of prodded me to start looking for another solution since my poor Xserve was on it's last legs. The article uses Prosody as the server daemon which I had never heard of, but looked worthy as a replacement. After having a fair amount of issues getting the right Lua libraries installed, I finally gave up and started looking for another solution. I came across which looked really promising and quite slick.

Vines is Ruby based and supported everything I wanted, server-to-server chat as well as had TLS support. It even included a nice web interface as a chat client incase you didn't have a Jabber client installed. I spent about 2-3 hours trying to get this to work but found there was a bit of a learning curve involved with getting it to work properly. The documentation also appears to be a bit out of date as well and I got no response when I attempted to reach out to the developer on Twitter. The issues on their GitHub respository also appeared to be unattended to for quite some time. Once I finally wrapped my head around how it worked and tested it with my girlfriend, it was essentially un-usable. It took about 1 minute and 30 seconds for a message to go from one person to the other. I checked into all the configurations and settings again but I saw nothing that would have caused it to delay messaging between users. Of course nothing in GitHub issues, Google, or on the Vines site hinted as to what was causing this, so I was back to the drawing board.

The next Jabber server I tried was ejabberd, another popular one. It also supports TLS and server-to-server chatting. It required very little effort to get running and when testing between users it worked great. The only issue I had was getting my StartSSL SSL certificate working, but that was due to lack of documentation. Fortunately a quick Google search turned up this site and I was up and running with my SSL certificate in no time at all. It also has a decent (but still stuck in 1995) web front-end which I can use to easily manage adding users to the server.

For all this testing, compiling, installing, poking, and prodding, I used a Droplet from DigitalOcean. I think they're definitely going to be my go to company when I need a quick Linux environment for testing and even for production servers. I literally switched to and from Ubuntu and CentOS, and reinstalled (multiple times) the operating system, all within 30 seconds to a minute. They've got a great infrastructure and even offer instances all over the globe! If anyone is looking for a provider check out DigitalOcean! I should even note I used a tutorial from DigitalOcean to get ejabberd running on my Droplet.

If anyone wants to add me on Jabber, my address is 👍

Horse Time!

I had a fantastic time this weekend riding my horse. He did a great job and I really had a lot of fun. I love having a super awesome horse. 🐴 🍃

Install GitBucket to Heroku

GitBucket is a clone you could say of GitHub. However while it looks similar to GitHub it's certainly quite far from being what GitHub is. Sure it allows you to:

  • Public / Private Git repository (http access only)
  • Repository viewer (some advanced features such as online file editing are not implemented)
  • Repository search (Code and Issues)
  • Wiki
  • Issues
  • Fork / Pull request
  • Mail notification
  • Activity timeline
  • User management (for Administrators)
  • Group (like Organization in Github)
  • LDAP integration
  • Gravatar support

but there's a lot missing, most notably the ability to use the Git/SSH protocol. However, with all the features included above I decided to give it a shot.

The first thing to note is this is not written in one of my preferred languages such as PHP, Ruby (on Rails) or even on node.js. It's done in Scala, which means that Java will be involved. I absolutely despise Java. Regardless I still went forth.

For my install I decided to deploy it to Heroku which meant I didn't have to install Tomcat or Glassfish, etc...

I have a CentOS 6.x Linux server which I used. First you'll need to install Java, pretty simple. You'll also need the development tools as well.

~/gitbucket $ yum install java-1.6.0-openjdk-devel java-1.6.0-openjdk.x86_64 -y
~/gitbucket $ export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-

This will install Java and any necessary dependencies. One that's finish you'll want to get the GitBucket code. By default GitBucket doesn't come with the necessary configurations for working on Heroku, but someone has kindly updated the latest GitBucket branch with the necessary code and files.

~/gitbucket $ git clone -b heroku-1.9

This tells git to snag the heroku-1.9 branch. From there you'll want to change the name of the branch to 'master'.

~/gitbucket $ git branch -m master

Now, you'll want to run the sbt tool, thankfully this is included in this fork of the GitBucket code. It essentially allows you to compile the code locally on your system. You'll want to run the commands when prompted, clean, compile, and stage.

~/gitbucket $ ./
[info] Loading project definition from /home/git/gitbucket/project
[info] Set current project to gitbucket (in build file:/home/git/gitbucket/)
>> clean
[success] Total time: 0 s, completed Jan 29, 2014 9:10:55 PM
>> compile
[info] Compiling twirl template .../main.scala.html to .../main.template.scala
[info] Compiling twirl template .../index.scala.html to .../index.template.scala
[info] Compiling twirl template .../header.scala.html to .../header.template.scala
[info] Compiling twirl template .../signinform.scala.html to .../signinform.template.scala
[info] Compiling twirl template .../signin.scala.html to .../signin.template.scala
>> stage
[info] Generating /home/git/gitbucket/target/scala-2.10/resource_managed/main/rebel.xml.
[info] Wrote start script for mainClass := Some(JettyLauncher) to /home/git/gitbucket/target/start
[success] Total time: 1 s, completed Jan 29, 2014 9:13:58 PM

Once this is completed you can push it out to Heroku. First create the application:

~/gitbucket $ heroku create
Creating sheltered-shelf-3564... done, stack is cedar |
Git remote heroku added

Next push your code to Heroku.

~/gitbucket $ git push heroku master
Initializing repository, done.
Total 0 (delta 0), reused 0 (delta 0)

-----> Scala app detected
-----> Installing OpenJDK 1.7...done
-----> Downloading SBT...done
-----> Running: sbt compile stage
       Getting org.scala-sbt sbt 0.12.3 ...

It'll spew forth a lot of text, hopefully you should see something similar to:

[success] Total time: 140 s, completed Jan 30, 2014 3:26:53 AM
       [info] Generating /tmp/scala_buildpack_build_dir/target/scala-2.10/resource_managed/main/rebel.xml.
       [info] Wrote start script for mainClass := Some(JettyLauncher) to /tmp/scala_buildpack_build_dir/target/start
       [success] Total time: 1 s, completed Jan 30, 2014 3:26:55 AM
-----> Discovering process types
       Procfile declares types -> web

-----> Compressing... done, 204.8MB
-----> Launching... done, v6 deployed to Heroku

 * [new branch]      master -> master

Once that's done just visit your Heroku instance, in our case it would be Hopefully this helps some people trying to install GitBucket and deploy it to Heroku.

GitBucket certainly looks like it could have a lot of potential, probably even more if it wasn't developed in Scala/Java. I did come across one issue so far, I installed GitBucket one night and was too tired to write this up until the morning, when I returned to login to my GitBucket installation it had removed the user account I had created the night before. When I re-logged in with the default root user, it was as if the install had completely reset. The creation timestamp for the root user was today (just now). I will have to submit an issue to takezoe/gitbucket. Other then that, I haven't come across any other issues and I think I'll continue to follow this project.

Update: I guess I was still pretty tired when I wrote this article but the issue with my GitBucket instance "resetting" on Heroku was because they don't have a persistent disk system. Anytime the instance falls asleep or goes idle the disk state resets essentially. One should be using something like Amazon S3 for disk storage or another similar service. I should have known that as well...


Happy New Year - 2014!

It's been a while since I've written anything containing any sort of substance. I've been relatively busy between work and working on other various projects I haven't had any time to write anything down!

Savannah and I managed to snag both a Playstation 4 and an Xbox One on launch days (without pre-ordering at that). I must say I find myself using the Xbox One a lot more, most likely because more of my friends are on the Xbox platform. I got Killzone Shadow Fall for PS4 which I still haven't opened and Call of Duty: Ghosts for Xbox One which I've been playing a lot of. On Playstation 4 I did download a couple free games, Warframe and Blacklight: Retribution. I've only had some time to play a bit of Warframe but I did find it to be a fun game.

I've been mostly focusing on Call of Duty: Ghosts on Xbox One 🎮. Our clan won our first ever clan war this past week. We unlocked a couple new badges which was cool as well as leveled up our clan. I also managed to get this one badge I'd been trying to get for a while now. It's the Snooze Button patch which can be a real pain in the butt to get.

Savannah and I have also been watching Attack on Titan and we both really enjoy it. We're also working on Suzuka and we watched the first episode from Pokémon Origins. I enjoyed it, it was fun to reminisce and see a new Pokémon anime.

I also started working on Pokémon X again since I had put it down for a while. It's definitely a fun game, but I really need to level up my critters a lot if I want to have any chance at finishing the game. Some girl with a single Pokémon took out about 4 of my 6 Pokémon...eep!

I've also been busy working on as well as my new little anime list application. It takes place of my account on since I was getting a bit frustrated with the reliability and stability of their services. Currently it's only available to myself, but I may open it up to some close friends at some point.

Of screen and out of the tech world, I've been spending as much time as I can with my new Christmas present, which came in the form of a horse 🐴. He's a fantastic little (ok big) fellow, and I've been really having a lot of fun riding and working with him. It's really great having him because he gets me out of the house and out from behind the computer 💻.

Other then these things, not much else is going on. Just enjoying life and going wherever it takes us...🌾

My Anime List - 私のアニメリスト

I like anime, so it's only normal I would have an account at right?! I do, but for a while now the site has been deteriorating. The stability isn't what I'd like it to be, and being someone who rarely puts their data on other servers, I felt it was finally time to move away from

Over the course of about 10-12 hours I developed my own anime list application. Built from the ground up using PHP and MySQL and some fancy-dancy Javascript I now host my own anime list. At it's core it's very similar to however it's been trimmed down and most noticeably doesn't really include many community oriented features. Why? Because I rarely if ever used those features and I wanted to build an application that suites me and my needs. I really only care about keeping a list at this time to keep track of anime I am watching, or have watched, or dropped, etc...

While it's not available for public use at this time, I may consider implementing an invite feature which would allow me to invite some of my friends and in turn they could invite some of their friends. I am still working on backend features, such as searching, adding anime into the database and checking over the current code for catching various types of errors.

I've imported my list in it's entirety to my new applications and will hence using from this point on. I wish them nothing but the best of course, and I have no doubt in my mind, with a little TLC ❤️ they could be better then ever. For now, enjoy some screenshots:



My Very First Nendoroid

This is my very first nendoroid which I got for Christmas 🎄 this year. My girlfriend got it for me. It's Mirai Suenaga. I am hoping to get my hands on the Death Note characters, however they're a bit pricy, 3 at $200 💵 💵 💵 💵

I'll definitely take some more pictures soon! ☺️



Looking forward to fighting this big guy tonight and finally finishing The Legend of Zelda: Skyward Sword!! 🎮

Hearthstone: Heroes of Warcraft Beta


This weekend I finally got some time to sit down and play a little Heartstone: Heroes of Warcraft. The game is in beta, but it plays very well. This game also is the first time I used the game client. The client is simple and works great. It allows you to manage any games you've purchased through Blizzard such as World of Warcraft, Diablo III and Starcraft II. I only own World of Warcraft and, now Hearthstone, but hey, it works!

The game download is about 1.3GBs, so it only took a 10-15 minutes to download and get installed. Before I go further I must admit that I suck at card games, so that's why I put off installing and playing the game for about a week or so. The only card games I've ever played are Pokémon and the World of Warcraft card games (which I was terrible at). I never really got into card games, they just didn't interest me. The idea of card games sounded boring and slow. Wizards, magic, spells, stats, and strategy is definitely not my thing.

Hearthstone: Heroes of Warcraft may not be your traditional card game, but it's definitely a lot of fun, and I really enjoy playing it. The game starts with a tutorial of sorts. It shows you how to play your cards, how various types of cards work and how Hearthstone in general works. If they hadn't included this I'd probably have given up and uninstalled the game already. Hearthstone only took me about 10-15 minutes to understand and pick up. Essentially you have a hero (who is Jana Proudmoore to begin with) and minion cards whom fight for you. There are also other cards you can utilize to boost your stats or cast spells or restore health.


Once I made it through the tutorial I had a look into the store. You can purchase card packs to help build your collection. Each pack comes with 5 cards, one of which is guaranteed to be rare. Purchasing a pack during the beta also entails you to a special card from Blizzard as a thanks. I ended up getting 7 packs ($9.99) which seemed like a fair price to me; I didn't pay anything for the game, so I figured spending $10 on something I actually liked wouldn't hurt! After purchasing your packs, you get to virtually un-wrap them! Fun, I know!

Once I had unwrapped my 7 packs, the game brings you into your collection of cards. From here you can manage your decks and create custom ones. You can create decks per class as well. I quickly made what I thought was a good deck and gave a shot at playing against another human. I was quickly annihilated. Regardless I got some experience points and leveled up. One thing I am not sure about is if you gain more HP for your hero while leveling up or not, I guess I should pay more attention.


Besides playing against real humans you can also go into Practice mode which lets you play against the computer. I find this to be useful in that I can level up my hero, as well as unlock new heroes and gain new cards. The game also has quests which you can complete to unlock new cards and goodies.

I've played about 5 matches with real humans so far, and unlocked the hunter class hero Rexxar. I've only built a single Mage class custom deck, but I attribute this to a lack of time to do much more. I certainly will continue to play Hearthstone: Heroes of Warcraft and may even drop another $10 for a few more card packs. For someone who generally dislikes card games, I find myself to be quite interested in this one. I have a feeling people similar to me, those who really enjoy Warcraft but aren't into card games may find themselves surprised at how fun Hearthstone is. I think not having a monthly fee to play also really helps me enjoy the game a lot more then say World of Warcraft (even though I do enjoy WoW). I'm excited to see how the game progresses as I suck less and less and as the game becomes more mature.

If anyone out there is playing, let me know!