Theriodex – Privacy Policy

Last updated: 27 July 2026


Theriodex is meant as a light-weight and ad-free Pokédex. Thus, we strive to store only the least amount of data required to run our service and our game properly. To ensure compliance and as an act of transparency, however, this privacy policy may look somewhat intimidating! To mitigate this, here is a brief overview of what we store, why and for how long.

Short overview

Sessions and logs are stored for 24h and leaderboard scores persist only if you submit them. We do not use any sort of tracking cookies, analytics (anymore), ads or other such things. You are free to inspect the source code of Theriodex yourself on Codeberg to verify these claims.

What we store:

Retention:

Where data is processed / stored:

All processing and storage is done in the EU.

How to delete data:


1. Controller

2. What we collect

Only basic server logs are collected automatically. These may include:

Server logs (netcup)

Leaderboard (optional, persistent)

We make sure that storing data persistently in the leaderboard requires constent and that it cannot be done by accident. Before submitting one's score, the user must toggle a switch that acknowledges that they have read the privacy policy and that they wish their data to be stored.

2.1 Session data

The most amount of information is stored in a session cookie. A server‑side session mechanism is used (implemented with Rack::Session::Redis) which stores a single transient cookie containing only a session identifier on your machine, the actual cookie data is stored on the Redis server. Therefore, Rack::Session::Redis keeps session data server‑side rather than storing full session payloads in client cookies.

Redis is running in the same Docker network as Theriodex itself and has no access to the outside world at all. It can only communicate with Theriodex. Data is stored as-is and is not encrypted so that a server restart does not wipe sessions.

Session data for the Pokémon Guessing Game

Session data for user preferences

Additionally, we store user preferences in Rack::Session::Redis as well. These include (but may not necessarily be limited to) things such as the theme, cursor or font a user has selected as well as information about whether a specific theme has been unlocked.

Query parameter caching

Theriodex makes heavy use of full-page caching. This is to ensure that database queries, especially on more popular pages, are not run more frequently than absolutely necessary, reducing overall load and increasing response times dramatically.

Because Theriodex allows the user to customise their experience by changing things such as their theme, we cannot cache every request in the same manner – if we did, someone with a custom theme would be served a page with, potentially, another theme or no theme at all because that is what had been cached previously.

To mitigate this problem, a custom middleware was written ("app/middleware/customcache.rb") which appends hidden query parameters to each request depending on customisation options; as such, your customisations will be visible in a hidden query parameter and the server would see this as follows: "'GET /en/settings?font=retro-future-spaced&_theme=arcanine.css HTTP/1.1' 200 10672 0.001".

These query parameters are invisible to the user and are not used for tracking; their only purpose is to ensure that each customisation option combination gets cached separately.

Serial for unlocking themes

When the user plays the Pokémon Guessing Game and manages to reach a certain number of points, they may unlock additional themes. To unlock these themes later on, a serial is generated with which the user may unlock the theme again at a later point in time. These serials are not stored and contain – in a slightly obfuscated manner – the number of points achieved. No personally-identifiable information is stored within these serials, simply the number of points acquired.

List of all session cookies

The following is an overview of all the cookies / data stored per session. You may verify where and how this data is used by looking for "session[:key_name_here]" in the software's source code. Replace "key_name_here" with the session key found in the first column of the following table:

Session Key Description / Stored Data
cursor Stores the name of the currently selected cursor
database_username The username formatted for database storage
difficulty Selected difficulty level
font Stores the name of the currently selected font
gen Stores the generation for the Pokémon Guessing Game
guesses Number of guesses in the game
points Calcuated game score
pokemon_info Pokémon game information
results Game results (how many guesses, points etc.)
saved_in_leaderboard Flag indicating if score was submitted to leaderboard
serial Serial number for unlocking themes
skips Number of skips used
theme Stores the name of the currently selected theme
unlocked_themes List of themes unlocked by the user
username Username selected when starting Pokémon Guessing Game

3. Examples of collected logs

Logs stored by Theriodex look as follows. Below is an example of logs collected from a locally-running instance of Theriodex with a user who is using a custom font and theme:

theriodex-dev-1 | 172.21.0.1 - - [27/Jul/2026:12:09:52 +0000] "GET /icons/dice-five.svg?_font=retro-future-spaced&_theme=arcanine.css HTTP/1.1" 304 - 0.0130 theriodex-dev-1 | I, [2026-07-27T12:09:54.820348 #9] INFO -- : cache: [GET /en?_font=retro-future-spaced&_theme=arcanine.css] miss, store theriodex-dev-1 | theriodex-dev-1 | 172.21.0.1 - - [27/Jul/2026:12:09:54 +0000] "GET /en?_font=retro-future-spaced&_theme=arcanine.css HTTP/1.1" 200 7550 0.0141 theriodex-dev-1 | I, [2026-07-27T12:09:54.878707 #9] INFO -- : cache: [GET /sprites/pokemon/10010.png?_font=retro-future-spaced&_theme=arcanine.css] miss, store theriodex-dev-1 | theriodex-dev-1 | 172.21.0.1 - - [27/Jul/2026:12:09:54 +0000] "GET /sprites/pokemon/10010.png?_font=retro-future-spaced&_theme=arcanine.css HTTP/1.1" 200 865 0.0059 theriodex-dev-1 | I, [2026-07-27T12:09:54.881532 #9] INFO -- : cache: [GET /types/electric.svg?_font=retro-future-spaced&_theme=arcanine.css] miss theriodex-dev-1 | theriodex-dev-1 | 172.21.0.1 - - [27/Jul/2026:12:09:54 +0000] "GET /types/electric.svg?_font=retro-future-spaced&_theme=arcanine.css HTTP/1.1" 304 - 0.0014 theriodex-dev-1 | I, [2026-07-27T12:09:54.882139 #9] INFO -- : cache: [GET /types/ice.svg?_font=retro-future-spaced&_theme=arcanine.css] miss theriodex-dev-1 | theriodex-dev-1 | 172.21.0.1 - - [27/Jul/2026:12:09:54 +0000] "GET /types/ice.svg?_font=retro-future-spaced&_theme=arcanine.css HTTP/1.1" 304 - 0.0011 theriodex-dev-1 | I, [2026-07-27T12:09:56.937064 #9] INFO -- : cache: [GET /en/settings?_font=retro-future-spaced&_theme=arcanine.css] miss theriodex-dev-1 | theriodex-dev-1 | 172.21.0.1 - - [27/Jul/2026:12:09:56 +0000] "GET /en/settings?_font=retro-future-spaced&_theme=arcanine.css HTTP/1.1" 200 10672 0.0019

4. Why we collect it (purposes) and legal basis

Purposes:

Legal basis:

5. Where data is stored

6. Retention

7. Recipients and disclosures

8. Security

9. Your rights

You have the right to:

To exercise these rights, contact the operator at privacy@theriodex.net. For deletion requests related to specific leaderboard entries, provide the username and date of the entry to help locate the record.

As the operator of this site is based in the German state of NRW, you may contact the Landesbeauftragte für Datenschutz und Informationsfreiheit Nordrhein-Westfalen (LDI NRW) for complaints.

10. Changes to this policy

This policy may be updated. The "Last updated" date above will indicate the current version.

Full changelog

Initial version – 28 August 2025

Rev. 1 – 13 September 2025

Rev. 2 – 31 October 2025

Rev. 3 – 27 February 2026

Rev. 4 – 14 March 2026

Rev. 5 – 27 July 2026