feat: add privacy policy
This commit is contained in:
parent
f571ea151e
commit
7d63872c08
5 changed files with 104 additions and 3 deletions
|
@ -1,6 +1,6 @@
|
||||||
import { Route } from "@solidjs/router";
|
import { Route } from "@solidjs/router";
|
||||||
import { type Component } from "solid-js";
|
import { type Component } from "solid-js";
|
||||||
import { DmId, GroupId, Home, Overview, preloadDmId } from "./pages";
|
import { DmId, GroupId, Home, Overview, preloadDmId, Privacy } from "./pages";
|
||||||
|
|
||||||
import "./app.css";
|
import "./app.css";
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ const App: Component = () => {
|
||||||
<Route path="/overview" component={Overview} />
|
<Route path="/overview" component={Overview} />
|
||||||
<Route path="/dm/:dmid" component={DmId} preload={preloadDmId} />
|
<Route path="/dm/:dmid" component={DmId} preload={preloadDmId} />
|
||||||
<Route path="/group/:groupid" component={GroupId} />
|
<Route path="/group/:groupid" component={GroupId} />
|
||||||
|
<Route path="/privacy" component={Privacy} />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,5 +4,5 @@ import clsx from "clsx";
|
||||||
|
|
||||||
export const A: Component<AnchorProps> = (props) => {
|
export const A: Component<AnchorProps> = (props) => {
|
||||||
const [local, other] = splitProps(props, ["class"]);
|
const [local, other] = splitProps(props, ["class"]);
|
||||||
return <BaseA class={clsx("text-primary", local.class)} {...other} />;
|
return <BaseA class={clsx("text-accent-foreground", local.class)} {...other} />;
|
||||||
};
|
};
|
||||||
|
|
|
@ -17,6 +17,8 @@ if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const NO_DATA_NEEDED_PAGES = ["/", "/privacy"];
|
||||||
|
|
||||||
if (root) {
|
if (root) {
|
||||||
render(
|
render(
|
||||||
() => (
|
() => (
|
||||||
|
@ -27,7 +29,7 @@ if (root) {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
createEffect(() => {
|
createEffect(() => {
|
||||||
if (!dbLoaded() && !hasCashedData() && props.location.pathname !== "/") {
|
if (!dbLoaded() && !hasCashedData() && !NO_DATA_NEEDED_PAGES.includes(props.location.pathname)) {
|
||||||
navigate("/");
|
navigate("/");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { lazy } from "solid-js";
|
import { lazy } from "solid-js";
|
||||||
|
|
||||||
export { Home } from "./home";
|
export { Home } from "./home";
|
||||||
|
export { Privacy } from "./privacy";
|
||||||
|
|
||||||
export { preloadDmId } from "./dm/dm-id";
|
export { preloadDmId } from "./dm/dm-id";
|
||||||
export const GroupId = lazy(() => import("./group/group-id"));
|
export const GroupId = lazy(() => import("./group/group-id"));
|
||||||
|
|
97
src/pages/privacy.tsx
Normal file
97
src/pages/privacy.tsx
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
import type { RouteSectionProps } from "@solidjs/router";
|
||||||
|
import type { Component } from "solid-js";
|
||||||
|
import { A } from "~/components/ui/A";
|
||||||
|
import { Heading } from "~/components/ui/heading";
|
||||||
|
|
||||||
|
export const Privacy: Component<RouteSectionProps> = () => {
|
||||||
|
return (
|
||||||
|
<div class="m-auto mb-8 max-w-4xl [&>:is(p,ul)]:mb-4">
|
||||||
|
<Heading level={1}>Privacy policy</Heading>
|
||||||
|
<Heading level={2}>Introduction</Heading>
|
||||||
|
<p>
|
||||||
|
This project ("signalstats", "I", "my") was built with the explicit target to not harm the privacy of its users.
|
||||||
|
This project was created to be useful, but also to showcase privacy preserving technology. It is built to not
|
||||||
|
collect any personal identifiable information.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Therefore all data processing happens on your device. The data contained in your backup and your passphrase will
|
||||||
|
never leave it.
|
||||||
|
</p>
|
||||||
|
<Heading level={2}>Data I collect and usage of data</Heading>
|
||||||
|
<p>
|
||||||
|
I do not track any individual people. When you visit my website, your browser transfers data to the server,
|
||||||
|
which makes you identifiable like your IP address. This is just how browsers work. But I do not use that data to
|
||||||
|
track you or try to identify you as a person.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
To ensure that signalstats keeps working, the server logs some information that helps with identifying problems.
|
||||||
|
<br />
|
||||||
|
My server logs the following information:
|
||||||
|
</p>
|
||||||
|
<ul class="list-inside list-disc">
|
||||||
|
<li>
|
||||||
|
The date and time of the request: <strong>day/month/year:time timezone offset</strong>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
The type of the request, for example <strong>GET</strong> or <strong>POST</strong>, and which version of the
|
||||||
|
HTTP protocol was used, for example <strong>HTTP/2.0</strong>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
The status code of the request (for example if it was successful or not): <strong>200</strong>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
The referer URL, meaning from which site you came:{" "}
|
||||||
|
<strong>https://git.duskflower.dev/duskflower/signal-stats</strong>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
The user agent, which contains information about your system and browser:{" "}
|
||||||
|
<strong>Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0</strong>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
The server on purpose does <strong>not log the IP address</strong>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
These logs are kept for 10 days after which they are permanently deleted.
|
||||||
|
<br />I use a self-hosted instance of <A href="https://umami.is">Umami</A> to collect anonymous statistics about
|
||||||
|
my website. The goal is to stay up to date with the website traffic and identify trends in it. The collected
|
||||||
|
data does not allow us to identify individuals. All of it is stored in aggregated form. The raw data is
|
||||||
|
immediately deleted after the statistics are generated. That means that if I collect your screen resolution, it
|
||||||
|
will only be used to detect the type of device (desktop, laptop, mobile), and the IP address is only used to
|
||||||
|
identify the country you are coming from.
|
||||||
|
</p>
|
||||||
|
<Heading level={2}>Sharing of data with third parties</Heading>
|
||||||
|
<p>
|
||||||
|
I do not in any way share data with advertising companies or other third parties. Everything runs on my own
|
||||||
|
server.
|
||||||
|
<br />
|
||||||
|
The only situation in which I might need to share data is to comply with legal requirements.
|
||||||
|
</p>
|
||||||
|
<Heading level={2}>Your rights</Heading>
|
||||||
|
<p>You have certain rights regarding your personal data:</p>
|
||||||
|
<ul class="list-inside list-disc">
|
||||||
|
<li>The right to access your data</li>
|
||||||
|
<li>The right to rectify your data</li>
|
||||||
|
<li>The right to request deletion of your data</li>
|
||||||
|
</ul>
|
||||||
|
<p>However, since I am not processing any personal data,</p>
|
||||||
|
<Heading level={2}>Contact</Heading>
|
||||||
|
<p>
|
||||||
|
I run this website as an individual. If you have any questions or complaints regarding my privacy and data
|
||||||
|
practices, you can reach out to the data controller:
|
||||||
|
</p>
|
||||||
|
<p class="bg-info p-4">
|
||||||
|
Duskflower Technologies
|
||||||
|
<br />
|
||||||
|
privacy(at)duskflower.dev
|
||||||
|
</p>
|
||||||
|
<Heading level={2}>About this policy</Heading>
|
||||||
|
<p>
|
||||||
|
This policy is currently up to date, the last change was done in January 2024.
|
||||||
|
<br />
|
||||||
|
With the development of signalstats or with new legal requirements it might become necessary to adjust the
|
||||||
|
policy. All updates will be posted under here. To get the current version, refer to this page.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
Loading…
Add table
Add a link
Reference in a new issue