I previously wrote about installing my own instance of Reddit but I haven't done a lot with. This post is really just to share a couple things I have been trying to work on to make the Reddit instance usable.

I've mostly just been working to try to get my instance to suck in text and link posts from the real, however I know very little about Python so I currently am only able to fetch some posts, but I am not sure how I get them into my instance as a specific user. Here's my script so far:


import praw
import logging


r = praw.Reddit(user_agent="Ubuntu:reddit.local:v0.1 (by /u/jimmybreddit)")

for submission in subreddit.get_new(limit=10):
    print "---------------------------------"
    print submission.title
    if submission.is_self == True
        print submission.selftext
        print submission.url
    print "---------------------------------"

I am going to keep working on it, and hopefully one day I can get my Reddit instance to pull in posts as a bot. 😄

Update - November 18, 2015: I've been working on my Reddit API script and this is what I've come up with:


import praw
import logging
import time
import calendar


fh = open("/home/username/Scripts/", "r")
previous =

r = praw.Reddit(user_agent='Ubuntu:reddit.local:v0.1 (by /u/username)', site_name='reddit')

for submission in subreddit.get_new(limit=50):
    if int(submission.created) > int(previous):
        if submission.is_self == True:
            rl = praw.Reddit(user_agent='Ubuntu:reddit.local:v0.1 (by /u/username)', site_name='local_dev')
            rl.login(username="$USERNAME", password="$PASSWORD")
            rl.submit('announcements', submission.title, text=submission.selftext)
            print "Submitting Text: " + submission.title
        if submission.is_self == False:
            rl = praw.Reddit(user_agent='Ubuntu:reddit.local:v0.1 (by /u/username)', site_name='local_dev')
            rl.login(username="$USERNAME", password="$PASSWORD")
            check = r.request_json("http://reddit.local/api/info/.json", params={"url": submission.url})
            if check == '':
                rl.submit('announcements', submission.title, url=submission.url)
                print "Submitting Link: " + submission.title

timenow = calendar.timegm(time.gmtime())
timenow = int(timenow) + 25200

fh = open("/home/username/Scripts/","w")

So what this script does is connects with and pulls the last 50 new submissions from a specific subreddit. It relies on a seprate file which stores the date of the last check and should only submit new submissions since that date. The date is stored in a Unix timestamp value. It also checks if the submission is a text post or link. If a link it checks the local installation to ensure the link hasn't been submitted to the subreddit before.

Now, I still had some issues with this, where submissions coming in from where posted in the future. I have no idea how that happened. Due to this, it resulted in duplicate posts to my local installation, but beyond this the script worked well.

Also of note, this script uses no authentication to and username and password authentication to the local installation. Obviously not ideal. It should be using OAuth2, but I didn't have time or patience to wrap my head around that.


I started using the hosted version of Hacked about a year ago, however, ever since they got bought out by Dropbox I haven't been using them as much. I don't believe it was the buy-out that triggered it, but most likely another alternative solution that I used instead.

Back in April of 2015 the Hackpad team announced they would be releasing the source code to Hackpad so one could host it on their own server. I was absolutely enthralled. However, once the buy-out happened, it took quite a while for them to actually release the source. Finally though it happened!

It should be noted that it looks like Hackpad is actually just a prettied up version of Etherpad with a few extra features.

Installing Hackpad is actually pretty easy, especially if you're familiar with installing self-hosted applications and have some system administration experience.

I setup a VPS to run my Hackpad install on. It has 4 virtual-cores, 6GBs of RAM and a 60GB hard disk. I also installed CentOS 6.7 64bit as my operating system.

Install Java JDK

Once you've got your system setup, you'll want to snag a copy of Java JDK:

cd /usr/src
wget --no-cookies --no-check-certificate --header "Cookie:; oraclelicense=accept-securebackup-cookie" ""
tar zxvf jdk-7u79-linux-x64.tar.gz

This will download the Java software and then uncompress it. Next you'll need to install it.

cp -Rva jdk1.7.0_79/ /opt/
cd /opt/
cd jdk1.7.0_79/
alternatives --install /usr/bin/java java /opt/jdk1.7.0_60/bin/java 2
alternatives --config java
export JAVA_HOME=/opt/jdk1.7.0_79
export JRE_HOME=/opt/jdk1.7.0_79/jre
export PATH=$PATH:/opt/jdk1.7.0_79/bin:/opt/jdk1.7.0_79/jre/bin

Install Git

Next we'll install Git.

yum -y install git

Get the Hackpad Source Code

Now it's time to get the source code for Hackpad!

cd /opt
git clone

Install Nginx

Now let's go back over to /usr/src and snag Nginx.

cd /usr/src
rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum install nginx

Next, go into /etc/nginx/conf.d and create a hackpad.conf file.

cd /etc/nginx/conf.d
nano hackpad.conf

Place the following into the hackpad.conf file:

# Upstream configuration
upstream hackpad_upstream {  
     keepalive 64;

# Public
server {  
    listen 80;
    server_name ~^(.+)$; # domain of my site

   location / {
        proxy_http_version 1.1;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-NginX-Proxy    true;
        proxy_set_header   Host             $http_host;
        proxy_set_header   Upgrade          $http_upgrade;
        proxy_redirect     off;
        proxy_pass         http://hackpad_upstream;

Now make sure to enable Nginx on system start:

chkconfig nginx on

Install MySQL

Time to get MySQL installed. Use these commands to install MySQL 5.5.x.

yum -y install mysql-server
yum -y install mysql-client
rpm -Uvh
rpm -q mysql mysql-server
yum install mysql.`uname -i` yum-plugin-replace
yum replace mysql --replace-with mysql55w
service mysqld start

The last command will be a bit interactive and you'll be asked a few questions about root passwords and removing test data and such.

I also recommend setting MySQL to start on boot:

chkconfig mysqld on

Next bring up Nginx:

/etc/init.d/nginx restart

Install Scala

Now we need Scala!

cd /usr/src
tar xvf scala-2.11.7.tgz
cp -Rva scala-2.11.7/ /usr/lib/
ln -s /usr/lib/scala-2.11.7/ /usr/lib/scala
export PATH=$PATH:/usr/lib/scala/bin

Configuring Hackpad - Part I

Now we need to do a little bit of tweaking to the Hackpad files to get it to run properly in our CentOS environment.

cd /opt/hackpad/
nano bin/

The following it what I need to change my file to get it working in a CentOS 6.x environment:

# These lines assume you installed Scala via Homebrew.
export SCALA_HOME="/usr/lib/scala"
export SCALA="$SCALA_HOME/bin/scala"
export SCALA_LIBRARY_JAR="$SCALA_HOME/lib/scala-library.jar"

export JAVA_HOME="/opt/jdk1.7.0_79"
export JAVA="/opt/jdk1.7.0_79/bin/java"

Setting Up MySQL

The next part may be possible to do a different way, but I just wanted to get my Hackpad instance up and running quickly. First edit the following file:

nano contrib/scripts/

Update the MySQL username and password, I just used the root MySQL user and password. That should be all you need to edit here. Now run this command:


This should populate MySQL with the necessary items to run Hackpad. Once that is done, I removed the credentials from the file.

Configuring Hackpad - Part II

I recommend creating a new MySQL user to use for your Hackpad. Google is great if you need some help creating a MySQL user and giving it access to the newly created hackpad database.

Next we'll want to create a configuration file for our Hackpad instance.

cp etherpad/etc/ etherpad/etc/
nano etherpad/etc/

If you followed my above recommendation on creating a new MySQL user, you'll want to edit the following in the configuration file:

etherpad.SQL_PASSWORD =
etherpad.SQL_USERNAME =

I also recommend editing the following as well:

topdomains =
customBrandingName =
customEmailAddress =
customEmailImapPassword =
supportEmailAddress =
etherpad.canonicalDomain =
smtpServer =
smtpUser =
smtpPass =

Save and you should be all set.

Build the App

Run this command which should build the app.


Run the App

Now run this command which should start up the app. Upon first start it may take a minute so don't worry!


If all is well should be able to visit or whatever URL you've set it up within Nginx.

You can now create yourself an account via the web page interface of Hackpad. If you've setup the SMTP details you should have gotten an account verification email. If not, you'll need to go into the database to grab your token out of the email_signup table. Then visit a URL like this:

This will activate your account and you can start using Hackpad!


  1. I am not sure my MySQL installation notes are 100% right. I am thinking you may not need to do the yum install mysql-server and yum install mysql-client first. You may be able to just fetch the MySQL 5.5 repository and install that right off the bat. I just didn't have time to test this out.
  2. The SMTP stuff didn't work right even though I had filled out the SMTP details in the configuration file. I just got some giant Java error whenever the system tried sending an email. Having a second thought about this, it may be because I didn't install anything like Exim or Postfix, so that may be worth checking.
  3. Inserting images does not appear to be working. I assume images are uploaded to Amazon S3 but I can't seem to figure that out for sure. I didn't try using the URL of an image instead to use images in my documents but I assume that might actually work.



My Habitica Instance -

I subscribe to /r/selfhosted and they have a link to another fantasic page which lists tons of software you can host on your own system. From there I found Habitica which is:

Habitica is a free habit building and productivity app that treats your real life like a game. With in-game rewards and punishments to motivate you and a strong social network to inspire you, Habitica can help you achieve your goals to become healthy, hard-working, and happy.

I provisioned myself a new VPS with the following specs:

  • 80GB Disk Space
  • 4GBs RAM
  • 4-cores for CPU
  • Ubuntu 15.04

Now Habitica has some installation instructions which can be found here, but I found that I did some Googling around since I hit a couple snags while installing. So before we jump into getting Habitica installed there's some pre-requisites that need to be installed first.

I had some issues running npm install so I had to adjust my DCACHESIZE in the containers OpenVZ configuration. I used the following value(s):


Of note, once I made this change, I restarted the container and confirmed I could then run npm install without issue.


Habitica utilizes MongoDB for storing data. I utilize this guide here for getting it installed into my Ubuntu 15.04 environment. You should be able to utilize the following steps to get it installed if on Ubuntu 15.04 (assuming you're running the commands as root:

  1. Install the MongoDB repository key:
    apt-key adv --keyserver hkp:// --recv 7F0CEB10
  2. Now add the MongoDB repository to the system:
    echo "deb wheezy/mongodb-org/3.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
  3. Now run apt-get update
  4. Now install MongoDB! apt-get install mongodb-org
  5. You can now run the following to ensure MOngoDB is up and running:
    sudo systemctl status mongod

NodeJS & NPM

Next we'll want to get NodeJS and npm installed. This should be pretty easy.

apt-get install python-software-properties
apt-add-repository ppa:chris-lea/node.js
apt-get install nodejs
apt-get install npm
apt-get install nodejs-legacy

Git - Cloning HabitRPG/habitrpg

Now we want to get the Habitca code to run. First you'll want to create your own fork of the Habitica code. This can easily be done from the GitHub interface. You can find the Habitica repository here.

Once you have your own fork, you can run the following:

git clone
git remote add upstream

You can then run git remote -v and you should see output similar to this:

origin (fetch)
origin (push)
upstream (fetch)
upstream (push)

Of note, I put my Habitica code into /opt/ so it all lives in /opt/habitrpg.

Configuring and Running Habitica

We're almost there, just a few more steps. I found that you need to install the following package in Ubuntu to when running npm install.

apt-get install libkrb5-dev

Next run these commands to install some packages:

npm install -g gulp grunt-cli bower
bower install --allow-root
npm install

This should install everything that Habitica needs to run. Next you'll want to copy over the example configuration file:

cp config.json.example config.json

If you don't plan on using email then nothing needs to be done with the file. However if you plan on needing email to work you'll want to edit at least the ADMIN_EMAIL, SMTP_USER, SMTP_PASS and SMTP_SERVICE values.

Once that is done you should be ready to start up Habitica!

npm start

It may take a minute to start up, but when it does you should be able to visit http://localhost:3000.

Bonus Items - Nginx & Mailgun

Alright, so if you're like me and you've install Habitica on a remote VPS, obviously accessing http://localhost:3000 isn't going to work. This is were Nginx comes in and I use it as a proxy so I can access my Habitica instance at instead. First you'll want to install Nginx:

apt-get install nginx

Next, you'll want to create a Nginx configuration file for Habitica:

cd /etc/nginx/site-available
nano habitica

Now you'll want to put the following into your habitica file:

# Upstream configuration
upstream shout_upstream {  
     keepalive 64;

# Public
server {  
    listen 80;
    server_name; # domain of my site

   location / {
        proxy_http_version 1.1;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-NginX-Proxy    true;
        proxy_set_header   Host             $http_host;
        proxy_set_header   Upgrade          $http_upgrade;
        proxy_redirect     off;
        proxy_pass         http://shout_upstream;

Next, run this comamnd:

cd /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available/habitica .
/etc/init.d/nginx restart

Now you should be able to access your Habitica instance at your own domain!

If you'd like to use email with your Habitica instance you can set it up with a wide variety of services. I needed to use email to reset my password so I had to get it setup and running. You will need to open the config.json file in your favorite text editor and locate the following lines:

"SMTP_PORT": 587,
"SMTP_TLS": true,

I used Mailgun to handle email for my Habitica instance, but there's quite a wide variety of popular email services this can work with. I also tested Gmail and confirmed that works fine as well.

One of the really nice things about Habitica is that when you save this file, the server will reload itself automatically and use any new configurations.


I am still learning about how Habitica works, how the MongoDB schema is setup as well as about MongoDB commands as well. It's fun and I think Habitica will be a fun way to keep track of tasks I need to be doing. Anyone is welcome to sign up for an account on the server as well!


Minecraft Story Mode

Ever since seeing the trailing for Minecraft: Story Mode I've been pretty excited about the game. It just came out a couple weeks ago and I've had the chance to play through Episode 1 and 2 so far.

I don't intended to write a full and completely in-depth review in this post, but I wanted to give some thoughts I had.

The game itself is a lot of fun, and I really enjoy the story even if it's nothing new. The game for me it's been a nice break between the FPS shooters I've been normally playing. The characters are fun and funny in their own unique ways, even Ruben the pig has his own personality.

One thing which is turning me off from the game is that when I think of Minecraft and the Minecraft universe is that it's all about exploring and going off the beaten path to make your own. This game is very linear and allows for very little if any exploration. It's too bad because the design of the world is beautiful and vibrant and being someone who is curious, it's get frustrating at times when you're forced to go in a single direction throughout the game. I know that's to be expected and this isn't the Minecraft we normally think of, but it would be so nice to be able to just go off and explore the worlds and levels further then what's allowed.

Overall, I do enjoy the game, I just need to stop thinking that it's an exploration game like the normal Minecraft game and that it truely is 'Story Mode'. I am looking forward to Episode 3 😄 🎮

Xserve + OS X Yosemite 10.10.5

This year I aquired a 2006 Xserve for relatively cheap. Unfortunately I hadn't realized that in order to bring it up to date in terms of putting a later version of OS X on it I would need a new graphics card that was supported by the later versions of OS X.

Just this last week I also managed to get my hands on a 2009 MacPro which came with two NVIDIA GT 120 video cards. I pulled one and placed it into the Xserve. After a few hours of hacking apart the OS X installer, I finally had OS X 10.10.5 running on it!


  • 8GB+ USB Flash Drive
  • Copy of OS X Yosemite installer app
  • 2GBs of RAM on destination Mac
  • Flat Package Editor
  • Pacifist

Creating Modified OS X Yosemite Installer

  1. Open Disk Utility and format your flash key. Ensure to set the Scheme as GUID and format as OS X Extended (Journaled) / HFS+.
  2. Download the OS X Yosemite installer from the App Store.
  3. Once the installer has finished downloading it, I recommend making a copy of it. I placed my copy into ~/Downloads/tmp/. Right click on the copy you've made, and select, Show Package Contents. Go to /Contents/Resources/SharedSupport and open the .dmg file.
  4. You will now need to show hidden files which can easily be done with a Terminal command: defaults write AppleShowAllFiles YES && killall -9 Finder
  5. Now navigate to the .dmg file you've just mounted. Locate the BaseSystem.dmg file. This part may be a bit tricky depending on the system you're working on. I did this on OS X El Capitan where the Disk Utility app got quite the overhaul. Previous to this you were able to just drag an image file into the sidebar however in El Capitan it seems to be a bit of a different process. I first went to Images >> Scan Image for Restore and selected the BaseSystem.dmg. Once the scanning is done, then click on the partion (not the root device) and go again to Image from the menu bar but this time choose the Restore option. Select the BaseSystem.dmg file. I believe it took about 5-10 minutes to complete.
  6. Once the restore is done, go back over the .dmg you originally mounted and and copy the Packages folder. Paste this folder into your flash key to the directory, /System/Installation/. This will take a bit longer as it's about 5.5GBs in size. It took about 30-45 minutes when I did this.
  7. You will now need to start editing some of the installer files. It's very important these files do not get corrupted or edited incorrectly. You must be very careful to ensure you're replacing the right things else your installer won't work. You may want to create copies of the files you're editing before you do so, just in case something goes wrong.
  8. First you'll need to obtain your Mac's Board-ID value. If you have OS X already running on the Mac you're wanting to upgrade you should be able to use an app,, which can provide this ID to you. If you don't, there's a fantastic list of IDs here. Once you have your ID, go to your flash key and open the following file in a text editor (I recommend Atom), /System/Installation/Packages/InstallableMachines.plist. Go to the last ID and replace it with your own. I have my .plist file here if you want to reference or even use it. It's been modified for the Xserve 1,1 model.
  9. Next you'll want to open and edit /System/Library/CoreServices/PlatformSupport.plist. You can reference or use mine, it is pre-edited for the Xserve 1,1 model. You'll want to again put in the board ID as well as the model.
  10. On your flash drive, make a copy of the following file, /System/Installation/Packages/OSInstall.mpkg. I put mine into ~/Downloads/tmp/. Open your copy of the OSInstall.mpkg in the Flat Package Editor. Extract the Distribution file and open it in your text editor. Locate the var platformSupportValues=[" ... "]; section and add your board ID value here. You can see my edited file here. Save and then replace the original file inside the OSInstall.mpkg. You'll want to delete the original from the .mpkg file and the insert your edited file. Save the OSInstall.mpkg file and replace it into the flash drive at /System/Installation/Packages/.
  11. Again, go to the .dmg you originally mounted and copy the BaseSystem.dmg and BaseSystem.chunklist and paste them into the root of your flash drive.
  12. Using Pacifist open the following file from the original .dmg that was mounted - Packages >> Essentials.pkg. Once this is opened up navigate to /System/Library/Kernels and extract the kernel file.
  13. Go to your flash key, and navigate to /System/Library. Create a new directory in here called, Kernels. Take your extracted kernel file and place it into this new directory.
  14. This step is somewhat optional, but very important if your system has 32-bit EFI. You will need to download a modified boot.efi file. I used the one here, and it seemed to have no issues. You'll want to copy this boot.efi into the following two locations on your flash drive, /System/Library/CoreServices/ and /usr/standalone/i386/.
  15. At this point your installer should be all ready to rock and roll. Moment of trust, you'll attach it to your Mac and boot from it. You can hold the Alt key to get to a list of bootable drives connected to the Mac if it doesnt automatically boot from it.
  16. Hopefully your install has gone without a hitch. Once you've installed and rebooted into OS X Yosemite, I highly recommend installing the PikeYoseFix script. This will allow you to install any OS updates without issue. Normally during an OS update some files will get replaced which can prevent the system from booting.


Well this is definitely awesome. 👍

I'm actually looking forward to this. It could be interesting...

I played around with the API offered through DigitalOcean this morning. I got exactly what I wanted and got a table of my current droplets. Now, it might be cool if I added some additional functionality like rebooting, or starting and stopping the droplets. Or maybe I could provision droplets right from our dashboard! That would be cool!

Dashboard w. DigitalOcean API

I absolutely hate when companies who are purchased by larger companies put this crap into their announcements.

Yet, it's only the beginning. Our aspirations are much bigger. Joining BIG-COMPANY gives us access to a massive wealth of expertise, technology and people that a small company like us could only dream of amassing on its own.

99% of the time this rarely holds true. They always try to explain how things are only going to be better for the end-user, but the reality of it is that someone got a big fat check and that's the end of it. The purchasing company usually shits all over the application or software, support goes bad, product loses original focus, product is forgotten about, product ceases to exist. It's really too bad.

When this happens I usually jump ship and either look for another hosted solution or try to roll my own. Props to product owners who sell big, but you might as well as just let us know, the product is going to get lost in the bowels of whatever large company they just sold too. 😥 😥 😥

Treasure! #HeroesoftheStorm #Murky #Warcraft #videogame #Murloc :heart_eyes: :moneybag: :heart_eyes: :moneybag:

A photo posted by Jimmy B. :videogame: :horse: (@jimmybrancaccio) on

cPanel Paper Lantern Style

A couple weeks ago I had the pleasure of working with one of the product owners at my job. During that time I got a crash course in creating styles for the new Paper Lantern theme in cPanel. I have been pretty excited about the Paper Lantern theme for some time now, especially since it's based on the Bootstrap framework.

The whole process of creating a style is actually quite easy. As I understand it there's 3 places where one can place a style. The first is at the root level and would allow any user on the system to use the style. The style would be placed into the /var/cpanel/customizations/styled/. The second would be at the reseller level and the directory where your style(s) would be stored would be within /home/reseller/var/cpanel/reseller/styled/. This would allow any sub-accounts of the reseller to use the style. The last would be per account. That's right, ANYONE who has a cPanel account can create their own Paper Lantern style! At the account level, the style may be placed in /home/username/var/cpanel/styled/.

I spent about 45 minutes to an hour building my own style. It can be seen above an is very simple. Styling Paper Lantern is so simple, I'm really glad they moved over to the Bootstrap framework (this site uses it too).