Creating a Paranoia 25th Anniversary Edition Character Sheet for Roll20

- Tabletop RPGs

Latest revision:

PARANOIA: Troubleshooters book cover snippet

I'm a big fan of the Paranoia 25th Anniversary Edition comedy tabletop RPG, and I regularly act as a game master for that game on Roll20 with my regular play group in-between other tabletop RPG campaigns. However, there wasn't any good character sheet for that game system on Roll20, so I decided to make one myself.

I'm really happy to say that Roll20 has accepted my work as-is and published it, and now anyone with a free Roll20 account can use it for their own games! You may also look at my source code, which was released under the MIT License.

The current version only covers the Troubleshooters core rulebook, but I may add compatibility with the other core rulebooks as well (Internal Security and High Programmers), although not in the foreseeable future.

Indeed, like most software development tasks, my original work estimate turned out to be much, much longer due to various unexpected issues I kept running into. What I thought would be a simple HTML form with a few dice roll buttons embedded into it turned out to be almost a month-long project.

Here are a few points of particular note.

Problematic documentation

Roll20's technical documentation, while very detailed, is really frustrating to use as the menus don't work properly for some reason, and search engines constantly return links to the community-maintained wiki instead.

I have been told after the fact by one of the major wiki contributors that actually, the wiki is more up-to-date than the official documentation, which copied it. That might be true, but as a developer, I simply cannot rely on the wiki for future compatibility.

Paying to give?

Only users with a Roll20 Pro account can test character sheets. Now I've seen a bunch of scummy pricing tactics in the software industry, but having to pay to contribute free content to a private corporation is a little insulting to say the least.

That also meant that I had a deadline of 1 month from the beginning of code development in order to avoid a subscription renewal, which caused me a lot of needless pressure during a hard period of my life despite the relatively low cost of said subscription.

Dealing with editing errors

Paranoia 25th Anniversary Edition is a great game, but the books suffer from multiple editing errors, and no official errata was ever released as far as I'm aware.

Therefore, before even starting design work, I had to double-check everything in all 3 core rulebooks to find potential contradictions and identify unclear rules. In some cases, I even had to track back rules from Paranoia XP Service Pack 1, the main core rulebook of the previous edition, to figure things out.

Character sheet, or character sheets?

There are 3 official character sheets for this game in total, and all of them suffer from multiple usability issues, both on paper and for a web adaptation. I had to find design solutions to all of them first, as even though I only completed the most important one for this release, I had to consider future compatibility as well.

There already was a character sheet for Paranoia XP on Roll20, which is very similar to the official one from Paranoia 25th Anniversary Edition, but it was unusable as a base due to various bugs and design issues.

Standard web development technologies... almost

Code must be done in non-standard HTML, CSS and JavaScript in order to be compatible with Roll20's security sandbox. While everything is documented, it's limiting in unexpected ways and it's very easy do make mistakes. For example, the id attribute is prohibited on all elements, which causes a lot of headaches.

I also ran into a lot of major CSS compatibility issues that were hard to diagnose and solve. Sure, I could have just set everything to initial and build my own thing over it, but I didn't want to reinvent the wheel.

Update 2021-02-14: Roll20 has just announced an update that will remove some of the HTML limitations I experienced. That will give me a lot more flexibility for future iterations if I ever attempt to do so in the future.

Custom programming

Roll20's macro system and localization system are very crude, and there's a bunch of important stuff that requires really idiotic workarounds to implement, and some of them aren't behaving correctly anyway.

For example, I had to request two d20 results for some dice roll tests and add them together, even though I only needed one and had to discard the unnecessary addition. Oh, and the whole formula was 350+ characters even though it barely did anything beyond performing 2 integer additions.


I had to cut some content I wanted to implement in order to be legally compliant with the license for personal use provided by the original rulebooks. I tried contacting the publisher about this, but they didn't really seem to care enough about this particular edition of Paranoia anymore unfortunately.

I also had to cut even more content because Roll20 is not designed to store and send private information beyond whispering chat messages between users.


Test automation was not really an option, as the required investment is simply not worth it.

Update 2021-02-14: I also ran into an unexpected bug that only revealed itself after my character sheet was pushed to production by Roll20: a localized string was missing. The bug lied into the Roll20 JavaScript function that extracts localized strings which for some reason skipped the same string every single time. I'm not sure what I did near the end of development to trigger this bug (I suspect it is due to a switch from Chrome to Firefox), but it's pretty frustrating that I was unable to catch it due to the extraction and prettifying process being manual instead of automated.

Final notes

Overall, I'm very happy with the results despite the unexpected time sink it became, and I hope that other fans of the game will enjoy it!

Post image: © 2009 Chris Quilliams

Related articles I wrote

Spaceship flying over active volcanoes

A Universe and World Creation Script for Mongoose Traveller 2nd Edition

- Tabletop RPGs, Programming

The following is a Python script developed by yours truly to generate a sector according to the core rulebook of the Mongoose Traveller 2nd Edition tabletop RPG, exactly as described in the Universe and World Creation chapter. It is designed to describe worlds in human-readable format as much as…

Flag of Prosperia

Prosperia - A Tabletop RPG Prototype for My Coworkers

- Tabletop RPGs, Game Design, Anecdotes

I'm a big fan of role-playing video games, especially Japanese-style ones, but there's a big restriction these games have: players have limited abilities to create their own stories in them due to programming restrictions. When I discovered tabletop role-playing games, having this restriction lifted…

Playing with an Xbox controller

My Personal Video Game Completion List

- Anecdotes, Video Games

I thought it would be fun to track the long list of video game that I have beaten and/or completed for reference, so I've done just that! There may be a few mistakes here and there due to secret features unknown to me, or due to misremembering details of my past gaming experiences, but I believe the…

Dice stacked in a triangle shape, with their face numbers matching their row position

I Designed the Perfect Gambling Game, But...

- Mathematics, Business, Game Design

Back in 2006-07-08, during the 13th Canadian Undergraduate Mathematics Conference at McGill University, I presented a gambling game I designed with the novel property of being both advantageous to players and the house, and that despite this proprety, that pretty much nobody in their right mind…

Stream of zeros and ones in space

Minifying JSON Text Beyond Whitespace

- Programming, Mathematics

JSON is a common data serialization format to transmit information over the Internet. However, as I mentioned in a previous article, it's far from optimal. Nevertheless, due to business requirements, producing data in this format may be necessary. I won't go into the details as to how one could…

See all of my articles