1 Month of Kanka.io

It’s been just over a month that the app has been launched in Alpha status, so I thought it would be interesting so write about the month and the experience. I previously wrote about the first 10 Days of the app, so figured it would be interesting to write about the first month.

Statistics

First, let’s look at some statistics. According to Google Analytics, the site has received about 1000 unique visits, with about 400 from the first day of posting about the app on Reddit. Just over 300 accounts have been created, with 96 accounts having logged in at least twice! 11 users have logged in more often than I have, which is a fun fact.

Considering I didn’t promote the app any more since launch, I am pleasantly surprised by the continued success of the app. About two accounts are currently created every day, so it’s all word of mouth.

Back to statistics! The top 5 of countries of usage are the USA (57%), Brazil (11%), Switzerland (9%), Canada (6.6%) and Germany (4.7%). Switzerland and Germany are where I mostly promote the app on social media (aka my friends), so it’s not surprising. What is however is obviously Brazil, which is humbling. What I am surprised however is the lack of the UK in the top 5, since the app is currently only available in English.

65% of users use their desktop computers, 33% their mobile, and 2% their tablets. I didn’t suspect mobile to be so high, but my usage is also to quickly write something down when I’m on the road and think about it. I’ll need to test the app more often on mobile in the future to insure that there are no usability problems creeping up with new features.

The most used entity are Characters but the most created entity are Locations (which means characters are accessed more frequently, but there are more locations).

Each campaign has an average of 1.16 users, with 10 campaigns having 3 or more users, and there are 12 pending campaign invitations, with most being over two weeks old.

Finances

Now on to finances! The server bill for November was $10.07 thanks to a 20% discount from a halloween promotion. This doesn’t include the $30 yearly cost for the domain name. I only expect costs to go up from here, as the app gets more attention. Images are currently hosted on the server, but I know that I will have to get extra hosting at some point in the future when more data is uploaded. The good news is that $10 was covered by Patron supporters, with half of the bill footed by one very generous Patreon!

Going forward

I’ll post another recap at the beginning of January with more in depth analysis for the month of December.

10 Days of Kanka.io

As I am writing this post, kanka.io has been live for just over ten days. It’s been an interesting and wild ride so far, which I will talk about in this post. I’ll be concentrating on promotion, reception, feedback and things that I didn’t plan for that happened.

kanka.io header

On Wednesday the 8th of November, I posted a link to the website in a self promotion thread on Reddit. It generated a few clicks, but no feedback or created accounts. I knew before hand that I was posting in the wrong place, but hoped for a bit of traction none the less. Seeing as I was unsuccessful, I contacted the moderators of the D&D subreddit with my plans to share a link to the app, to which they replied positively.

At 8:30 AM on Friday the 10th, I posted on that subreddit and was quickly flooded with feedback and created accounts. It was naive of me to post it on a day I was working, since I couldn’t dedicate my time to fixing errors from users and such. I did however manage to fix the easy bugs like a missing domain in the SSL certificate, but otherwise had to wait to finish my work day to start working on it.

Roughly twenty-four hours after the post was published, the app had reached over 400 visits and 120 created accounts. Another 24 hours later and the app totalled 200 users! It was way more successful than anticipated, and much praise was thrown in my direction. The most impressive for me was the people requesting a way to send me money to support the hosting and continual development of the app.

When I posted in the D&D subreddit, I was hoping for about 5-10 users to test the app (it is still in Alpha!), and generate a small list of interested users for the future development of it. I honestly scrambled to set up a Patreon and a subreddit for bug reports and update posts so that the users could interact with me. I did however set up a Twitter and Facebook before hand, but those haven’t attracted any traction, which is expected since I didn’t promote those pages in the post nor on the website.

I haven’t advertised the app anymore since the subreddit post, and daily visitors has steadily trended downwards. From 400 users on the first day to now 60 users on a Sunday. My plan is to promote the app again once more features are in the app, and target other sources than just Reddit.

Another thing I have to consider is to properly set up a Patreon reward system. My wife suggested giving Patreons a set number of pre-made characters or locations every month to the users, which I didn’t think much of at first but have since had the idea grow on me. This is however not a priority, as I want to pursue features for all users first. The patreon is set up in a way to promote a goal of 15$ a month, which currently represent the monthly cost of the app. These costs will probably go up as more users use the app and upload more content, but it’s fine for the time being.

I’ll try and post again in two weeks or so with more insight into the development of the app!

The Black Hack OSR

The Black Hack is a very simple and incredibly elegant role playing system created by David Black. I originally was introduced to this system by Matt from AFistfulOfDice over a year ago, and had forgotten about it until since. However, my wife, some friends and I went to a Pen&Paper convention the other day and while I was debating if I wanted to go as a DM, I had flashbacks about this system.

The Black Hack is a simple and fun RPG system

I ended up not being a DM at the event, but had loads of fun as a player with a DM that allowed all my crazy shenanigans. He had us play his own RPG system that was interesting and refreshing. After that session, I knew I wanted to give The Black Hack a go with my players. We have been playing Dungeons and Dragons 5th edition since 2013 and have slowly felt burnt out at times. Playing a different system has rekindled a flame in me that loves playing and tinkering with new things. I really enjoy playing with smart designs and thinking “oh, this makes so much sense!”, and I had those experiences both with the DM’s own system and with The Black Hack.

I also took a few cues from the event’s DM, as he had us define a goal for the party before we even started playing. My players love it when I create interesting stories and “railroad” them through it, but it is exhausting at times when I am always trying to outsmart myself. My wife especially will mostly figure out my NPC’s motivations and traps before I even give out most of the information, and while I love seeing her outsmart me, it always pushes me to think one step further. But by asking the party for their goal for a one shot, I could forget about it and just go with the flow, knowing that my players are getting mostly what they want.

My players ended up with a succubus-cleric, a pixie-thief and an orc-soldier. The black hack doesn’t have any stats for races like in D&D, so I told them to be whatever they wanted. I gave the Pixie player a “ring of growth” that they could wear for normal interactions and combat, but still transform into a tiny flying beast if they wished to (and they did on numerous occasions).

Next up was defining a party goal for the one shot. While they were talking about it, I prepared 3 NPC names with races and gender. Once they told me their goal is to open up their own tavern to make money, I had everything I needed for a session.

To keep this story somewhat short, I started the session by stating that their previous patron told the party that they could have his old run-down tavern in a small village he no longer uses, and told them they were now arriving at that village. They proceed to the location after asking for directions from locals, and find out that the previous patron’s ex-fiancée is living in the run-down building with her children. The party take pity of her situation, and decide to find another solution. While the succubus-cleric and pixie checked out the competition at the local tavern, the orc-soldier went to the mayor and asked about available property to buy. Among the locations was a cheapish run-down tavern that was infested with giant rats in the south of the village.

While the orc was busy, the other two stole from a local drunkard, who realised and attacked the party in the street to get his stolen gemstone back. This was our first experience with the combat of The Black Hat, and it was a lot of fun. It was easy, the players loved rolling for their attacks and those of the enemies, and it went well. After incapacitating two of the drunkard’s friends, the drunkard runs away and the local guard come and arrest the party for causing a fus in the street. To avoid being severely punished, the guard chief tasks the players with cleaning up the giant rats from the old tavern, giving them little choice in the matter, as they had no gold to pay for their fine anyway.

Next up was some investigation, some stealthing into the abandoned tavern, and some killing of giant rats. The Black Hat comes with a few monsters in it’s 23 page booklet, but it was easy for me to merge some various monster stats together to best fit giant rats (even making some of them poisonous).

The session ended before they could finish clearing out the abandoned tavern, but all the players had loads of fun with the system’s simplicity. The nicest thing for the players is that they could try everything and have a decent chance at it, since there is no “DC” to speak of: you either succeed your throw or you don’t.

All in all, I think I will try The Black Hat more in the future, especially for new players or larger groups. My biggest complaint with D&D 5e is that when you have 7 or more players, especially combat becomes a huge slog and is fun for no one. The Black Hack bypasses a lot of that by being simple and fast.

Building an online campaign manager

When I talk about an online campaign manager, tech-savy people will imagine I’m talking about some tool to track an online marketing campaign or other SEO related task. Luckily, the kind of campaign manager I’m talking about has nothing to do with search engines.

I’ve recently set out to build myself an online RPG campaign manager, or tool for helping me in my process of world building. I all started from a desire of my wife and I to start co-dungeon mastering a D&D game together, where one would be the dungeon master for a few sessions and the other a player, before switching the roles back and forth. I will write about that in a future post, but for now I wanted to concentrate on the tool we built together.

kanka.io is a labour of love. We started talking about the features we would need one evening and came up with the following requirements.

  • It should be online and be usable from both the phone and the computer.
  • We should be able to work on a campaign together.
  • A campaign should contains characters, locations, and session logs.
  • We should be able to organise our private campaigns in the same app, easily switching between the campaigns.
  • It should allow for updating pictures that we can then show the players.
  • We should easily be able to search through the created entities, and easily see what was recently modified.

Once the requirements were established, I hacked away using my favourite tools: Laravel and various plugins. I have always been a great fan of Laravel, but don’t get to use it at work, and hadn’t had a personal project for some time, so this was a perfect occasion to try out the 5.5 versions.

I went for an AdminLTE theme because that the one I use everyday at work and am most comfortable with, bypassing Laravel’s VueJS, but that is something I wish to come back to. For a future version of the app, I also wish to have a go at it with Angular, ReactNative or another fancy tool.

After a few weeks of developing the app, I had a first draft with which I was satisfied. The scope of tracked entities grew to the following:

  • Characters
  • Families
  • Locations
  • Organisations (cults, lobbies, revolutionaries etc)
  • Items
  • Notes
  • Journals

    kanka.io
    Kanka.io’s mobile dashboard

Almost every element has a free text “Type” value that can be used for sorting and searching. I debated for a while to make this a dropdown list of simply free text, but in the spirit of keeping it as flexible as possible, kept it as free text. I expect this to bite me in the future.

Now that the core was developed, I was eager to show it to my friends list to get some feedback. I quickly realised that my current hosting was an old Ubuntu 12.04, and didn’t support PHP 7 that Laravel required. After some quick googling, it ended up going for cloudWays. I didn’t want to spend time updating packages anymore, and there was an interesting $100 hallowing promo code available, so I took advantage of it when subscribing after a 3 day trial.

At the current time of writing, I have posted a link to my app to some friends and on a self-promotion thread on a subreddit. This has yet to transfer in any actual users, and finding said users will be for a next post, hopefully in a nearer future.

One last thing that I wish to talk about is the fact that I plan on keeping the app free. The code is even freely available on GitHub for people to wish to fork it. I hope to get enough people using it to set up a patron to cover the hosting costs. Now that I think about it, I should probably create a kanka.io category on this blog to keep track of progress!

Dabbling in Augmented Reality

I’ve been somewhat following augmented reality (AR) from a distance for a while now, and have always wished to get my feet wet and try some stuff. But as many before me, a lack of time and motivation to learn the toolsets has always stopped me.

That changed yesterday when we were talking about it at work for potential clients, and my colleague and I set sail on to new worlds.

He was to test AR with an SDK called wikitude, while I would test vuforia with Unity3D. We both had little to no prior experience with Unity3D, other than installing it and failing early on in the tutorial, and both had 0 experience with AR.

My setup was really easy. I had to follow several tutorials on YouTube, as I couldn’t find one that took me from start to finish and did what I wanted to do. After about 2 hours, my prototype was ready to show.

My next step is to work further on this in my free time, and I want to try and do the following:

  • Have a bigger item tracked, that will act as an arena
  • Have 2 monsters spawn when the image is tracked
  • Both monsters fight until one has no life points anymore
  • Monsters respawn when a new image appears

This should keep me busy for a while.

Side Income #1 – Follow up 1

Following up on my earlier article Side Income #1, my “fun” design has been taken down automatically because it looked too much like the original Yoda face. This makes sense, since I used a high-ranking google image result for “Yoda” to draw my version in Photoshop. I received an email from the redbubble team saying that the owners of the copyright had a history of being very picky.

While looking at other Yoda-èsque designs on the website, I noticed that a lot avoided being very obviously taken out of a picture of the movies. It would make sense that Lucas Film & Co would protect their IP, I just didn’t imagine it would be this draconian.

However, I do enjoy redbubble’s proative approache towards this issue. The last thing I want is an experience at a side income costing me more than just time!

So to continue with my experiment, as I haven’t yet sold anything on the website, I’ve uploaded a new original design. This was something I doodled in Photoshop and uploaded to the website. I don’t expect it to be a great success, but again, this is experimenting. As soon as I get more free time, I might design several t-shirts in the same “style” and see if it’s something that catches on.

Love Me t-shirt
Love Me t-shirt design

Side Income #1

For several years now, I’ve been thinking of ways to get some side income through one or several side hustles. I’ve decided to try several things in 2017 in that regard, and plan on reporting my steps and progress here on this site.

Income Comparison
Difference between the current situation and the desired situation.

Programming is an easy candidate to generate some side income. There are several large websites that put programmers in contact with people ready to pay for their work, and it can be quite lucrative to the point of being a main gig. My problem with this approach is that my day to day job is programming, and I don’t have the energy to program much at home in the evening or on weekends, as it’s not something I can do with my fiancée.

I’ve tried to write some short stories related to the Dungeons and Dragons adventure I run, but as with any craft, it requires experience to get to a point where I am happy with my work. I am no where near that point yet, and one of my goals is to use this site to improve on that front, posting short stories for free before I pursue the road of selling PDFs on Amazon & co.

One craft where I feel like I am skilled enough to justify a price tag is photography. I started in 2010 and have been doing it more or less consistently since. My focus is on people and cosplay, but I do enjoy taking pictures of landscapes on holiday, and enjoy editing those pictures afterwards in Lightroom. It is also a hobby I share with my fiancée, so bonus points for that.

Last night, I had an epiphany while I was browsing the redbubble website and realised that I could also sell some art on this platform. I already have the pictures to upload, and would only need to re-export them in a higher resolution and without the watermark. For fun, I also spent a bit longer than I’m willing to admit in photoshop to create an ugly t-shirt design involving a badly drawn Yoda saying “Great America Again Make”. This is for me to have metrics on political shitposting content vs more traditional content.

redbubble yoda maga
My Yoda #maga t-shirt design

I am currently limiting myself to redbubble and don’t plan on doing any advertisement, but work on tags and updating my store at a regular interval. Since my content is more poster friendly and that website is more apparel oriented, I don’t expect my strategy to generate much (if any at all to be honest). However, this will be a first experience that I will share with here.

Hopefully it will provide moderate success, otherwise I won’t have much to talk about. You can view my store on redbubble.

New MBR partition for Windows 10

I’ve recently updated my computer and realised that the drive containing my Windows 10 partition didn’t contain a MBR (master boot record) partition. This is because I originally installed Windows on a new disk while another disk with another version of Windows installed was present in the computer. This lead the MBR partition to be on the old disk.

This wasn’t a problem until the disk with the old installation died, and with it my ability to boot my computer.

Fixing it wasn’t as simple as booting the Windows 7 DVD and using a tool, so here are the steps I took and problems I faced.

First of, make sure there are no other drives attached to the computer except for the drive with your Windows partition. The repair tool on the DVD didn’t want to work as long as I had several disks connected.

Also, I had to make sure I was booting from the DVD in “UEFI” mode, since my motherboard is modernish (2011). This meant using the F8 key on the bios screen, and selecting the correct drive. I was also prompted to press on a key to actually start the Windows DVD. Doing nothing meant booting in “normal” mode, which also prompted an error.

With that out of the way, I managed to boot on the DVD and enter the repair tool, which is just a console command. I was lucky that my ssd still have about 500 mb of unpartitioned space that I could use for the MBR.

I ended up doing the following commands, following the instructions from here.

diskpart
list disk
select disk 0
list partition
create partition efi
format quick fs=fat32
list partition
exit

A breakdown of what I did.

diskpart. This is the tool to view and edit partitions on your drives.

list disk. Lists all your disks. Should only be one.

select disk 0. This is to select my first disk, based on the previous command.

list parition. Self-explanatory, it lists your partitions. Allowed me to make sure I had unaffected space at the end of my disk. If you don’t have space at the end, the rest will become more tricky, but you can resize your partition using other tools.

create partition efi. This tells diskpart to create a partition tagged “efi” at the end of the disk with all the remaining available space. If you don’t have enough space, following the link provided earlier as there is walk-through on how to shrink your main partition’s size.

format quick fs=fat32. Quickly format the new partition in the fat32 format. This is required for the MBR to load properly.

list partition. Make sure your new partition has been created and is in fat32 format.

exit. Exists the diskpart command, because there is still more to do.

Now that the efi partition is created and ready, we can rebuild the mbr with the following commands.

bcdboot C:\windows

Replace C:\ with the letter of your windows partition. This will recreate the mbr on your new partition and tell it where your windows is located.

There you go, you should be able to boot again.

Setting up the blog

For a first post, I thought it would be fitting to write down the process I followed to install this blog onto my website.

This website is hosted on a virtual server configured with an Ubuntu operating system, Nginx for the web server, MySQL for the databank, and PHP-FMP for scripting. I won’t cover any of this, since it’s pretty standard stuff.

Console

The blog is provided by WordPress that I installed on my server. The first thing to do was to download the compressed files to a destination of my liking and extract it. One might need to use the sudo command to get the following working.

cd /var/www
wget https://wordpress.org/latest.tar.gz
tar -xvf latest.tar.gz
rm latest.tar.gz
mv wordpress blog

These files needed some proper permissions, so following the WordPress instructions, I did the following.

find /var/www/blog/ -type d -exec chmod 755 {} \;
find /var/www/blog/ -type f -exec chmod 644 {} \;
chown -R myuser:www-data /var/www/blog
chown -R www-data:www-data /var/www/blog/wp-content/uploads

The last line allows the web user from uploading files into wp-content/uploads.



Nginx

As mentioned above, this server runs with Nginx, so I did the following to make it work. First, I created the /etc/nginx/sites-availables/blog file.

server {
 listen 443 ssl;
 server_name blog.jpayne.ch;
 root "/var/www/blog";

 index index.html index.htm index.php;

 charset utf-8;

 location / {
 try_files $uri $uri/ /index.php?$query_string;
 }

 location = /favicon.ico { access_log off; log_not_found off; }
 location = /robots.txt { access_log off; log_not_found off; }

 access_log off;
 error_log /var/log/nginx/blog-error.log error;

 sendfile off;


 client_max_body_size 16m;

 location ~ \.php$ {
 fastcgi_split_path_info ^(.+\.php)(/.+)$;
 fastcgi_pass unix:/var/run/php5-fpm.sock;
 fastcgi_index index.php;
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_intercept_errors off;
 fastcgi_buffer_size 16k;
 fastcgi_buffers 4 16k;
 fastcgi_connect_timeout 300;
 fastcgi_send_timeout 300;
 fastcgi_read_timeout 300;
 }

 location ~ /\.ht {
 deny all;
 }

 ssl_certificate /etc/letsencrypt/live/blog.jpayne.ch/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/blog.jpayne.ch/privkey.pem;

}

server {
 listen 80;
 listen [::]:80;

 server_name blog.jpayne.ch;

 location / {
 return 301 https://$host$request_uri;
 }
}

Can’t forget the symbolic link in the sites-enabled so that Nginx knows that this site needs to be loaded.

ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/blog

I use letsencrypt for my certificats, so I also needed to generate those.

certbot-auto certonly -a webroot --webroot-path=/var/www/blog -d blog.jpayne.ch

Now that all is set up, I can restart Nginx.

service nginx restart

MySQL

Next up is setting up the mysql schema and user. I have MysqlWorkbench set up to connect through ssh onto my server, which makes managing mysql very easy.  I created a schema simply called blog, as well as a new user with all permissions except grant to only the schema.

I did set up the matching host to 127.0.0.1 to make sure only a connection from the server itself would work.

DNS

So be able to access blog.jpayne.ch, I first had to creat a dns entry for it. This is a fairly simple process of me logging into the admin panel of my name provider, and creating a new CNAME.

WordPress

Now that my server and dns is properly set up, I can take care of my WordPress configuration. Navigating to my new blog dns prompted a configuration screen with the details for the mysql connection. Making sure I also set the host to be 127.0.0.1, the connection was successful. I had to manually create the wp-config.php.

I also added the following line in the wp-config file to improve security of the app.

## Disable Editing in Dashboard
define('DISALLOW_FILE_EDIT', true);

And voilà, the blog is ready to go! All I have left to do now is populate it with fake real data.

Hello world!

Hey, it’s another blog! I’ve recently had some thoughts I wanted to put down in text and share, so this seemed like the best way to achieve that. Might be as successful as all previous 9 tries, but you never know.