Creating a Paranoia 25th Anniversary Edition Character Sheet for Roll20

- Tabletop RPGs

Last 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 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…

Radiating business woman

Essential International Standards and Registries for Web Developers

- Programming, Quality Assurance, Security

The following is a collection of free international standards, registries and references that I collected throughout the years while developing websites and web services. These references, while very precise and technical by their nature, are extremely useful in order to ensure that a specific…

Illusion of Gaia logo

Beating Illusion of Gaia in 17 Minutes

- Video Games, Security

I crafted a tool-assisted speedrun (TAS) of the Super NES action-adventure game Illusion of Gaia (also known as Illusion of Time in Europe) which beats the game as fast as possible on the American version. The final time is 16:48 when using TAS timing (from initial power on to the last input) and…

Medusa in fiery scenery

Deep Learning in Python with PyTorch - Tutorial and Demo

- Programming, Mathematics

As I am continuing my personal journey into deep learning research and development, I wanted to try out PyTorch, a machine learning framework with GPU acceleration primarily designed for the Python programming language. However, I couldn't find any good introductory resource online for it. So I read…

See all of my articles