Privacy Policy
Created 2023-02-17 (Last Updated 2023-03-07)
IMPORTANT: THIS IS NOT A LEGAL DOCUMENT. I AM NOT MAKING PROMISES. I'M JUST VOLUNTARILY STATING WHAT I'M DOING ON THIS HTTP/GEMINI/GOPHER SERVER IN GOOD FAITH FOR THE SAKE OF TRANSPARENCY.
TL;DR
- I do not store or look at the IP addresses that make requests to the site. I do not know a single IP address that has visited the HTTP, Gemini, or Gopher version of my site or that used my Finger server besides IP addresses that I personally have control of
- While my site uses Nginx as a proxy layer, I disabled access logs and write error logs to /dev/null to avoid logging
- I currently do not track or store what resources are requested or how often resources are requested from the site over HTTP, Gemini, or Gopher
- I currently do not track or store requests to my Finger server
- I do not store or look at the HTTP User-Agent request header of requests to the site
- The HTTP version of the site uses Javascript allow for CSS theme switching
- The HTTP version of the site uses the Web Storage API via "localStorage" to save CSS theme data to the browser so the theme can be applied the next time browser visits the site
- All Javascript on the HTTP version of the site is "client-side" only and does not "phone home" in any capacity, so I don't know if or how you are using the Javascript
- The website still functions with Javascript turned off
IP Retention Policy
Every request over the IP (Internet Protocol) contains the source IP address of the request. That's part of how the Internet is able to work in the first place. This means that all TCP/IP requests to the HTTP, Gemini, and Gopher version of this site along with all requests to my Finger server will include your IP address.
I do not store any of those IP addresses and do not physically look at the IP addresses. If you were to ask me to find a single IP address that has visited the site, I would only be able to point you to IP addresses that I have control of, because I already know those IP addresses and know that I visit my own site.
Nginx Logging
While my HTTP/Gemini/Gopher/Finger server is written from scratch, I use Nginx in a proxy layer so the site server can run on localhost ports as a non-root user. Nginx also handles TLS for the HTTP part of the site's server.
I set the "access_log" directive to "off" in the http section of my nginx.conf file. The "access_log" directive does not apply to stream servers (which I am using to proxy gemini and gopher requests from the outside internet to the localhost ports I am running them on) at the time of writing this. The "access_log" directive currently only works in the http section of nginx.conf with the version of Nginx I am using, so placing it in the stream server sections won't do anything at the moment as the stream server sections aren't able to collect access log data. The stream server sections are used for Gemini, Gopher, and Finger server support currently. This all means that the access log data is not stored on the harddrive.
I set the "error_log" path to "/dev/null" in my nginx.conf file. I also set a symbolic link from "/dev/null" to "/var/log/nginx/error.log" to prevent Nginx from writing any potential error data there. This means I am unable to see the error log data and the error log data is not stored on the harddrive.
Resource Request Retention Policy
Currently I do not track or store how many times a page or resource was requested. At some point in the future, I may want to add a "hit counter" to show how many views a particular page has gotten, but I haven't decided one way or another on that yet. If I do decide to track how many requests happen to pages, I will be sure to update this page. This page and others would have a hit counter on it as well, at least for the HTTP version of the site.
HTTP Header Retention Policy
Every HTTP request includes some information, including whether the request method was a "GET", "POST", "DELETE", etc... request. This also includes data about the browser called the "User-Agent". For instance, the User-Agent of Chrome version 110 on Windows 10 64-bit edition is "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36".
I do not track, store, or look at the User-Agent of requests.
Javascript Usage (HTTP Site)
The HTTP version of site uses some Javascript to allow for CSS theme switching. The Javascript is completely "client-side" and does not "phone home" in any capacity. My server does not know if or how you are using the Javascript.
The HTTP and CSS of this site will still function with Javascript turned off.
<script> Section 1 Explained
<script>
var themeName = localStorage.getItem("theme")
if (themeName != null) {
document.body.classList.add(themeName)
}
var themeTerminal = localStorage.getItem("theme-terminal")
if (themeTerminal != null) {
document.body.classList.add(themeTerminal)
}
</script>
- The variable "themeName" is set to the value at the Web Storage API "localStorage" key "theme"
- If the variable "themeName" is not null (empty), then the value of the variable "themeName" is added as a class to the <body> tag
- The variable "themeTerminal" is set to the value at the Web Storage API "localStorage" key "theme-terminal"
- If the variable "themeTerminal" is not null (empty), then the value of the variable "themeTerminal" is added as a class to the <body> tag
In essense, this script figures out if a particular theme has been previously saved by the user, and if so, switches to that theme. This lets the theme be consistent among browsing sessions if the tab or browser is closed.
<script> Section 2 Explained
<script>
var themeDarkLightButton = document.createElement("button");
themeDarkLightButton.id = "theme_dark_light";
themeDarkLightButton.alt = "Toggle dark/light mode"
themeDarkLightButton.title = "Toggle dark/light mode"
themeDarkLightButton.onclick = function (e) {
if (getComputedStyle(e.target).backgroundImage.includes("light")) {
document.body.classList.add("light");
document.body.classList.remove("dark");
localStorage.setItem("theme", "light")
} else if (getComputedStyle(e.target).backgroundImage.includes("dark")) {
document.body.classList.add("dark");
document.body.classList.remove("light");
localStorage.setItem("theme", "dark")
}
}
var themeTerminalButton = document.createElement("button");
themeTerminalButton.id = "theme_terminal";
themeTerminalButton.alt = "Toggle terminal layout mode"
themeTerminalButton.title = themeTerminalButton.alt;
themeTerminalButton.onclick = function (e) {
if (document.body.classList.contains("terminal")) {
document.body.classList.remove("terminal");
localStorage.removeItem("theme-terminal");
} else {
document.body.classList.add("terminal");
localStorage.setItem("theme-terminal", "terminal");
}
}
document.getElementById("top_bar").appendChild(themeTerminalButton)
document.getElementById("top_bar").appendChild(themeDarkLightButton)
</script>
There are more lines of Javascript in this bit.
- A new button (first button) is created and set to the variable "themeDarkLightButton"
- The id of the first button is set to "theme_dark_light"
- The "alt" attribute of the first button is set to "Toggle dark/light mode"
- The "title" attribute of the first button is set to the same value as the "alt" attribute
- An "onclick" event function is created for when the first button is clicked
- If the first button is clicked and the background image of the first button has the word "light" in the file name, remove the "dark" class from the <body> tag, add the "light" class to the <body> tag, and set the value of the Web Storage API "localStorage" key "theme" to "light"
- Otherwise if the first button is clicked and the background image of the first button has the word "dark" in the file name, remove the "light" class from the <body> tag, add the "dark" class to the <body> tag, and set the value of the Web Storage API "localStorage" key "theme" to "dark"
- A new button (second button) is created and set to the variable "themeTerminalButton"
- The id of the second button is set to "theme_terminal"
- The "alt" attribute of the second button is set to "Toggle terminal layout mode"
- The "title" attribute of the second button is set to the same value as the "alt" attribute
- An "onclick" event function is created for when the second button is clicked
- If the second button is clicked and the <body> tag does has the class "terminal", remove the "terminal" class from the <body> tag and remove the Web Storage API "localStorage" key "theme-terminal"
- Otherwise if the second button is clicked and the <body> tag does not has the class "terminal", add the "terminal" class to the <body> tag and set the value of the Web Storage API "localStorage" key "theme-terminal" to "terminal"
- Both buttons are added to the end of the <div> with the id "top_bar"
In essence, this script creates 2 buttons, one that handles toggling dark and light mode and the other that handles toggling the terminal layout mode. After both buttons are created, they are added to the top of the web page so they can be clicked on.