ShortDash: Cross-platform Shortcut Dashboard

A few months ago, I was sitting in a video conference and noticed that the room was getting hot. I have a fan but it was just out of reach and it would have been rude to walk out of the frame in the middle of the meeting. At that point I wished I had one of those digital power plugs that you can control from your phone. I did eventually get one of those plugs but you had to use their dedicated app to control it. I thought it would be much more convenient to have a central dashboard where I could control it. And then it would be nice to be able to execute other things. This led to some tinkering with and its web request functionality. Soon after, the idea of ShortDash began to form.

ShortDash is a cross-platform shortcut dashboard for your local network. It allows you to create customizable dashboards of shortcuts and actions. You can even turn an old tablet or cell phone into your own personal shortcut dashboard.

A server runs on your local network and allows any device with a web browser to access the dashboards. A cross-platform target application allows actions to be executed on any Windows, Mac or Linux machine. All controlled from a single ShortDash server. Each device can be individually configured to allow full access or just specific dashboards.

Shortcuts can be created by customizing existing actions to execute programs, web requests, etc. Multiple actions can be executed with a single shortcut to create advanced workflows. An open plugin architecture allows anyone to quickly create new actions to fit any workflow required.

With ShortDash, I am now able to use an older generation Kindle Fire tablet as a secondary screen that always has my dashboard display. With one tap on a “Fan On” shortcut on my dashboard, a “Web Request” action is executed on the ShortDash server that sends an HTTPS request to IFTTT which then executes the “Turn plug on” action which finally turns on my fan. When I press the shortcut again, a different message is sent to turn the fan off. IFTTT can integrate with countless other products and services.

That is just one example of what ShortDash can do. The open plugin architecture allows anyone to quickly create new plugins to perform any action that is required. But even if you aren’t a programmer, a lot can be accomplished with the two main core actions: “Web Request” and “Execute Process”. You can quickly create shortcuts that will open your favorite programs or open the websites you read everyday. If you have multiple machines, you can install the Target application and execute actions on Windows, MacOS and Linux, all from the same ShortDash dashboard. The possibilities are endless and we have just barely scratched the surface of the fun and exciting things that you can do with ShortDash.

ShortDash is written in ASP.NET Core using the Blazor Server architecture.

ShortDash is open source and freely available for Windows, MacOS and Linux.

Outwitters Sports Network

It has been a while since I posted here so I wanted to give some details to what I’ve been working on over the last year. About a year and a half ago I discovered an iOS turn-based strategy game called Outwitters. I was immediately hooked. It had enough variation and strategy to keep my interest. I was playing it all the time and recommending it to everyone who would listen.

After you finish a game you have the ability to re-watch the replays and share them with others. This allowed you to learn new strategies or show off a triumphant victory. Unfortunately, you could only share the replays with someone who had an iOS device and had the Outwitters app installed. I wanted to watch the replays on my desktop so that I could easily compare and contrast different strategies against each other and improve my game.

Outwitters Replay Viewer

I began the process of reverse-engineering the replay protocol (with permission from the original developers) and creating the Outwitters Replay Viewer. I didn’t have any help from the original developers about protocols, file formats, or anything like that so I had to figure that all out on my own based on the data I could extract from the game. It took a bit of time to get everything squared away but in the end it worked out great.

The original version of the replay viewer wasn’t much to look at but it was functional. The second version had very basic graphics to indicate the types of units. But the 3rd version included all the graphics from the original game, looked the best and was the most functional.

iOS on Device Replay
iOS on Device Replay
Replay Viewer Version 1
Replay Viewer Version 1
Replay Viewer Version 2
Replay Viewer Version 2
Replay Viewer Version 3
Replay Viewer Version 3

Outwitters Sports Network is born!

Once the replay viewer was completed and people started using it, there began to be a lot of replay data stored on my server and so I started scanning them and creating analytics that allowed you to quickly find specific replays by map, player, unit, etc. This began the transition from just a replay viewer into the Outwitters Sports Network (Abbreviated as OSN). There are statistics, weekly top ranked player lists, leaderboards, popular replays and much more. According to Google Analytics, from August 2012 to December 2013 there have been 86,237 visits, 17,951 unique visitors, and 355,938 page-views. As of December 28, 1013 there have been 21,872 user submitted replays.

OSN Final Replay Viewer
OSN Final Replay Viewer
OSN Website
OSN Website

Technical Details

The replay viewer was programmed in Processing and then loaded on the website using Processing.js. Processing didn’t originally support JSON data so I had to use the compiled add-on library and examples at Jer Thorp’s Blog article “Processing, JSON & The New York Times”. Processing.js on the other hand does not support any java add-on libraries like Processing does so I ended up creating a special JavaScript based add-on that would supply Processing.js a library with the same footprint as the original java JSON library. I found a wonderful reference guide on Processing.js’s website called Pomax’s Guide to Processing.js that was invaluable in getting Processing.js and JavaScript to work together. This allowed Processing and Processing.js to use the exact same Processing based code so I didn’t have to support two separate code bases.

The Outwitters Sports Network Website utilizes the following technologies:

  • PHP and CodeIgniter for the backend processing and website
  • Bootstrap for the majority of styles on the website
  • JQuery for the powerful dynamic web interface
  • Handlebars for client-side templating
  • Highcharts for client-side charts on the statistics page
  • MySQL for data storage of statistics and searchable data
  • JSON text files for storage of full replay data files


It was definitely a long ride but a pretty enjoyable one. The final product ended up being way different than I had originally planned but I think it came out great. Especially, since it was originally just a proof of concept to see if I could do it. The Outwitters Sports Network is still going strong and still gets quite a few visitors. It is currently in maintenance mode as I’ve pretty much added all the features that I really wanted to be there. I still update the top player ranks every week and keep things running smoothly.

Portable Google App Engine For Windows (Enhanced)

5/12/2011: Updated to support Google App Engine Version 1.5.0.

A while back I put together the information and steps to get Google App Engine running on Windows wrapped up in a portable little bundle. Since it has been a while I thought it could use a good refresh with the latest versions of everything and make things work more like the real Google App Engine. Some of the content may seem the same as last time but there definitely will be some new ways of running things and new capabilities that were not available last time. This new way is much easier and should keep up with all the changes that newer versions of Google App Engine may bring.

Continue reading “Portable Google App Engine For Windows (Enhanced)”

When? Holidays and Important Events App for iOS4 Devices


When? Logo

Do you want to know when Mother’s Day is this year? Wouldn’t it be easier to have it on your calendar? It gets pretty tedious adding all those important events and holidays by hand. When? is an App for iOS4 Devices that allows you to easily find and add holidays and important events to your built in calendar.

It contains important events for many countries (with states or provinces where applicable) and religions. New categories and events will be continually added. When? makes it simple to add events to your calendar in two easy steps:

  1. Find the event or events you want using categories.
  2. Tap the + button and the event is immediately added to your calendar!

You can even add an entire category with just two taps. Tired of having an event on your calendar? Remove it just as easy by pressing the red check mark. That is all you need to do!

Click here to check it out in the App Store!

WebSolver: An Interactive Cryptogram Solver for the Web!

A great carpenter does not need to know how to make a hammer or saw in order to create a masterpiece.

Web Solver: Start
A while back I wrote a bunch of articles describing how to create your own interactive cryptogram solver using python. I’ve used it a lot in my own personal solving and have had a few friends use it too but it definitely is not a tool for everyone. There are a lot of great tools out there for solving ciphers but many of them are very technical, require a special environment to run, or require programming knowledge and experience. Now, I don’t want to down play the usefulness of these great tools or tell anyone that they shouldn’t learn computer programming (Note: I think all computer users should know the very basics of programming logic as it is so useful for many things). That being said, there are many people out there who love a good challenge but either don’t have the desire or the time to learn to program. Sometimes the greater skill is knowing how to use the tools properly and efficiently. A great carpenter does not need to know how to make a hammer or saw in order to create a masterpiece.

So for all you great carpenters (solvers) out there, I have ported my interactive cryptogram solver to the web! No downloads, no special environments (other than a modern web browser), and no programming skills needed. Just a clean area where you can do what you do best: solving.

Continue reading “WebSolver: An Interactive Cryptogram Solver for the Web!”

Creating an interactive cryptogram solver (Part IV)

Execute Interactive Solver

I’ve been working hard on this part of the series because I really wanted the interactive cryptogram solver to make it quick and painless to jump right into solving and still give you plenty of room to expand the functionality and reflect your own style of solving. In this part of the series, we will create which will become our gateway to solving. It will allow us to quickly select a cipher class that we want to work with. We will also add a self documenting system that will allow us to use the solver without memorizing all the commands or shortcuts that each solver class may use. So, lets just jump right back into the code!

Continue reading “Creating an interactive cryptogram solver (Part IV)”

Creating an interactive cryptogram solver (Part III)

Execute Interactive Solver

In Part I and Part II of this series we created the framework for our interactive solver and finally had a working AristocratSolver class. In this part, we will enhance our existing framework by adding some commonly used functions, add frequency counting of characters and character sequences to the AristocratSolver class, add the ability to display the current plaintext and ciphertext keys to the AristocratSolver class and then finally create a PatristocratSolver class that reuses all our work in the AristocratSolver class.
Continue reading “Creating an interactive cryptogram solver (Part III)”

Creating an interactive cryptogram solver (Part II)

Execute Interactive Solver

In Part I of this series we started creating the framework for our solver by creating the Cipher and Aristocrat classes. You are probably thinking “This is a series about interactive solvers but this is all code!” Well, the classes inheriting from Cipher will be the ones doing all the work in our solver. In this part of the series we will finally create the CipherSolver class that will work with the Cipher classes to interactively get the work done. So lets just jump right into the code so we can finally get to our first working solver, the AristocratSolver class!

Continue reading “Creating an interactive cryptogram solver (Part II)”

Creating an interactive cryptogram solver (Part I)

Execute Interactive Solver

In this post we’ll first analyze what we are trying to accomplish and then begin to create an extensible framework that will allow us to adapt our solver to many different kinds of ciphers.

Building the framework

Our main goal is to create an extensible interactive solver, so lets break down the similarities that all ciphers have.  You’ve got to think really generic here. All ciphers have the following similarities:

  1. They manipulate some kind of text.
  2. They have an encryption algorithm.
  3. They have a decryption algorithm.

Continue reading “Creating an interactive cryptogram solver (Part I)”