Skip to content

What I collect

Voluntary, anonymous statistics. Here is everything that is sent, and everything that never is.

Help me improve Nielix. I would very much like a few numbers from your server. I use them solely to keep developing Nielix and to see which features are used and which are not.

I never get anything private: no titles, file names, folders, usernames, emails, channel addresses or what you watch. Only coarse numbers, such as which version you run and whether you use external channels. I do not store your IP address. It is on by default, and you can turn it off whenever you like.

The server sends at most one message a week. This page describes the message field by field, and the list is the same list the server and my receiver use. A field that is not listed here cannot be accepted by my receiver at all.

The fields, one by one

The message has exactly these fields. All are required. If a message contains a field that is not listed here, I reject the whole message and nothing is stored.

schema

Which edition of the message layout is used, so I can change the format without misreading old messages.

Possible values:Always 1

install_id

A random UUID your server creates the first time and keeps locally. It is not tied to your account, your server id or anything else. It is only used to count the same installation once a week, and so you can have your data deleted.

Possible values:A random UUID (version 4)

version

Which version of Nielix the server runs.

Possible values:A version number, at most 40 characters, such as 0.9.1 or 0.9.1-rc.1

os

The operating system the server runs on: linux, windows, darwin (macOS) or other.

Possible values:linux | windows | darwin | other

arch

The processor type: amd64, arm64, arm or other.

Possible values:amd64 | arm64 | arm | other

runtime

Whether the server runs in a Docker container (docker) or some other way (other).

Possible values:docker | other

hw_transcode

Whether the server uses hardware accelerated transcoding: none, vaapi, qsv, nvenc or other.

Possible values:none | vaapi | qsv | nvenc | other

features_enabled

Which features are turned on in the server, as yes/no. Nothing about what they are used for.

Contains these 11 yes/no fields (the same list in both groups): (yes or no)

external_channels
External channels (live TV from channel sources you set up yourself).
downloads
Downloading content from the server.
syncplay
Synchronized playback, where several people watch the same thing at the same time.
guest_links
Guest links, where others can watch something without a user of their own.
recordings
Recordings of channels.
dlna
DLNA, so a TV for example can find the server.
push
Push notifications to phones.
screensaver
The screensaver.
mcp
The MCP server, so an AI assistant can control the server.
own_channels
Your own channels, put together from your media.
offline_downloads
Offline downloads for the app.

features_used_30d

Which features were actually used in the last 30 days, as yes/no. This is the important one: a feature can be on without being used.

Contains these 11 yes/no fields (the same list in both groups): (yes or no)

external_channels
External channels (live TV from channel sources you set up yourself).
downloads
Downloading content from the server.
syncplay
Synchronized playback, where several people watch the same thing at the same time.
guest_links
Guest links, where others can watch something without a user of their own.
recordings
Recordings of channels.
dlna
DLNA, so a TV for example can find the server.
push
Push notifications to phones.
screensaver
The screensaver.
mcp
The MCP server, so an AI assistant can control the server.
own_channels
Your own channels, put together from your media.
offline_downloads
Offline downloads for the app.

counts

Coarse counts in the server, only as a range and never as an exact number.

Contains these 4 fields, all as a range: (A range: 0, 1, 2-3, 4-10, 11-30, 31+)

users
Number of users on the server.
libraries
Number of libraries.
channels
Number of channels.
devices
Number of signed-in devices.

client_kinds

How many of each kind of player are paired, only as a range.

Contains these 5 fields, all as a range: (A range: 0, 1, 2-3, 4-10, 11-30, 31+)

androidtv
Number of Android TV devices.
web
Number of browsers.
android
Number of Android phones and tablets.
ios
Number of iPhones and iPads.
other
All other kinds of device.

license_state

The license state of the server: free, premium, grace (in the grace period after expiry) or expired. No key and no account.

Possible values:free | premium | grace | expired

uptime_days

How many days the server has run without a restart. It says something about whether it can be relied on day to day.

Possible values:A whole number between 0 and 36500

update_check_enabled

Whether the server checks for new versions by itself.

Possible values:yes or no

language

The language the server is set to: da, en, sv, nb or de.

Possible values:da | en | sv | nb | de

An example message

This is what a whole message looks like. The values are made up.

{
    "schema": 1,
    "install_id": "4f1c2a9e-7b3d-4e58-9a6c-2d1e0b7f5a43",
    "version": "0.9.1",
    "os": "linux",
    "arch": "amd64",
    "runtime": "docker",
    "hw_transcode": "vaapi",
    "features_enabled": {
        "external_channels": true,
        "downloads": true,
        "syncplay": true,
        "guest_links": true,
        "recordings": true,
        "dlna": true,
        "push": true,
        "screensaver": true,
        "mcp": true,
        "own_channels": true,
        "offline_downloads": true
    },
    "features_used_30d": {
        "external_channels": false,
        "downloads": true,
        "syncplay": false,
        "guest_links": false,
        "recordings": false,
        "dlna": false,
        "push": false,
        "screensaver": true,
        "mcp": false,
        "own_channels": false,
        "offline_downloads": false
    },
    "counts": {
        "users": "2-3",
        "libraries": "4-10",
        "channels": "11-30",
        "devices": "4-10"
    },
    "client_kinds": {
        "androidtv": "1",
        "web": "2-3",
        "android": "1",
        "ios": "0",
        "other": "0"
    },
    "license_state": "free",
    "uptime_days": 42,
    "update_check_enabled": true,
    "language": "da"
}

What is never sent

There is no room for it in the message, so it cannot be sent, neither by mistake nor on purpose.

  • Titles of films, series, music or anything else
  • File names and paths
  • Names of libraries
  • Usernames and email addresses
  • Channel names and channel addresses
  • Lists of IP addresses
  • The address or domain of the server
  • The name of the machine or the container
  • Playback history, and what anyone has watched or listened to
  • The server id and fingerprints

How to turn it off

The first time you set the server up, the guide asks. You can turn the statistics off there.

Later you can turn it off or on under Settings in the server, and see exactly what is sent.

If you want to be sure the server never sends anything, set the environment variable NIELIX_TELEMETRY=off. Then it is off, whatever the settings say.

NIELIX_TELEMETRY=off

Delete my data

Under Settings in the server there is a button, Delete my data. It immediately deletes everything I have stored from your installation. Behind the button is a single call, DELETE /api/v1/telemetry/ followed by your install_id. Your install_id is the proof, so I can delete without knowing who you are.

The answer is the same whether I had anything or not. The combined weekly totals, where your installation is one among many and cannot be recognized, are not changed.

How long I keep it

I keep an individual installation's messages for 13 months after its last message. After that I delete them automatically, and only the combined weekly totals remain.

In my own overview no group of fewer than 5 installations is shown. If a group is smaller, it only says that it is under 5.

I do not store your IP address

Your IP address and your browser or program type are not stored, neither in the database nor in my logs. The access log for this particular address is switched off.

The message passes through my reverse proxy (Traefik). Its access log is set up to leave out the client address, and the web server's own log does not store the address either.

I only look up a country code from the address when the message arrives (for example DK), using a dataset that sits on my own server and calls no third party. The address is thrown away immediately, and only the country code is stored.

IP geolocation: DB-IP Lite Country, from db-ip.com, under Creative Commons Attribution 4.0.

About install_id

Your install_id is a random UUID the server creates locally. It is not derived from anything on your server and is not tied to your account with me, your server id, your license or your name. That means I cannot tell who you are from the statistics.

The same id does follow the same installation from week to week, so I can see whether installations stick around. That makes the messages pseudonymous rather than completely unrecognizable, which is why you can always have them deleted.

What the server receives from me

The server does not only send. At the daily licence sync, if the server is connected to an account, I can answer with messages to the server administrator: a security fix, a new version or a short piece of information. They show as a banner in the server administration and as a list under Settings.

There is no advertising in them and no tracking. I only record that a message was delivered to a server. I cannot see whether it was read or dismissed, and the server does not report it back.

A critical security message is also in the update feed (latest.json) as securityAdvisory, so a server without an account can see it. The server compares with the version in the message itself, so the call to the feed does not tell me which version you run.

Optional, with an account only: server overview and backup

Server overview is off by default. If you switch it on under Licence in the server administration, the server sends at the sync: version, how long it has been running, free disk space in percent, how many open items the health page has (only a number), whether a new version exists, and the licence state. Nothing about content. It is tied to your account so you can see the status and get alarms, and the history is deleted after 30 days.

Settings backup in the cloud is also off by default. If you switch it on, the server encrypts the copy with a key from your passphrase before it is sent. I cannot read it and have no back door. If you forget the passphrase, the copy cannot be opened. I keep the 5 newest per server.

What I use it for

Solely to keep developing Nielix: which versions are running, which features are used and which are not, and whether there are platforms I should look after more. I do not sell the numbers, share them with anyone or use them for advertising.

An honest note

The numbers only cover those who have the statistics turned on and run a version that can send them. There are many I do not see, so my numbers are always a minimum.

See also: Privacy policy, Fair use