Roguebasin 2021 Migration and some history

tldr: Roguebasin has been migrated to its own Virtual Machine at DigitalOcean, and upgraded to MediaWiki 1.36.0 + PHP 7.4.3. As a result, it’s currently running MUCH faster and hopefully will not have any downtime.

January 16, 2005. I set up the first version of roguebasin using a long-gone service called, imagine it being a predecessor of wikia /, only much less stable and feature-full. It soon went down and become unreliable as the people of r.g.r.d. jumped in to contribute, but it worked well enough to gather the attention of the community.

January 26, 2005. I got an email from DarkGod where he offered to host roguebasin at’s server. “The basin is a good idea, and I’d hate to see it fade away, the RL community needs something like that!“. He alongside “Pav” set up the first mediawiki installation, the foundations of the current roguebasin.

August 2, 2006. After being battered by spambots for a while, the wiki was no longer accepting new user accounts except thru a cumbersome manual process. We decided we had to change how it was operating so someone could take better care of the technical setup of the wiki. It was finally moved to, the domain of the long-time roguelike developer Björn Ritzl, who would host it for almost 15 years.

June 19, 2011, RogueBasin was moved by Björn to a new and more reliable webhost and the domain was set up by myself.

By 2021, there had been many reports of the wiki being too slow or going down sometimes. I contacted Björn and he agreed to hand over the hosting to me. I noticed we were still using MediaWiki 1.19 from 2012, probably due to having to stick with PHP5 on Björn’s hosting account so my first priority was changing that as well as getting it to its own more private hosting where we could scale resources as needed.

June 17, 2021. After almost 10 years of the last server movement, Roguebasin has been migrated from hosting to its own Virtual Machine at DigitalOcean, and upgraded to MediaWiki 1.36.0 + PHP 7.4.3. As a result, it’s currently running MUCH faster and hopefully will not have any downtime. We also will be able to address the spambots situation with more modern weapons.

I also restored the logo, which was actually the result of a small contest we ran at r.g.r.d, the winner was Radomir “TheSheep” Dopieralski, who used to be very active on the roguelike community back then.

I also took this opportunity to update some of the front page content to the roguelike reality of 2021, because times have changed.

Coming up for roguebasin:

  • HTTPS setup
  • User list cleanup (not as easy as it sounds with thousands of spambot accounts)
  • More community things!

“Tweet of the Day” added to

Added a component to my project’s website called “tweet of the day”, it picks a project from the list and then formats its data as a tweet.


At some point in the future I might set it up so that the tweet is done automatically, for now, I myself am copying it, editing it (sometimes picking a better URL than it currently does), tagging contributors correctly, etc. All these things I might automatize sometime.

In order to give each project a fair chance of appearing, and not repeating projects too often, I’m shuffling the projects using seededshuffle, and then picking one based on the day of the epoch.

const ss = require('seededshuffle');
projects = ss.shuffle(projects, 'patienceIsTheKey', true);
const now = new Date();
const fullDaysSinceEpoch = Math.floor(now/8.64e7);
project = flatProjects[fullDaysSinceEpoch % projects.length];

As an added thing, when it picks a project that is currently unavailable, I’m trying to come up with at least a gameplay video or something that shows what it was like. Right now there are lots of dead links in the page (naturally). updated

Some minor maintenance on my projects’ website, powered by ReactJS, ended up with pretty big changes, the most visible one is the revamp on the “collaborators” section, which now shows what games I worked with that person.

Screen Shot 2018-12-26 at 2.22.21 PM

Additionally, I added an “activity” classification per project, which can be either active, paused, stalled, stopped or finished, to reflect on what is the perspective for future work on it.

I also relocated the filters into the header and updated the texts a bit.

New website, now powered by ReactJS

The website for my project collection ( is now powered by ReactJS. I had to learn how to use it so I figured it was a good idea to update it.

The previous implementation was powered by mustachejs, which was used with nodejs to generate a static html file. I still like that approach, however it didn’t allow by itself for interaction with the data.

Although appearance is very similar, this new version:

  • Allows filtering by project status (and may allow other filters in the future). This also means the groupings by project status are gone now (they made navigation a bit confusing too). This was done using React’s state handling.
  • Has projects sorted descending by project year
  • Adds tags for all the projects with a color code

With this, I’m now officially a Level 1 ReactJS developer. If you are curious or would like to do something similar, you can check out the project repo here.

Static HTML generation for website using MustacheJS

I did some back-end changes for the website, with the idea of making it easier to include new projects and update their status. About one year ago I went for a single page layout, but was doing maintenance over the HTML file… which was a bit frustrating. With the new approach I can easily manipulate how the list of projects is shown. You can see the current results at

I looked around a bit for a static site generator, but in the end decided to roll my own since what I was going for was extremely simple and didn’t want to meddle with the setup of any of these.

What I needed was generating a single HTML file based on a JSON file with the information of all my projects. I decided to go for nodejs using mustachejs for the template; the script is dead simple… I thought I’d share what I did, in case someone needs something similar. This approach gives you a lot of flexibility, as long as you don’t need to maintain a lot of different pages.


First, the data, it’s basically a structured list of all my projects

	"sections": [
			"name": "Games",
			"id": "games",
			"items": [
					"title": "Ananias",
					"image": "img/buttons/ananias.png",
					"text": "Dive to the bottom of the Tomb of Ananias using your smartphone or computer. Take adventure with you everywhere!.",
					"status": "published",
					"buttons": [
							"title": "Play Online",
							"url": ""
							"title": "Android Version",
							"url": ""
							"title": "Desktop Version",
							"url": ""
					"tags": ["turn-based", "stable", "denzi", "roguelike", "pixel-art", "javascript", "android"]
					"title": "Rodney",
					"image": "img/buttons/rodney.png",
					"text": "Slash your way to the bottom of the Dungeons of Doom, learn new skills and use tactics to survive.",
					"status": "published",
					"buttons": [
							"title": "Play Online",
							"url": ""
					"tags": ["turn-based", "stable", "oryx", "roguelike", "pixel-art", "javascript"]

Now, the generator itself, it basically reads the data and the template, parses the JSON and then renders it using MustacheJS

function generateFile(){
	var file = fs.readFileSync('data.json').toString();
	var template = fs.readFileSync('template.html').toString();
	var data = JSON.parse(file);
	groupByStatus(data); // Groups by status and sorts items
	calculateNewRows(data); // Adds the newRow and endRow attributes
	var output = Mustache.render(template, data);
	fs.writeFile('index.html', output);

Now, I had to add the groupByStatus and calculateNewRows functions in order to do some processing over the raw project data (namely grouping the projects by status and grouping them by 3); Mustache declares itself as a logic-less template system, which means it lacks if/else statements or loops. All it does is replacing stuff. You may have to do something similar, depending on how complex you need your page to be.

Finally, this is my Mustache template, as you can see, it’s pretty simple

<!DOCTYPE html>
<html lang="en">
	<link rel="icon" type="image/png" href="img/icon.png">
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
	<link href="lib/bs3/css/bootstrap.css" rel="stylesheet">
	<link href="css/slashland.css" rel="stylesheet">
	<!--[if lt IE 9]>
		<script src="lib/bs3/js/html5shiv.js"></script>
		<script src="lib/bs3/js/respond.min.js"></script>
	<script type="text/javascript" src="lib/jquery-1.10.2.min.js"></script>
	<script type="text/javascript" src="lib/bs3/js/bootstrap.js"></script>
<section class = "container">
	<section class = "page-header">
		<div class = "row">
			<div class="col-md-2">
				<div id="logoImage"></div>
			<div class="col-md-5">
				<p>I'm Slash. This is my collection of game projects, I hope you like them!.</p>
				<p>You might also want to check <a href = "">Slashware Interactive</a>, which is my brand for finished products.</p>
				<ul class="nav nav-pills">
					<li><a href = "" target = "_blank">Blog</a></li>
					<li><a href = "" target = "_blank">Twitter</a></li>
<section id = "{{id}}">
	<div class = "container">
		{{#count}}<h2>{{count}} projects</h2>{{/count}}
		<div class = "container">
			<div class = "row">
				<div class="col-md-4">
					<div class="thumbnail">
						<img src = "{{image}}"/>
						<div class="caption">
								<span class = "label label-success">{{.}}</span>
							<a href = "{{url}}" target = "_blank" class = "btn btn-primary" role = "button">{{title}}</a>

<div id = "footer" class = "text-right">
	<p>Copyright (c) 2004 - 2016 Santiago Zapata</p>
	<p>Generated using <a href = "" target = "_blank">mustachejs</a></p>

You can find the mustache tags in the “sections” section, as you can see mustache interprets each attribute contextually from the source object.

The # mustache tags (for example {{#sections}}) represent a repeating block; the contents inside will be replicated for each one of the objects if the attribute is a list, or once if the attribute exists. (this is used for example on the {{#image}} block, to only show the image tag if the project has an image)

The double and triple mustache tags {{}} and {{{}}} are replaced with the value of the attribute of the given name on the context object. The triple mustache leaves HTML content unscaped, which may be useful if you want to include HTML content directly.

Finally, the {{.}} tag is used to include the value of an object directly, it’s useful for example to include the content of arrays of strings.

And that’s about it! now I can easily add new projects without having the worry about the page layout! My program sorts the projects in alphabetical order and groups them by type and status. What’s also important for me is it takes care of the grouping by 3 items which is required by the way I’m using bootstrap.

And of course, the main point of this is decoupling the data from the view, which in turns takes me to the following point: I may in the future work a bit in the frontend side, to maybe get rid of bootstrap and include some filters…

I hope this is useful for someone to create a simple portfolio or similar page.

Keeping things online…. is almost ready, access to ArcherFire and Vuelta a Colombia has been reestablished….

Vuelta a Colombia
Vuelta a Colombia

Virtual Games on the other hand, was a complete pain… Struggled a lot and in the end, SWFs were not showing up. I had a bad feeling that there’s some URLs hardcoded inside them… Finally, it stroke me: This is a sign I should just give it up, let it go and focus on something else… So I decided to drop support for Virtual Games for now.

Gosh! sorting this all out takes so much time! I better go back to developing instead of wasting time like this… :/

Yet Another (Big) Restructuring

Some changes again going on!

Slashware Interactive has revived as a game development brand, Slashware Software Solutions is now the brand name for the currently inactive corporate software development line and the ancient has arisen again! that has brought the following website changes… has revived (and is gone); the ancient e107 installation has been removed and its contents merged with the former is my collection of game projects, with a very personal touch. (New website); holds the games that are finished products meant for public consumption. It’s still a bit buggy, there’s work to be done to reenable SSL certificates, relocate stuff and update some of the games to the latest changes on the facebook micropayments API.

Finally, acts as the website for Slashware Software Solutions, basically holding the entry points for Slashware’s three products that still gotta be polished for the public (However they are readily accesible already!)

Slashland, on the other hand, is this blog… and it’s very closely tied to, except I can find no way for them both to coexist since won’t let me host the blog in a subdomain (or does it?) in any case it may end up as either or

Let me know what you think and any findings! I’m keeping all pending tasks for the websites on this trello board.

Guardian of RogueBasin

Slashware Interactive has been appointed as the Guardian of RogueBasin, the roguelike wiki. We are hoping to make a good job to ensure its continuous operation and growth

The Guardian of the Roguebasin is the person or company responsible for keeping the RogueBasin software up and running.

The title was established on August 2011, because of the need of having a visible head in front of maintaining the operation of the wiki.

The Guardian of Roguebasin has the following functions:

  • Keep the wiki software up to date
  • Ensure protection against spam and spambots, by coordinating efforts with the community
  • Install new components as per community request
  • Ensure the wiki content is according to the community guidelines
  • Take monthly backups of RogueBasin database and place it on a publicly available online location