Compare commits

...

No commits in common. "main" and "pages" have entirely different histories.
main ... pages

30 changed files with 1766 additions and 1450 deletions

View file

@ -1,49 +0,0 @@
name: Build and Deploy Static Site
on:
push:
branches:
- dev
jobs:
build:
container: node:20-bookworm
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Install dependencies
run: |
apt update
apt install -y python3 python3-pip
python3 -m pip install -r requirements.txt --break-system-packages
- name: Generate static site
run: python3 main.py --dev
- name: Deploy to pages branch
run: |
# Configure Git
git config --global user.name "Forgejo"
git config --global user.email "noreply@private.coffee"
# Move generated static site files to a temporary location
mv build ../static_site_temp
# Create a new orphan branch named 'pages-dev'
git checkout --orphan pages-dev
# Remove all files from the working directory
git rm -rf .
# Move the static site files back to the working directory
mv ../static_site_temp/* ./
mv ../static_site_temp/.* ./ 2>/dev/null || true
# Add and commit the static site files
git add .
git commit -m "Deploy static site"
# Force push to the 'pages-dev' branch
git push origin pages-dev --force

4
.gitignore vendored
View file

@ -1,4 +0,0 @@
venv/
*.pyc
__pycache__/
build/

27
.vscode/launch.json vendored
View file

@ -1,27 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Debug: Development Mode",
"type": "debugpy",
"request": "launch",
"program": "main.py",
"console": "integratedTerminal",
"cwd": "${workspaceFolder}",
"env": {
"PRIVATECOFFEE_DEV": "1"
}
},
{
"name": "Debug: Production Mode",
"type": "debugpy",
"request": "launch",
"program": "main.py",
"console": "integratedTerminal",
"cwd": "${workspaceFolder}"
}
]
}

23
LICENSE
View file

@ -1,23 +0,0 @@
Copyright (c) 2023 Private.coffee Team <support@private.coffee>
Use of the Private.coffee / Private Coffee name or the Private.coffee logo
without express permission by the Private.coffee team is prohibited. However,
you are free to use all code components under the MIT License:
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -1,31 +0,0 @@
# Private.coffee Website
[![Support Private.coffee!](https://shields.private.coffee/badge/private.coffee-Support%20us!-pink?logo=coffeescript)](https://private.coffee)
This is the source code for the [Private.coffee](https://private.coffee)
website.
It is a simple Flask application that generates the HTML for the website based
on the services defined in the `services.json` file.
## Development
To run the website locally, you will need to have Python 3 installed. Then, you
can install the dependencies and run the website with the following commands:
```bash
pip install -r requirements.txt
python main.py
```
The website will be available at `http://localhost:9810`.
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE)
file for details.
## Attribution
This website is built using the [Bootstrap](https://getbootstrap.com) framework
and [Phosphor Icons](https://phosphoricons.com).

View file

@ -81,7 +81,7 @@ h5 {
font-size: x-large;
}
.card-body :not(p):not(:first-child):not(.dropdown-content):not(.dropdown-toggle-area) {
.card-body .btn-primary:not(:first-child) {
margin-top: 10px;
}
@ -223,7 +223,7 @@ h5 {
position: absolute;
background-color: #f9f9f9;
min-width: 100%;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1;
}

View file

@ -10,7 +10,7 @@
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>{% block title %}{% endblock %} - Private.coffee</title>
<title> - Private.coffee</title>
<link rel="stylesheet" href="/assets/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="/assets/css/base.css" />
</head>
@ -51,8 +51,8 @@
</ul><a class="btn btn-primary shadow navbar-btn" role="button" href="/membership.html">JOIN &amp; SUPPORT</a>
</div>
</nav>
{% if warning %}{{ warning|safe }}{% endif %}
{% block content %}{% endblock %}
<footer class="bg-primary-gradient">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
@ -75,7 +75,7 @@
<div class="fw-bold d-flex align-items-center mb-2">
<span
class="bs-icon-sm bs-icon-circle bs-icon-primary d-flex justify-content-center align-items-center bs-icon me-2"
>{{ "coffee" | icon | safe }}</span
><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M80,56V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0Zm40,8a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,120,64Zm32,0a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,152,64Zm96,56v8a40,40,0,0,1-37.51,39.91,96.59,96.59,0,0,1-27,40.09H208a8,8,0,0,1,0,16H32a8,8,0,0,1,0-16H56.54A96.3,96.3,0,0,1,24,136V88a8,8,0,0,1,8-8H208A40,40,0,0,1,248,120ZM200,96H40v40a80.27,80.27,0,0,0,45.12,72h69.76A80.27,80.27,0,0,0,200,136Zm32,24a24,24,0,0,0-16-22.62V136a95.78,95.78,0,0,1-1.2,15A24,24,0,0,0,232,128Z"></path></svg></span
><span>Private.coffee</span>
</div>
<p class="text-muted">
@ -89,8 +89,20 @@
class="text-muted d-flex justify-content-between align-items-center pt-3"
>
<p class="mb-0">Made with ❤️ and ☕ by Private.coffee</p>
<p class="mb-0">{{ "rainbow" | icon | safe }}</p>
<p class="mb-0"><svg xmlns="http://www.w3.org/2000/svg" width="94" height="20" role="img" aria-label="LGBTIQ+">
<title>LGBTIQ+</title>
<rect rx="3" width="94" height="20" fill="#555"/>
<rect x="37" width="57" height="20" fill="#e05d44"/>
<rect x="46.5" width="47.5" height="20" fill="#fecc00"/>
<rect x="56" width="37" height="20" fill="#61c354"/>
<rect x="65.5" width="27" height="20" fill="#007ec6"/>
<rect x="75" width="17" height="20" fill="#744ca1"/>
<rect x="84.5" width="9.5" height="20" rx="3" ry="3" fill="#8b00ff"/>
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="8">
<text x="18.5" y="15" fill="#fff">LGBTIQ+</text>
</g>
</svg></p>
</div>
</footer>
</body>
</html>
</html>

View file

@ -1,41 +0,0 @@
private.coffee www.private.coffee {
header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
header Access-Control-Allow-Origin https://element.private.coffee
header Access-Control-Allow-Methods "GET"
header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range"
header Access-Control-Expose-Headers "Content-Length,Content-Range"
@matrix {
path matrix /.well-known/matrix/*
}
@assets {
path assets /assets/*
}
@security {
path security-well-known /.well-known/security.txt
path security /security.txt
}
handle @matrix {
header /.well-known/matrix/* Content-Type application/json
header /.well-known/matrix/* Access-Control-Allow-Origin *
respond /.well-known/matrix/server `{"m.server": "matrix.private.coffee:443"}`
respond /.well-known/matrix/client `{"m.homeserver":{"base_url":"https://matrix.private.coffee"}}`
}
handle @assets {
file_server
root * /srv/private.coffee
}
handle @security {
redir https://security.private.coffee/security.txt
}
handle {
reverse_proxy * unix//var/run/uwsgi/privatecoffee.sock
}
}

View file

@ -1,16 +0,0 @@
[uwsgi]
module = main:app
uid = %n
gid = %n
master = true
processes = 5
plugins = python3
virtualenv = /srv/%n/venv/
chdir = /srv/%n/
env = PRIVATECOFFEE_DEV=true
http-socket = /var/run/uwsgi/%n.sock
chown-socket = caddy

View file

@ -1,14 +0,0 @@
[uwsgi]
module = main:app
uid = %n
gid = %n
master = true
processes = 5
plugins = python3
virtualenv = /srv/%n/venv/
chdir = /srv/%n/
http-socket = /var/run/uwsgi/%n.sock
chown-socket = caddy

View file

@ -1,49 +0,0 @@
{
"2024": {
"4": {
"Membership Fees": {
"EUR": 365
},
"Server Costs": {
"EUR": -216.57
},
"Domain Names": {},
"Administrative Expenses": {
"EUR": -36.10,
"Notes": "Administrative fee for the formation of the association"
}
},
"5": {
"Membership Fees": {
"EUR": 390
},
"Donations": {
"BTC": 0.000434,
"XMR": 0.447661805527
},
"Server Costs": {
"EUR": -430.04,
"Notes": "Includes setup costs and two monthly payments for new server"
}
},
"6": {
"Membership Fees": {
"EUR": 382.42
},
"Server Costs": {
"EUR": -317.62
},
"Bank Fees": {
"EUR": -49.05
}
},
"7": {
"Membership Fees": {
"EUR": 395
},
"Server Costs": {
"EUR": -32.72
}
}
}
}

View file

@ -1,376 +0,0 @@
{
"services": [
{
"name": "Matrix",
"url": "https://element.private.coffee",
"short_description": "Matrix is an open network for secure, decentralized communication.",
"long_description": "Private.coffee runs a Matrix server. You can use it to chat with other people at Private.coffee or around the world. Use it with a client of your choice, or use our Element web client.",
"status": "OK",
"links": [
{
"name": "Go to Element",
"url": "https://element.private.coffee",
"alternatives": [
{
"name": "Tor",
"url": "http://element.coffee2m3bjsrrqqycx6ghkxrnejl2q6nl7pjw2j4clchjj6uk5zozad.onion"
}
]
}
],
"icon": "matrix-logo",
"exclude_from_index": false,
"exclude_from_simple": true
},
{
"name": "CryptPad",
"url": "https://cryptpad.private.coffee",
"short_description": "Private, encrypted, real-time collaborative editor.",
"long_description": "CryptPad is a private, encrypted, zero-knowledge, realtime collaborative editor, similar to Google Docs and Office 365.",
"status": "OK",
"links": [
{
"name": "Go to CryptPad",
"url": "https://cryptpad.private.coffee"
}
],
"icon": "article-ny-times",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "Piped / Invidious",
"url": "https://piped.private.coffee",
"short_description": "Watch YouTube videos without Google tracking.",
"long_description": "Piped and Invidious are alternative front-ends to YouTube. They allow you to watch YouTube videos without Google tracking you.",
"status": "OK",
"links": [
{
"name": "Go to Piped",
"url": "https://piped.private.coffee"
},
{
"name": "Go to Invidious",
"url": "https://invidious.private.coffee",
"alternatives": [
{
"name": "Tor",
"url": "http://invidious.coffee2m3bjsrrqqycx6ghkxrnejl2q6nl7pjw2j4clchjj6uk5zozad.onion"
}
]
}
],
"icon": "video",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "Transfer.coffee",
"url": "https://transfer.coffee",
"short_description": "Transfer files securely using peer-to-peer connections.",
"long_description": "Transfer.coffee allows you to transfer files securely using peer-to-peer connections. Your files are never stored on our servers.",
"status": "OK",
"links": [
{
"name": "Go to Transfer.coffee",
"url": "https://transfer.coffee"
}
],
"icon": "upload",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "MyIP.Coffee",
"url": "https://myip.coffee",
"short_description": "Check your IP address.",
"long_description": "MyIP.Coffee allows you to check your current IPv4 and IPv6 addresses.",
"status": "OK",
"links": [
{
"name": "Go to MyIP.Coffee",
"url": "https://myip.coffee"
}
],
"icon": "network",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "Mastodon",
"url": "https://cuddly.space",
"short_description": "Mastodon is a decentralized social network.",
"long_description": "Mastodon is a decentralized social network. You can use it to post short messages, follow other people, and more.",
"status": "OK",
"links": [
{
"name": "Go to Cuddly Space",
"url": "https://cuddly.space"
},
{
"name": "Go to Skrt Social",
"url": "https://skrt.social"
}
],
"icon": "mastodon-logo",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "Forgejo",
"url": "https://git.private.coffee",
"short_description": "Forgejo is our in-house Git forge.",
"long_description": "Forgejo is our in-house Git forge. You can use it to host your Git repositories, and to collaborate with others.",
"status": "OK",
"links": [
{
"name": "Go to Forgejo",
"url": "https://git.private.coffee"
}
],
"icon": "git-branch",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "BigBlueButton",
"url": "https://bbb.private.coffee",
"short_description": "BigBlueButton is an open-source video conferencing system.",
"long_description": "BigBlueButton is an open-source video conferencing system. You can use it to hold video conferences, webinars, and more.",
"status": "OK",
"links": [
{
"name": "Go to BigBlueButton",
"url": "https://bbb.private.coffee"
}
],
"icon": "webcam",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "HedgeDoc",
"url": "https://hedgedoc.private.coffee",
"short_description": "HedgeDoc is an open-source collaborative markdown editor.",
"long_description": "HedgeDoc is an open-source collaborative markdown editor. You can use it to write and edit documents in markdown, and to collaborate with others.",
"status": "OK",
"links": [
{
"name": "Go to HedgeDoc",
"url": "https://hedgedoc.private.coffee"
}
],
"icon": "markdown-logo",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "redlib",
"url": "https://redlib.private.coffee",
"short_description": "redlib is a privacy-friendly alternative front-end to Reddit.",
"long_description": "redlib is a privacy-friendly alternative front-end to Reddit. It allows you to browse Reddit without being tracked.",
"status": "OK",
"links": [
{
"name": "Go to redlib",
"url": "https://redlib.private.coffee"
}
],
"icon": "chats",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "AllTube",
"url": "https://alltube.private.coffee",
"short_description": "Download videos from YouTube, Vimeo, and more.",
"long_description": "AllTube is a video downloader powered by yt-dlp. It allows you to download videos from YouTube, Vimeo, and many other sites. You can also stream the download through our server for extra privacy.",
"status": "OK",
"links": [
{
"name": "Go to AllTube",
"url": "https://alltube.private.coffee"
}
],
"icon": "video",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "Structables",
"url": "https://structables.private.coffee",
"short_description": "Browse Instructables without being tracked.",
"long_description": "Structables allows you to browse Instructables without being tracked.",
"status": "OK",
"links": [
{
"name": "Go to Structables",
"url": "https://structables.private.coffee"
}
],
"icon": "lightbulb",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "LibreTranslate",
"url": "https://translate.private.coffee",
"short_description": "LibreTranslate is a self-hosted translation service powered by Argos Translate.",
"long_description": "LibreTranslate is a self-hosted translation service powered by Argos Translate. It allows you to translate text between many languages.",
"status": "OK",
"links": [
{
"name": "Go to LibreTranslate",
"url": "https://translate.private.coffee"
}
],
"icon": "translate",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "wishthis",
"url": "https://wishthis.private.coffee",
"short_description": "wishthis is a service for creating wishlists.",
"long_description": "wishthis is a service for creating wishlists. You can use it to create wishlists for yourself, or to share them with others.",
"status": "OK",
"links": [
{
"name": "Go to wishthis",
"url": "https://wishthis.private.coffee"
}
],
"icon": "gift",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "NocoDB",
"url": "https://nocodb.private.coffee",
"short_description": "NocoDB is a self-hosted alternative to Airtable.",
"long_description": "NocoDB is a self-hosted alternative to Airtable. It allows you to create databases and tables, and to view and edit them in a spreadsheet-like interface. (Note: If you are unable to create tables upon registration, simply wait a minute or two, log out and then log in again. Note that your email address will be visible to all registered users!)",
"status": "OK",
"links": [
{
"name": "Go to NocoDB",
"url": "https://nocodb.private.coffee"
}
],
"icon": "database",
"exclude_from_index": true,
"exclude_from_simple": true
},
{
"name": "Penpot",
"url": "https://penpot.private.coffee",
"short_description": "Penpot is an open-source design and prototyping platform.",
"long_description": "Penpot is an open-source design and prototyping platform. It allows you to create designs and prototypes, and to collaborate with others.",
"status": "OK",
"links": [
{
"name": "Go to Penpot",
"url": "https://penpot.private.coffee"
}
],
"icon": "pencil-ruler",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "YOURLS",
"url": "https://pcof.fi",
"short_description": "URL shortener for creating handy links.",
"long_description": "Use our URL shortener at pcof.fi to turn long, complicated URLs into something more handy.",
"status": "OK",
"links": [
{
"name": "Go to pcof.fi",
"url": "https://pcof.fi"
}
],
"icon": "link",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "Rallly",
"url": "https://rallly.private.coffee",
"short_description": "Rallly is a free collaborative scheduling service for voting and polls.",
"long_description": "Rallly is a free collaborative scheduling service. It allows you to create polls and vote on them, similar to Doodle. Pro features are enabled for free after signing in.",
"status": "OK",
"links": [
{
"name": "Go to Rallly",
"url": "https://rallly.private.coffee"
}
],
"icon": "calendar",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "LibreY",
"url": "https://librey.private.coffee",
"short_description": "Privacy-friendly metasearch engine.",
"long_description": "LibreY is an open-source, privacy-friendly metasearch engine. It allows you to search for web, image, video, torrents, and more, and it can also search onion sites.",
"status": "OK",
"links": [
{
"name": "Go to LibreY",
"url": "https://librey.private.coffee"
}
],
"icon": "magnifying-glass",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "Overleaf",
"url": "https://overleaf.private.coffee",
"short_description": "Overleaf is an online LaTeX editor for writing and sharing documents.",
"long_description": "Overleaf is an online LaTeX editor for writing and sharing documents. It allows you to write documents in LaTeX, and to collaborate with others.",
"status": "OK",
"links": [
{
"name": "Go to Overleaf",
"url": "https://overleaf.private.coffee"
}
],
"icon": "leaf",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "GotHub",
"url": "https://gothub.private.coffee",
"short_description": "Alternative GitHub interface that respects privacy.",
"long_description": "Gothub is an alternative GitHub interface that respects your privacy. It is currently in alpha, but you can browse and download repositories, and you can also clone them using git+https (although the text on the main page would disagree).",
"status": "OK",
"links": [
{
"name": "Go to GotHub",
"url": "https://gothub.private.coffee"
}
],
"icon": "git-branch",
"exclude_from_index": false,
"exclude_from_simple": false
},
{
"name": "Binternet",
"url": "https://binternet.private.coffee",
"short_description": "Binternet is a privacy-friendly alternative front-end to Pinterest.",
"long_description": "Binternet is a privacy-friendly alternative front-end to Pinterest. It allows you to browse Pinterest without being tracked.",
"status": "OK",
"links": [
{
"name": "Go to Binternet",
"url": "https://binternet.private.coffee"
}
],
"icon": "images",
"exclude_from_index": false,
"exclude_from_simple": false
}
]
}

Binary file not shown.

View file

@ -1,249 +0,0 @@
from decimal import Decimal
from datetime import datetime
def get_latest_month(data, allow_current=False):
years = sorted(data.keys())
latest_year = years[-1]
months = sorted(data[latest_year].keys())
latest_month = months[-1]
if (
not allow_current
and latest_year == str(datetime.now().year)
and latest_month == str(datetime.now().month)
):
try:
latest_month = months[-2]
except IndexError:
latest_year = years[-2]
latest_month = months[-1]
return int(latest_month), int(latest_year)
def get_transparency_data(data, year=None, month=None, allow_current=False):
if year is None:
year = max(data.keys())
if month is None:
month = max(data[year].keys())
year = str(year)
month = str(month)
if (
not allow_current
and year == str(datetime.now().year)
and month == str(datetime.now().month)
):
try:
month = max([m for m in data[year].keys() if m != str(datetime.now().month)])
except ValueError:
year = str(int(year) - 1)
month = max(data[year].keys())
assert year in data, f"Year {year} not found in data"
assert month in data[year], f"Month {month}-{year} not found in data"
# Initialize balances
balances = {}
incomes = {}
expenses = {}
notes = {}
start_balance = {}
end_balance = {}
for y in sorted(data.keys()):
if int(y) > int(year):
break
for m in sorted(data[y].keys()):
if int(y) == int(year) and int(m) > int(month):
break
# If the month is the one we are interested in, capture the start balance
if int(y) == int(year) and int(m) == int(month):
start_balance = {
k: Decimal(v) for k, v in balances.items() if k != "Notes"
}
for category in data[y][m]:
for currency, amount in data[y][m][category].items():
if currency == "Notes":
if int(y) == int(year) and int(m) == int(month):
notes[category] = amount
else:
if currency not in balances:
balances[currency] = Decimal(0)
balances[currency] += Decimal(str(amount))
# Track incomes and expenses
if int(y) == int(year) and int(m) == int(month):
if Decimal(str(amount)) > 0:
if category not in incomes:
incomes[category] = {}
if currency not in incomes[category]:
incomes[category][currency] = Decimal(0)
incomes[category][currency] += Decimal(str(amount))
else:
if category not in expenses:
expenses[category] = {}
if currency not in expenses[category]:
expenses[category][currency] = Decimal(0)
expenses[category][currency] += Decimal(str(amount))
# If the month is the one we are interested in, capture the end balance
if int(y) == int(year) and int(m) == int(month):
end_balance = {
k: Decimal(v) for k, v in balances.items() if k != "Notes"
}
# Calculate accumulated sums of incomes and expenses
accumulated_incomes = {
currency: sum(incomes[cat].get(currency, Decimal(0)) for cat in incomes)
for currency in balances
if currency != "Notes"
}
accumulated_expenses = {
currency: sum(expenses[cat].get(currency, Decimal(0)) for cat in expenses)
for currency in balances
if currency != "Notes"
}
return {
"start_balance": start_balance,
"end_balance": end_balance,
"incomes": incomes,
"expenses": expenses,
"accumulated_incomes": accumulated_incomes,
"accumulated_expenses": accumulated_expenses,
"notes": notes,
}
def generate_transparency_table(result, currencies=None):
def extract_currencies(data):
return ["EUR"] + (
list(
set(
list(data["start_balance"].keys())
+ list(data["end_balance"].keys())
+ list(data["accumulated_incomes"].keys())
+ list(data["accumulated_expenses"].keys())
)
- {"EUR", "Notes"}
)
)
def format_currency(value, currency):
if currency == "EUR":
return f"{value:,.2f}"
elif currency in ["BTC", "ETH", "XMR"]:
return f"{value:,.9f} {currency}"
else:
return f"{value} {currency}"
def format_value(value, currency):
if value == 0:
return f"{format_currency(value, currency)}"
elif value > 0:
return f"+ {format_currency(value, currency)}"
else:
return f"- {format_currency(abs(value), currency)}"
html = """
<table class="table table-bordered table-transparency">
<thead class="table-light">
<tr>
<th scope="col">Category</th>
"""
if currencies is None:
currencies = extract_currencies(result)
# Add currency headers
for currency in currencies:
if currency == "EUR":
html += '<th class="currency-col" scope="col">Euros (€)</th>'
elif currency == "BTC":
html += '<th class="currency-col" scope="col">Bitcoin (BTC)</th>'
elif currency == "ETH":
html += '<th class="currency-col" scope="col">Ethereum (ETH)</th>'
elif currency == "XMR":
html += '<th class="currency-col" scope="col">Monero (XMR)</th>'
else:
html += f'<th class="currency-col" scope="col">{currency}</th>'
html += """
</tr>
</thead>
<tbody>
"""
# Add start balance row
html += "<tr><td>Account Balance (start of month)</td>"
for currency in currencies:
value = result["start_balance"].get(currency, Decimal(0))
html += f"<td>{format_value(value, currency)}</td>"
html += "</tr>"
# Add income rows
for category, transactions in result["incomes"].items():
has_notes = result["notes"].get(category)
html += f"<tr><td>{category}{'*' if has_notes else ''}</td>"
for currency in currencies:
value = transactions.get(currency, "")
if value != "":
html += f"<td>{format_value(value, currency)}</td>"
else:
html += "<td></td>"
html += "</tr>"
# Add expense rows
for category, transactions in result["expenses"].items():
has_notes = result["notes"].get(category)
html += f"<tr><td>{category}{'*' if has_notes else ''}</td>"
for currency in currencies:
value = transactions.get(currency, "")
if value != "":
html += f"<td>{format_value(value, currency)}</td>"
else:
html += "<td></td>"
html += "</tr>"
# Add total income row
html += '<tr class="table-secondary"><td><b>Total Income</b></td>'
for currency in currencies:
value = result["accumulated_incomes"].get(currency, Decimal(0))
html += f"<td><b>{format_value(value, currency)}</b></td>"
html += "</tr>"
# Add total expenses row
html += '<tr class="table-secondary"><td><b>Total Expenses</b></td>'
for currency in currencies:
value = result["accumulated_expenses"].get(currency, Decimal(0))
html += f"<td><b>{format_value(value, currency)}</b></td>"
html += "</tr>"
# Add end balance row
html += '<tr class="table-secondary"><td><b>Account Balance (end of month)</b></td>'
for currency in currencies:
value = result["end_balance"].get(currency, Decimal(0))
html += f"<td><b>{format_value(value, currency)}</b></td>"
html += "</tr>"
html += """
</tbody>
</table>
"""
if result["notes"]:
html += "<p><b>Notes:</b></p>"
html += "<ul>"
for category, footnote in result["notes"].items():
html += f"<li>{category}: {footnote}</li>"
html += "</ul>"
return html

825
index.html Normal file
View file

@ -0,0 +1,825 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<!-- This file was created as part of the Private.coffee project
It is licensed under the MIT license
For more information, please visit https://private.coffee -->
<head>
<meta charset="utf8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Home - Private.coffee</title>
<link rel="stylesheet" href="/assets/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="/assets/css/base.css" />
</head>
<body>
<nav
class="navbar navbar-expand-md py-3 navbar-light"
id="mainNav"
>
<div class="container">
<div class="row d-lg-flex align-items-lg-center">
<div class="col p-0">
<a href="/"
><img src="/assets/img/logo-inv_grad.svg" style="height: 60px"
/></a>
</div>
<div class="col d-flex">
<a class="navbar-brand d-flex align-items-center" href="/">
<p
class="mb-0"
style="line-height: 1.2rem; color: var(--bs-tertiary-color)"
>
<span class="ps-2 fancy-text-primary"
><span style="color: rgb(35, 35, 35)"
>Private.coffee</span
></span
><br class="that-br" /><span class="ps-2 slogan"
>Empowering Privacy with Open Source</span
>
</p>
</a>
</div>
</div>
<div class="navbar" id="navcol-1">
<ul class="navbar-nav mx-auto">
<li class="nav-item"><a class="nav-link active" href="/index.html">Home</a></li>
<li class="nav-item"><a class="nav-link" href="https://status.private.coffee/">Status</a></li>
</ul><a class="btn btn-primary shadow navbar-btn" role="button" href="/membership.html">JOIN &amp; SUPPORT</a>
</div>
</nav>
<header class="bg-primary-gradient">
<div class="container pt-4 pt-xl-5 pb-4 pb-xl-5">
<div class="row gy-5 pt-5">
<div class="col-md-8 col-xl-6 text-center text-md-start mx-auto">
<div class="text-center">
<h2>Empowering Privacy with Open Source</h2>
</div>
<p class="text-center special-header fancy-text-primary mb-0" style="font-weight: 500;">Private.coffee</p>
</div>
<div class="col-12 col-lg-10 mx-auto justify-content-center d-flex"><img class="mx-auto" src="/assets/img/logo-inv_grad.svg" style="max-width: 400px;width: 80vw;"></div>
</div>
</div>
</header>
<section class="bg-white">
<div class="container bg-white py-5">
<div class="row">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<p class="fw-bold mb-2 text-primary">Our self-hosted Services</p>
<h3 class="fw-bold">
Private.coffee provides a collection of services that respect your
privacy.
</h3>
</div>
</div>
<div class="py-5 p-lg-5">
<div
class="row row-cols-1 row-cols-md-2 row-cols-lg-3 mx-auto"
style="max-width: 1200px"
>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M72,216a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8H64a8,8,0,0,1,0,16H48V208H64A8,8,0,0,1,72,216ZM216,32H192a8,8,0,0,0,0,16h16V208H192a8,8,0,0,0,0,16h24a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32Zm-32,88a32,32,0,0,0-56-21.13,31.93,31.93,0,0,0-40.71-6.15A8,8,0,0,0,72,96v64a8,8,0,0,0,16,0V120a16,16,0,0,1,32,0v40a8,8,0,0,0,16,0V120a16,16,0,0,1,32,0v40a8,8,0,0,0,16,0Z"></path></svg>
</div>
<h5 class="fw-bold card-title">Matrix</h5>
<p class="text-muted card-text mb-4">
Private.coffee runs a Matrix server. You can use it to chat with other people at Private.coffee or around the world. Use it with a client of your choice, or use our Element web client.
</p>
<div class="dropdown">
<div class="btn btn-primary shadow">
<a class="main-link" href="https://element.private.coffee">
Go to Element
</a>
<div class="dropdown-toggle-area">&#9660;</div>
</div>
<div class="dropdown-content">
<a href="http://element.coffee2m3bjsrrqqycx6ghkxrnejl2q6nl7pjw2j4clchjj6uk5zozad.onion">Tor</a>
</div>
</div>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M128,96H232a8,8,0,0,1,0,16H128a8,8,0,0,1,0-16Zm104,32H128a8,8,0,0,0,0,16H232a8,8,0,0,0,0-16Zm0,32H80a8,8,0,0,0,0,16H232a8,8,0,0,0,0-16Zm0,32H80a8,8,0,0,0,0,16H232a8,8,0,0,0,0-16ZM96,144a8,8,0,0,0,0-16H88V64h32v8a8,8,0,0,0,16,0V56a8,8,0,0,0-8-8H32a8,8,0,0,0-8,8V72a8,8,0,0,0,16,0V64H72v64H64a8,8,0,0,0,0,16Z"></path></svg>
</div>
<h5 class="fw-bold card-title">CryptPad</h5>
<p class="text-muted card-text mb-4">
CryptPad is a private, encrypted, zero-knowledge, realtime collaborative editor, similar to Google Docs and Office 365.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://cryptpad.private.coffee"
>Go to CryptPad</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M164.44,105.34l-48-32A8,8,0,0,0,104,80v64a8,8,0,0,0,12.44,6.66l48-32a8,8,0,0,0,0-13.32ZM120,129.05V95l25.58,17ZM216,40H40A16,16,0,0,0,24,56V168a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,128H40V56H216V168Zm16,40a8,8,0,0,1-8,8H32a8,8,0,0,1,0-16H224A8,8,0,0,1,232,208Z"></path></svg>
</div>
<h5 class="fw-bold card-title">Piped / Invidious</h5>
<p class="text-muted card-text mb-4">
Piped and Invidious are alternative front-ends to YouTube. They allow you to watch YouTube videos without Google tracking you.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://piped.private.coffee"
>Go to Piped</a
>
<div class="dropdown">
<div class="btn btn-primary shadow">
<a class="main-link" href="https://invidious.private.coffee">
Go to Invidious
</a>
<div class="dropdown-toggle-area">&#9660;</div>
</div>
<div class="dropdown-content">
<a href="http://invidious.coffee2m3bjsrrqqycx6ghkxrnejl2q6nl7pjw2j4clchjj6uk5zozad.onion">Tor</a>
</div>
</div>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M240,136v64a16,16,0,0,1-16,16H32a16,16,0,0,1-16-16V136a16,16,0,0,1,16-16H80a8,8,0,0,1,0,16H32v64H224V136H176a8,8,0,0,1,0-16h48A16,16,0,0,1,240,136ZM85.66,77.66,120,43.31V128a8,8,0,0,0,16,0V43.31l34.34,34.35a8,8,0,0,0,11.32-11.32l-48-48a8,8,0,0,0-11.32,0l-48,48A8,8,0,0,0,85.66,77.66ZM200,168a12,12,0,1,0-12,12A12,12,0,0,0,200,168Z"></path></svg>
</div>
<h5 class="fw-bold card-title">Transfer.coffee</h5>
<p class="text-muted card-text mb-4">
Transfer.coffee allows you to transfer files securely using peer-to-peer connections. Your files are never stored on our servers.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://transfer.coffee"
>Go to Transfer.coffee</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M232,112H136V88h8a16,16,0,0,0,16-16V40a16,16,0,0,0-16-16H112A16,16,0,0,0,96,40V72a16,16,0,0,0,16,16h8v24H24a8,8,0,0,0,0,16H56v32H48a16,16,0,0,0-16,16v32a16,16,0,0,0,16,16H80a16,16,0,0,0,16-16V176a16,16,0,0,0-16-16H72V128H184v32h-8a16,16,0,0,0-16,16v32a16,16,0,0,0,16,16h32a16,16,0,0,0,16-16V176a16,16,0,0,0-16-16h-8V128h32a8,8,0,0,0,0-16ZM112,40h32V72H112ZM80,208H48V176H80Zm128,0H176V176h32Z"></path></svg>
</div>
<h5 class="fw-bold card-title">MyIP.Coffee</h5>
<p class="text-muted card-text mb-4">
MyIP.Coffee allows you to check your current IPv4 and IPv6 addresses.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://myip.coffee"
>Go to MyIP.Coffee</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M184,32H72A40,40,0,0,0,32,72V192a40,40,0,0,0,40,40h88a8,8,0,0,0,0-16H72a24,24,0,0,1-24-24v-8H184a40,40,0,0,0,40-40V72A40,40,0,0,0,184,32Zm24,112a24,24,0,0,1-24,24H48V72A24,24,0,0,1,72,48H184a24,24,0,0,1,24,24Zm-24-40v32a8,8,0,0,1-16,0V104a16,16,0,0,0-32,0v32a8,8,0,0,1-16,0V104a16,16,0,0,0-32,0v32a8,8,0,0,1-16,0V104a32,32,0,0,1,56-21.13A32,32,0,0,1,184,104Z"></path></svg>
</div>
<h5 class="fw-bold card-title">Mastodon</h5>
<p class="text-muted card-text mb-4">
Mastodon is a decentralized social network. You can use it to post short messages, follow other people, and more.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://cuddly.space"
>Go to Cuddly Space</a
>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://skrt.social"
>Go to Skrt Social</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192ZM200,80a16,16,0,1,1,16-16A16,16,0,0,1,200,80Z"></path></svg>
</div>
<h5 class="fw-bold card-title">Forgejo</h5>
<p class="text-muted card-text mb-4">
Forgejo is our in-house Git forge. You can use it to host your Git repositories, and to collaborate with others.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://git.private.coffee"
>Go to Forgejo</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M168,104a40,40,0,1,0-40,40A40,40,0,0,0,168,104Zm-64,0a24,24,0,1,1,24,24A24,24,0,0,1,104,104Zm120,96H136V183.6a80,80,0,1,0-16,0V200H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM64,104a64,64,0,1,1,64,64A64.07,64.07,0,0,1,64,104Z"></path></svg>
</div>
<h5 class="fw-bold card-title">BigBlueButton</h5>
<p class="text-muted card-text mb-4">
BigBlueButton is an open-source video conferencing system. You can use it to hold video conferences, webinars, and more.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://bbb.private.coffee"
>Go to BigBlueButton</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M232,48H24A16,16,0,0,0,8,64V192a16,16,0,0,0,16,16H232a16,16,0,0,0,16-16V64A16,16,0,0,0,232,48Zm0,144H24V64H232V192ZM128,104v48a8,8,0,0,1-16,0V123.31L93.66,141.66a8,8,0,0,1-11.32,0L64,123.31V152a8,8,0,0,1-16,0V104a8,8,0,0,1,13.66-5.66L88,124.69l26.34-26.35A8,8,0,0,1,128,104Zm77.66,18.34a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L168,132.69V104a8,8,0,0,1,16,0v28.69l10.34-10.35A8,8,0,0,1,205.66,122.34Z"></path></svg>
</div>
<h5 class="fw-bold card-title">HedgeDoc</h5>
<p class="text-muted card-text mb-4">
HedgeDoc is an open-source collaborative markdown editor. You can use it to write and edit documents in markdown, and to collaborate with others.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://hedgedoc.private.coffee"
>Go to HedgeDoc</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M216,80H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8V96A16,16,0,0,0,216,80ZM66.55,137.78,40,159.25V48H168v88H71.58A8,8,0,0,0,66.55,137.78ZM216,207.25l-26.55-21.47a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32Z"></path></svg>
</div>
<h5 class="fw-bold card-title">redlib</h5>
<p class="text-muted card-text mb-4">
redlib is a privacy-friendly alternative front-end to Reddit. It allows you to browse Reddit without being tracked.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://redlib.private.coffee"
>Go to redlib</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M164.44,105.34l-48-32A8,8,0,0,0,104,80v64a8,8,0,0,0,12.44,6.66l48-32a8,8,0,0,0,0-13.32ZM120,129.05V95l25.58,17ZM216,40H40A16,16,0,0,0,24,56V168a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,128H40V56H216V168Zm16,40a8,8,0,0,1-8,8H32a8,8,0,0,1,0-16H224A8,8,0,0,1,232,208Z"></path></svg>
</div>
<h5 class="fw-bold card-title">AllTube</h5>
<p class="text-muted card-text mb-4">
AllTube is a video downloader powered by yt-dlp. It allows you to download videos from YouTube, Vimeo, and many other sites. You can also stream the download through our server for extra privacy.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://alltube.private.coffee"
>Go to AllTube</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-16,0a72,72,0,0,0-73.74-72c-39,.92-70.47,33.39-70.26,72.39a71.65,71.65,0,0,0,27.64,56.3A32,32,0,0,1,96,186v6h64v-6a32.15,32.15,0,0,1,12.47-25.35A71.65,71.65,0,0,0,200,104Zm-16.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z"></path></svg>
</div>
<h5 class="fw-bold card-title">Structables</h5>
<p class="text-muted card-text mb-4">
Structables allows you to browse Instructables without being tracked.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://structables.private.coffee"
>Go to Structables</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M247.15,212.42l-56-112a8,8,0,0,0-14.31,0l-21.71,43.43A88,88,0,0,1,108,126.93,103.65,103.65,0,0,0,135.69,64H160a8,8,0,0,0,0-16H104V32a8,8,0,0,0-16,0V48H32a8,8,0,0,0,0,16h87.63A87.76,87.76,0,0,1,96,116.35a87.74,87.74,0,0,1-19-31,8,8,0,1,0-15.08,5.34A103.63,103.63,0,0,0,84,127a87.55,87.55,0,0,1-52,17,8,8,0,0,0,0,16,103.46,103.46,0,0,0,64-22.08,104.18,104.18,0,0,0,51.44,21.31l-26.6,53.19a8,8,0,0,0,14.31,7.16L148.94,192h70.11l13.79,27.58A8,8,0,0,0,240,224a8,8,0,0,0,7.15-11.58ZM156.94,176,184,121.89,211.05,176Z"></path></svg>
</div>
<h5 class="fw-bold card-title">LibreTranslate</h5>
<p class="text-muted card-text mb-4">
LibreTranslate is a self-hosted translation service powered by Argos Translate. It allows you to translate text between many languages.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://translate.private.coffee"
>Go to LibreTranslate</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M216,72H180.92c.39-.33.79-.65,1.17-1A29.53,29.53,0,0,0,192,49.57,32.62,32.62,0,0,0,158.44,16,29.53,29.53,0,0,0,137,25.91a54.94,54.94,0,0,0-9,14.48,54.94,54.94,0,0,0-9-14.48A29.53,29.53,0,0,0,97.56,16,32.62,32.62,0,0,0,64,49.57,29.53,29.53,0,0,0,73.91,71c.38.33.78.65,1.17,1H40A16,16,0,0,0,24,88v32a16,16,0,0,0,16,16v64a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V136a16,16,0,0,0,16-16V88A16,16,0,0,0,216,72ZM149,36.51a13.69,13.69,0,0,1,10-4.5h.49A16.62,16.62,0,0,1,176,49.08a13.69,13.69,0,0,1-4.5,10c-9.49,8.4-25.24,11.36-35,12.4C137.7,60.89,141,45.5,149,36.51Zm-64.09.36A16.63,16.63,0,0,1,96.59,32h.49a13.69,13.69,0,0,1,10,4.5c8.39,9.48,11.35,25.2,12.39,34.92-9.72-1-25.44-4-34.92-12.39a13.69,13.69,0,0,1-4.5-10A16.6,16.6,0,0,1,84.87,36.87ZM40,88h80v32H40Zm16,48h64v64H56Zm144,64H136V136h64Zm16-80H136V88h80v32Z"></path></svg>
</div>
<h5 class="fw-bold card-title">wishthis</h5>
<p class="text-muted card-text mb-4">
wishthis is a service for creating wishlists. You can use it to create wishlists for yourself, or to share them with others.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://wishthis.private.coffee"
>Go to wishthis</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M208,32H160a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm0,176H160V176h24a8,8,0,0,0,0-16H160V136h24a8,8,0,0,0,0-16H160V96h24a8,8,0,0,0,0-16H160V48h48V208ZM77.66,26.34a8,8,0,0,0-11.32,0l-32,32A8,8,0,0,0,32,64V208a16,16,0,0,0,16,16H96a16,16,0,0,0,16-16V64a8,8,0,0,0-2.34-5.66ZM48,176V80H64v96ZM80,80H96v96H80ZM72,43.31,92.69,64H51.31ZM48,208V192H96v16Z"></path></svg>
</div>
<h5 class="fw-bold card-title">Penpot</h5>
<p class="text-muted card-text mb-4">
Penpot is an open-source design and prototyping platform. It allows you to create designs and prototypes, and to collaborate with others.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://penpot.private.coffee"
>Go to Penpot</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,16,.45A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z"></path></svg>
</div>
<h5 class="fw-bold card-title">YOURLS</h5>
<p class="text-muted card-text mb-4">
Use our URL shortener at pcof.fi to turn long, complicated URLs into something more handy.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://pcof.fi"
>Go to pcof.fi</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M208,32H184V24a8,8,0,0,0-16,0v8H88V24a8,8,0,0,0-16,0v8H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM72,48v8a8,8,0,0,0,16,0V48h80v8a8,8,0,0,0,16,0V48h24V80H48V48ZM208,208H48V96H208V208Zm-96-88v64a8,8,0,0,1-16,0V132.94l-4.42,2.22a8,8,0,0,1-7.16-14.32l16-8A8,8,0,0,1,112,120Zm59.16,30.45L152,176h16a8,8,0,0,1,0,16H136a8,8,0,0,1-6.4-12.8l28.78-38.37A8,8,0,1,0,145.07,132a8,8,0,1,1-13.85-8A24,24,0,0,1,176,136,23.76,23.76,0,0,1,171.16,150.45Z"></path></svg>
</div>
<h5 class="fw-bold card-title">Rallly</h5>
<p class="text-muted card-text mb-4">
Rallly is a free collaborative scheduling service. It allows you to create polls and vote on them, similar to Doodle. Pro features are enabled for free after signing in.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://rallly.private.coffee"
>Go to Rallly</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z"></path></svg>
</div>
<h5 class="fw-bold card-title">LibreY</h5>
<p class="text-muted card-text mb-4">
LibreY is an open-source, privacy-friendly metasearch engine. It allows you to search for web, image, video, torrents, and more, and it can also search onion sites.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://librey.private.coffee"
>Go to LibreY</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M223.45,40.07a8,8,0,0,0-7.52-7.52C139.8,28.08,78.82,51,52.82,94a87.09,87.09,0,0,0-12.76,49c.57,15.92,5.21,32,13.79,47.85l-19.51,19.5a8,8,0,0,0,11.32,11.32l19.5-19.51C81,210.73,97.09,215.37,113,215.94q1.67.06,3.33.06A86.93,86.93,0,0,0,162,203.18C205,177.18,227.93,116.21,223.45,40.07ZM153.75,189.5c-22.75,13.78-49.68,14-76.71.77l88.63-88.62a8,8,0,0,0-11.32-11.32L65.73,179c-13.19-27-13-54,.77-76.71,22.09-36.47,74.6-56.44,141.31-54.06C210.2,114.89,190.22,167.41,153.75,189.5Z"></path></svg>
</div>
<h5 class="fw-bold card-title">Overleaf</h5>
<p class="text-muted card-text mb-4">
Overleaf is an online LaTeX editor for writing and sharing documents. It allows you to write documents in LaTeX, and to collaborate with others.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://overleaf.private.coffee"
>Go to Overleaf</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192ZM200,80a16,16,0,1,1,16-16A16,16,0,0,1,200,80Z"></path></svg>
</div>
<h5 class="fw-bold card-title">GotHub</h5>
<p class="text-muted card-text mb-4">
Gothub is an alternative GitHub interface that respects your privacy. It is currently in alpha, but you can browse and download repositories, and you can also clone them using git+https (although the text on the main page would disagree).
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://gothub.private.coffee"
>Go to GotHub</a
>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M216,40H72A16,16,0,0,0,56,56V72H40A16,16,0,0,0,24,88V200a16,16,0,0,0,16,16H184a16,16,0,0,0,16-16V184h16a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM72,56H216v62.75l-10.07-10.06a16,16,0,0,0-22.63,0l-20,20-44-44a16,16,0,0,0-22.62,0L72,109.37ZM184,200H40V88H56v80a16,16,0,0,0,16,16H184Zm32-32H72V132l36-36,49.66,49.66a8,8,0,0,0,11.31,0L194.63,120,216,141.38V168ZM160,84a12,12,0,1,1,12,12A12,12,0,0,1,160,84Z"></path></svg>
</div>
<h5 class="fw-bold card-title">Binternet</h5>
<p class="text-muted card-text mb-4">
Binternet is a privacy-friendly alternative front-end to Pinterest. It allows you to browse Pinterest without being tracked.
</p>
<a
class="btn btn-primary shadow w-100 text-center"
href="https://binternet.private.coffee"
>Go to Binternet</a
>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="bg-primary-gradient">
<div class="container py-5">
<div class="row align-items-center">
<div class="col">
<p class="text-end special-header fancy-text-primary mb-0">Privacy</p>
</div>
<div class="col">
<p class="text-start mb-1" style="font-size: 1.6rem">
from the <strong>community</strong>
</p>
<p class="text-start mb-0" style="font-size: 1.6rem">
for the <strong>community</strong>
</p>
</div>
</div>
<div class="mx-auto" style="max-width: 900px">
<div class="row row-cols-1 row-cols-md-2 d-flex justify-content-center">
<div class="col mb-4">
<div class="card bg-primary-subtle">
<div class="card-body text-center px-4 py-5 px-md-5">
<p class="fw-bold text-primary card-text mb-2">Join or donate</p>
<h5 class="fw-bold card-title mb-3">
Be a part of the open source community!
</h5>
<a class="btn btn-primary btn-sm" href="/membership.html"
>Learn more</a
>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card bg-secondary-subtle">
<div class="card-body text-center px-4 py-5 px-md-5">
<p class="fw-bold text-secondary card-text mb-2">
Private Hosting
</p>
<h5 class="fw-bold card-title mb-3">
Interested in Hosting Services?
</h5>
<a
class="btn btn-secondary btn-sm"
href="mailto:support@private.coffee"
>Get in touch</a
>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="py-5">
<div class="container">
<div class="row mb-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<p class="fw-bold mb-2 text-primary">Contacts</p>
<h2 class="fw-bold">How you can reach us</h2>
</div>
</div>
<div class="row d-flex justify-content-center">
<div
class="col-md-4 col-xl-4 d-flex justify-content-center justify-content-xl-start"
>
<div
class="d-flex flex-wrap flex-md-column justify-content-md-start align-items-md-start h-100"
>
<div class="d-flex align-items-center p-3">
<div
class="bs-icon-md bs-icon-circle bs-icon-primary shadow d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block bs-icon bs-icon-md"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-96,85.15L52.57,64H203.43ZM98.71,128,40,181.81V74.19Zm11.84,10.85,12,11.05a8,8,0,0,0,10.82,0l12-11.05,58,53.15H52.57ZM157.29,128,216,74.18V181.82Z"></path></svg>
</div>
<div class="px-2">
<h6 class="fw-bold mb-0">Email</h6>
<p class="text-muted mb-0">support@private.coffee</p>
</div>
</div>
</div>
</div>
</div>
<div class="row d-flex justify-content-center">
<div
class="col-md-4 col-xl-4 d-flex justify-content-center justify-content-xl-start"
>
<div
class="d-flex flex-wrap flex-md-column justify-content-md-start align-items-md-start h-100"
>
<div class="d-flex align-items-center p-3">
<div
class="bs-icon-md bs-icon-circle bs-icon-primary shadow d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block bs-icon bs-icon-md"
>
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M72,216a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8H64a8,8,0,0,1,0,16H48V208H64A8,8,0,0,1,72,216ZM216,32H192a8,8,0,0,0,0,16h16V208H192a8,8,0,0,0,0,16h24a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32Zm-32,88a32,32,0,0,0-56-21.13,31.93,31.93,0,0,0-40.71-6.15A8,8,0,0,0,72,96v64a8,8,0,0,0,16,0V120a16,16,0,0,1,32,0v40a8,8,0,0,0,16,0V120a16,16,0,0,1,32,0v40a8,8,0,0,0,16,0Z"></path></svg>
</div>
<div class="px-2">
<h6 class="fw-bold mb-0">Matrix</h6>
<p class="text-muted mb-0">
<a
href="https://matrix.pcof.fi/#/#private.coffee:private.coffee"
>#private.coffee:private.coffee</a
>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<footer class="bg-primary-gradient">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
>
<h3 class="fs-6 fw-bold">Legal Stuff</h3>
<ul class="list-unstyled">
<li><a href="/legal.html">Legal Notice</a></li>
<li><a href="/privacy.html">Privacy Notice</a></li>
<li><a href="/terms.html">Terms of Service</a></li>
</ul>
</div>
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
></div>
<div
class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last"
>
<div class="fw-bold d-flex align-items-center mb-2">
<span
class="bs-icon-sm bs-icon-circle bs-icon-primary d-flex justify-content-center align-items-center bs-icon me-2"
><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M80,56V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0Zm40,8a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,120,64Zm32,0a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,152,64Zm96,56v8a40,40,0,0,1-37.51,39.91,96.59,96.59,0,0,1-27,40.09H208a8,8,0,0,1,0,16H32a8,8,0,0,1,0-16H56.54A96.3,96.3,0,0,1,24,136V88a8,8,0,0,1,8-8H208A40,40,0,0,1,248,120ZM200,96H40v40a80.27,80.27,0,0,0,45.12,72h69.76A80.27,80.27,0,0,0,200,136Zm32,24a24,24,0,0,0-16-22.62V136a95.78,95.78,0,0,1-1.2,15A24,24,0,0,0,232,128Z"></path></svg></span
><span>Private.coffee</span>
</div>
<p class="text-muted">
Private.coffee is a privacy-focused non-profit association, dedicated
to supporting privacy and digital sovereignty.
</p>
</div>
</div>
<hr />
<div
class="text-muted d-flex justify-content-between align-items-center pt-3"
>
<p class="mb-0">Made with ❤️ and ☕ by Private.coffee</p>
<p class="mb-0"><svg xmlns="http://www.w3.org/2000/svg" width="94" height="20" role="img" aria-label="LGBTIQ+">
<title>LGBTIQ+</title>
<rect rx="3" width="94" height="20" fill="#555"/>
<rect x="37" width="57" height="20" fill="#e05d44"/>
<rect x="46.5" width="47.5" height="20" fill="#fecc00"/>
<rect x="56" width="37" height="20" fill="#61c354"/>
<rect x="65.5" width="27" height="20" fill="#007ec6"/>
<rect x="75" width="17" height="20" fill="#744ca1"/>
<rect x="84.5" width="9.5" height="20" rx="3" ry="3" fill="#8b00ff"/>
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="8">
<text x="18.5" y="15" fill="#fff">LGBTIQ+</text>
</g>
</svg></p>
</div>
</footer>
</body>
</html>

146
legal.html Normal file
View file

@ -0,0 +1,146 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<!-- This file was created as part of the Private.coffee project
It is licensed under the MIT license
For more information, please visit https://private.coffee -->
<head>
<meta charset="utf8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Legal Notice - Private.coffee</title>
<link rel="stylesheet" href="/assets/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="/assets/css/base.css" />
</head>
<body>
<nav
class="navbar navbar-expand-md py-3 navbar-light"
id="mainNav"
>
<div class="container">
<div class="row d-lg-flex align-items-lg-center">
<div class="col p-0">
<a href="/"
><img src="/assets/img/logo-inv_grad.svg" style="height: 60px"
/></a>
</div>
<div class="col d-flex">
<a class="navbar-brand d-flex align-items-center" href="/">
<p
class="mb-0"
style="line-height: 1.2rem; color: var(--bs-tertiary-color)"
>
<span class="ps-2 fancy-text-primary"
><span style="color: rgb(35, 35, 35)"
>Private.coffee</span
></span
><br class="that-br" /><span class="ps-2 slogan"
>Empowering Privacy with Open Source</span
>
</p>
</a>
</div>
</div>
<div class="navbar" id="navcol-1">
<ul class="navbar-nav mx-auto">
<li class="nav-item"><a class="nav-link active" href="/index.html">Home</a></li>
<li class="nav-item"><a class="nav-link" href="https://status.private.coffee/">Status</a></li>
</ul><a class="btn btn-primary shadow navbar-btn" role="button" href="/membership.html">JOIN &amp; SUPPORT</a>
</div>
</nav>
<section>
<div class="container py-5">
<div class="row align-items-center">
<div class="col">
<p class="text-end special-header fancy-text-primary mb-0">
Legal Notice
</p>
</div>
<div class="col">
<p class="text-start mb-1" style="font-size: 1.6rem">
from the <strong>community</strong>
</p>
<p class="text-start mb-0" style="font-size: 1.6rem">
for the <strong>community</strong>
</p>
</div>
</div>
<div class="container">
<p>This is a legal notice for the website private.coffee</p>
<p>The website private.coffee is run by the following entity:</p>
<address>
Private.coffee &dash; Verein zur Förderung von Privatsphäre und
digitaler Souver&auml;nit&auml;t<br />
c/o Klaus-Uwe Mitterer<br />
Gartengasse 22/7/3<br />
8010 Graz<br />
Austria<br />
</address>
<p>Central Register of Associations (ZVR) Number: 1758485319</p>
<p>
Email:
<a href="mailto:support@private.coffee">support@private.coffee</a>
</p>
</div>
</div>
</section>
<footer class="bg-primary-gradient">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
>
<h3 class="fs-6 fw-bold">Legal Stuff</h3>
<ul class="list-unstyled">
<li><a href="/legal.html">Legal Notice</a></li>
<li><a href="/privacy.html">Privacy Notice</a></li>
<li><a href="/terms.html">Terms of Service</a></li>
</ul>
</div>
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
></div>
<div
class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last"
>
<div class="fw-bold d-flex align-items-center mb-2">
<span
class="bs-icon-sm bs-icon-circle bs-icon-primary d-flex justify-content-center align-items-center bs-icon me-2"
><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M80,56V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0Zm40,8a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,120,64Zm32,0a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,152,64Zm96,56v8a40,40,0,0,1-37.51,39.91,96.59,96.59,0,0,1-27,40.09H208a8,8,0,0,1,0,16H32a8,8,0,0,1,0-16H56.54A96.3,96.3,0,0,1,24,136V88a8,8,0,0,1,8-8H208A40,40,0,0,1,248,120ZM200,96H40v40a80.27,80.27,0,0,0,45.12,72h69.76A80.27,80.27,0,0,0,200,136Zm32,24a24,24,0,0,0-16-22.62V136a95.78,95.78,0,0,1-1.2,15A24,24,0,0,0,232,128Z"></path></svg></span
><span>Private.coffee</span>
</div>
<p class="text-muted">
Private.coffee is a privacy-focused non-profit association, dedicated
to supporting privacy and digital sovereignty.
</p>
</div>
</div>
<hr />
<div
class="text-muted d-flex justify-content-between align-items-center pt-3"
>
<p class="mb-0">Made with ❤️ and ☕ by Private.coffee</p>
<p class="mb-0"><svg xmlns="http://www.w3.org/2000/svg" width="94" height="20" role="img" aria-label="LGBTIQ+">
<title>LGBTIQ+</title>
<rect rx="3" width="94" height="20" fill="#555"/>
<rect x="37" width="57" height="20" fill="#e05d44"/>
<rect x="46.5" width="47.5" height="20" fill="#fecc00"/>
<rect x="56" width="37" height="20" fill="#61c354"/>
<rect x="65.5" width="27" height="20" fill="#007ec6"/>
<rect x="75" width="17" height="20" fill="#744ca1"/>
<rect x="84.5" width="9.5" height="20" rx="3" ry="3" fill="#8b00ff"/>
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="8">
<text x="18.5" y="15" fill="#fff">LGBTIQ+</text>
</g>
</svg></p>
</div>
</footer>
</body>
</html>

148
main.py
View file

@ -1,148 +0,0 @@
from flask import Flask, render_template, send_from_directory
from jinja2 import TemplateNotFound
import json
import pathlib
import os
import datetime
from argparse import ArgumentParser
from helpers.finances import (
generate_transparency_table,
get_transparency_data,
get_latest_month,
)
app = Flask(__name__)
@app.route("/assets/<path:path>")
def send_assets(path):
return send_from_directory("assets", path)
@app.route("/", defaults={"path": "index"})
@app.route("/<path:path>.html")
def catch_all(path):
try:
kwargs = {}
if app.development_mode:
kwargs.update(
{
"warning": render_template("prod-warning.html"),
}
)
if path in (
"index",
"simple",
):
services = json.loads(
(pathlib.Path(__file__).parent / "data" / "services.json").read_text()
)
kwargs.update(
{
"services": services,
}
)
if path == "membership":
finances = json.loads(
(pathlib.Path(__file__).parent / "data" / "finances.json").read_text()
)
allow_current = app.development_mode
finances_month, finances_year = get_latest_month(finances, allow_current)
finances_period = datetime.date(finances_year, finances_month, 1)
finances_period_str = finances_period.strftime("%B %Y")
finances_table = generate_transparency_table(
get_transparency_data(
finances, finances_year, finances_month, allow_current
)
)
kwargs.update(
{
"finances": finances_table,
"finances_period": finances_period_str,
}
)
if path == "transparency":
finances = json.loads(
(pathlib.Path(__file__).parent / "data" / "finances.json").read_text()
)
finance_data = {}
for year in sorted(finances.keys(), reverse=True):
for month in sorted(finances[year].keys(), reverse=True):
if year not in finance_data:
finance_data[year] = {}
finance_data[year][month] = generate_transparency_table(
get_transparency_data(finances, year, month, True)
)
kwargs.update(
{
"finances": finance_data,
}
)
return render_template(f"{path}.html", **kwargs)
except TemplateNotFound:
return "404 Not Found", 404
@app.route("/metrics/")
def metrics():
finances = json.loads(
(pathlib.Path(__file__).parent / "data" / "finances.json").read_text()
)
balances = get_transparency_data(finances, allow_current=True)["end_balance"]
response = (
"# HELP privatecoffee_balance The balance of the private.coffee account\n"
)
response += "# TYPE privatecoffee_balance gauge\n"
for currency, balance in balances.items():
response += f'privatecoffee_balance{{currency="{currency}"}} {balance}\n'
return response
app.development_mode = False
if os.environ.get("PRIVATECOFFEE_DEV"):
app.development_mode = True
def icon(icon_name):
file = send_from_directory("assets", f"dist/icons/{icon_name}.svg")
try:
file_content = file.response.file.read().decode("utf-8")
except AttributeError:
file_content = file.response.read().decode("utf-8")
return file_content
app.add_template_filter(icon)
if __name__ == "__main__":
parser = ArgumentParser(description="Run the private.coffee web server.")
parser.add_argument("--port", type=int, default=9810)
parser.add_argument("--debug", action="store_true")
parser.add_argument("--dev", action="store_true")
args = parser.parse_args()
app.development_mode = args.dev or app.development_mode
app.run(port=args.port, debug=args.debug)

241
membership.html Normal file
View file

@ -0,0 +1,241 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<!-- This file was created as part of the Private.coffee project
It is licensed under the MIT license
For more information, please visit https://private.coffee -->
<head>
<meta charset="utf8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Membership / Donations - Private.coffee</title>
<link rel="stylesheet" href="/assets/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="/assets/css/base.css" />
</head>
<body>
<nav
class="navbar navbar-expand-md py-3 navbar-light"
id="mainNav"
>
<div class="container">
<div class="row d-lg-flex align-items-lg-center">
<div class="col p-0">
<a href="/"
><img src="/assets/img/logo-inv_grad.svg" style="height: 60px"
/></a>
</div>
<div class="col d-flex">
<a class="navbar-brand d-flex align-items-center" href="/">
<p
class="mb-0"
style="line-height: 1.2rem; color: var(--bs-tertiary-color)"
>
<span class="ps-2 fancy-text-primary"
><span style="color: rgb(35, 35, 35)"
>Private.coffee</span
></span
><br class="that-br" /><span class="ps-2 slogan"
>Empowering Privacy with Open Source</span
>
</p>
</a>
</div>
</div>
<div class="navbar" id="navcol-1">
<ul class="navbar-nav mx-auto">
<li class="nav-item"><a class="nav-link active" href="/index.html">Home</a></li>
<li class="nav-item"><a class="nav-link" href="https://status.private.coffee/">Status</a></li>
</ul><a class="btn btn-primary shadow navbar-btn" role="button" href="/membership.html">JOIN &amp; SUPPORT</a>
</div>
</nav>
<div class="container my-5">
<div class="text-center mb-5">
<h1 class="special-header fancy-text-primary">Membership/Donations</h1>
<p class="lead">
Private.coffee is a non-profit organization dedicated to supporting
privacy and digital sovereignty. We fund our activities and running
infrastructure costs through membership fees. Donations allow us to expand
our services and reach more people.
</p>
</div>
<div class="row">
<div class="col-md-4 mb-4">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title">Membership</h5>
<p class="card-text">
Membership fees help cover the costs of our day-to-day activities,
server infrastructure, domain names, and other running operating
expenses. This allows us to provide services to our members and the
public.
</p>
<p class="card-text">
Membership starts at € 5 / month!
</p>
<a href="https://pcof.fi/join" class="btn btn-primary">
Join us now!
</a>
</div>
</div>
</div>
<div class="col-md-4 mb-4">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title">Bank Donations</h5>
<p class="card-text">
Even if you're not a member, you can still support us by making a
direct donation to our bank account. Your donation will be used to
fund our activities and expand our services.
</p>
<p class="card-text"><b>Account holder:</b> Private.coffee</p>
<p class="card-text"><b>IBAN:</b> AT35 2081 5000 4554 0812</p>
<p class="card-text"><b>BIC:</b> STSPAT2GXXX</p>
</div>
</div>
</div>
<div class="col-md-4 mb-4">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title">Crypto Donations</h5>
<p class="card-text">
While our expenses are generally in fiat currency, we accept
donations in cryptocurrencies, too.
</p>
<p class="card-text">
<b>Bitcoin (BTC):</b>
<code>bc1qnu7r5sed4afacfpgx5za8hsyhaj4rs45dpm26k</code>
</p>
<p class="card-text">
<b>Monero (XMR):</b>
<code
>487Ny4iBk2pKGJwjyYrumFD8xFmrS6jCSXNA8e5EvVJ49GyS54CRDVz514MBnXgNT1EioKYiagHs33sLzUAFj8i3Pwg3AMS</code
>
</p>
<p class="card-text">
<b>Ethereum (ETH):</b> <code>Coming soon&trade;</code>
</p>
<p class="card-text">
If your client supports OpenAlias, you can just send your donation
to <code>private.coffee</code>.
</p>
</div>
</div>
</div>
</div>
<div class="card shadow-sm mt-4">
<div class="card-body">
<h5 class="card-title">Transparency Report for June 2024</h5>
<p class="card-text">
We believe in transparency and accountability. Below is a summary of our
income and expenses for the last month, so you can see how your
donations are being used.
</p>
<div class="table-responsive">
<table class="table table-bordered table-transparency">
<thead class="table-light">
<tr>
<th scope="col">Category</th>
<th class="currency-col" scope="col">Euros (€)</th><th class="currency-col" scope="col">Bitcoin (BTC)</th><th class="currency-col" scope="col">Monero (XMR)</th>
</tr>
</thead>
<tbody>
<tr><td>Account Balance (start of month)</td><td>+ €72.29</td><td>+ 0.000434000 BTC</td><td>+ 0.447661806 XMR</td></tr><tr><td>Membership Fees</td><td>+ €382.42</td><td></td><td></td></tr><tr><td>Server Costs</td><td>- €317.62</td><td></td><td></td></tr><tr><td>Bank Fees</td><td>- €49.05</td><td></td><td></td></tr><tr class="table-secondary"><td><b>Total Income</b></td><td><b>+ €382.42</b></td><td><b>0.000000000 BTC</b></td><td><b>0.000000000 XMR</b></td></tr><tr class="table-secondary"><td><b>Total Expenses</b></td><td><b>- €366.67</b></td><td><b>0.000000000 BTC</b></td><td><b>0.000000000 XMR</b></td></tr><tr class="table-secondary"><td><b>Account Balance (end of month)</b></td><td><b>+ €88.04</b></td><td><b>+ 0.000434000 BTC</b></td><td><b>+ 0.447661806 XMR</b></td></tr>
</tbody>
</table>
</div>
<p class="card-text">
Want to know how we got here? Check out all of our
<a href="/transparency.html">transparency reports</a> for more
information.
</p>
</div>
</div>
<div class="card shadow-sm mt-4">
<div class="card-body">
<h5>Central Register of Associations (ZVR) Number: 1758485319</h5>
<p>
Our statutes can be found in our Git
<a href="https://git.private.coffee/PrivateCoffee/statuten"
>in German (legally binding)</a
>
and
<a
href="https://git.private.coffee/PrivateCoffee/Statuten/src/branch/english"
>in English</a
>.
</p>
<p class="contact-info" id="contact-info">
Interested in joining the association? Reach out via
<a href="mailto:support@private.coffee">email</a> or
<a href="https://matrix.pcof.fi/#/#private.coffee:private.coffee"
>Matrix</a
>
for more information.
</p>
</div>
</div>
</div>
<footer class="bg-primary-gradient">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
>
<h3 class="fs-6 fw-bold">Legal Stuff</h3>
<ul class="list-unstyled">
<li><a href="/legal.html">Legal Notice</a></li>
<li><a href="/privacy.html">Privacy Notice</a></li>
<li><a href="/terms.html">Terms of Service</a></li>
</ul>
</div>
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
></div>
<div
class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last"
>
<div class="fw-bold d-flex align-items-center mb-2">
<span
class="bs-icon-sm bs-icon-circle bs-icon-primary d-flex justify-content-center align-items-center bs-icon me-2"
><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M80,56V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0Zm40,8a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,120,64Zm32,0a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,152,64Zm96,56v8a40,40,0,0,1-37.51,39.91,96.59,96.59,0,0,1-27,40.09H208a8,8,0,0,1,0,16H32a8,8,0,0,1,0-16H56.54A96.3,96.3,0,0,1,24,136V88a8,8,0,0,1,8-8H208A40,40,0,0,1,248,120ZM200,96H40v40a80.27,80.27,0,0,0,45.12,72h69.76A80.27,80.27,0,0,0,200,136Zm32,24a24,24,0,0,0-16-22.62V136a95.78,95.78,0,0,1-1.2,15A24,24,0,0,0,232,128Z"></path></svg></span
><span>Private.coffee</span>
</div>
<p class="text-muted">
Private.coffee is a privacy-focused non-profit association, dedicated
to supporting privacy and digital sovereignty.
</p>
</div>
</div>
<hr />
<div
class="text-muted d-flex justify-content-between align-items-center pt-3"
>
<p class="mb-0">Made with ❤️ and ☕ by Private.coffee</p>
<p class="mb-0"><svg xmlns="http://www.w3.org/2000/svg" width="94" height="20" role="img" aria-label="LGBTIQ+">
<title>LGBTIQ+</title>
<rect rx="3" width="94" height="20" fill="#555"/>
<rect x="37" width="57" height="20" fill="#e05d44"/>
<rect x="46.5" width="47.5" height="20" fill="#fecc00"/>
<rect x="56" width="37" height="20" fill="#61c354"/>
<rect x="65.5" width="27" height="20" fill="#007ec6"/>
<rect x="75" width="17" height="20" fill="#744ca1"/>
<rect x="84.5" width="9.5" height="20" rx="3" ry="3" fill="#8b00ff"/>
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="8">
<text x="18.5" y="15" fill="#fff">LGBTIQ+</text>
</g>
</svg></p>
</div>
</footer>
</body>
</html>

5
metrics.txt Normal file
View file

@ -0,0 +1,5 @@
# HELP privatecoffee_balance The balance of the private.coffee account
# TYPE privatecoffee_balance gauge
privatecoffee_balance{currency="EUR"} 108.04
privatecoffee_balance{currency="BTC"} 0.000434
privatecoffee_balance{currency="XMR"} 0.447661805527

View file

@ -1,5 +1,58 @@
{% extends "base.html" %} {% block title %}Privacy Policy{% endblock %}
{% block content %}
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<!-- This file was created as part of the Private.coffee project
It is licensed under the MIT license
For more information, please visit https://private.coffee -->
<head>
<meta charset="utf8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Privacy Policy - Private.coffee</title>
<link rel="stylesheet" href="/assets/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="/assets/css/base.css" />
</head>
<body>
<nav
class="navbar navbar-expand-md py-3 navbar-light"
id="mainNav"
>
<div class="container">
<div class="row d-lg-flex align-items-lg-center">
<div class="col p-0">
<a href="/"
><img src="/assets/img/logo-inv_grad.svg" style="height: 60px"
/></a>
</div>
<div class="col d-flex">
<a class="navbar-brand d-flex align-items-center" href="/">
<p
class="mb-0"
style="line-height: 1.2rem; color: var(--bs-tertiary-color)"
>
<span class="ps-2 fancy-text-primary"
><span style="color: rgb(35, 35, 35)"
>Private.coffee</span
></span
><br class="that-br" /><span class="ps-2 slogan"
>Empowering Privacy with Open Source</span
>
</p>
</a>
</div>
</div>
<div class="navbar" id="navcol-1">
<ul class="navbar-nav mx-auto">
<li class="nav-item"><a class="nav-link active" href="/index.html">Home</a></li>
<li class="nav-item"><a class="nav-link" href="https://status.private.coffee/">Status</a></li>
</ul><a class="btn btn-primary shadow navbar-btn" role="button" href="/membership.html">JOIN &amp; SUPPORT</a>
</div>
</nav>
<div class="container">
<div class="text-center mb-5">
<h1 class="special-header fancy-text-primary">Privacy Policy</h1>
@ -184,4 +237,57 @@
</p>
</div>
</div>
{% endblock %}
<footer class="bg-primary-gradient">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
>
<h3 class="fs-6 fw-bold">Legal Stuff</h3>
<ul class="list-unstyled">
<li><a href="/legal.html">Legal Notice</a></li>
<li><a href="/privacy.html">Privacy Notice</a></li>
<li><a href="/terms.html">Terms of Service</a></li>
</ul>
</div>
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
></div>
<div
class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last"
>
<div class="fw-bold d-flex align-items-center mb-2">
<span
class="bs-icon-sm bs-icon-circle bs-icon-primary d-flex justify-content-center align-items-center bs-icon me-2"
><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M80,56V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0Zm40,8a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,120,64Zm32,0a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,152,64Zm96,56v8a40,40,0,0,1-37.51,39.91,96.59,96.59,0,0,1-27,40.09H208a8,8,0,0,1,0,16H32a8,8,0,0,1,0-16H56.54A96.3,96.3,0,0,1,24,136V88a8,8,0,0,1,8-8H208A40,40,0,0,1,248,120ZM200,96H40v40a80.27,80.27,0,0,0,45.12,72h69.76A80.27,80.27,0,0,0,200,136Zm32,24a24,24,0,0,0-16-22.62V136a95.78,95.78,0,0,1-1.2,15A24,24,0,0,0,232,128Z"></path></svg></span
><span>Private.coffee</span>
</div>
<p class="text-muted">
Private.coffee is a privacy-focused non-profit association, dedicated
to supporting privacy and digital sovereignty.
</p>
</div>
</div>
<hr />
<div
class="text-muted d-flex justify-content-between align-items-center pt-3"
>
<p class="mb-0">Made with ❤️ and ☕ by Private.coffee</p>
<p class="mb-0"><svg xmlns="http://www.w3.org/2000/svg" width="94" height="20" role="img" aria-label="LGBTIQ+">
<title>LGBTIQ+</title>
<rect rx="3" width="94" height="20" fill="#555"/>
<rect x="37" width="57" height="20" fill="#e05d44"/>
<rect x="46.5" width="47.5" height="20" fill="#fecc00"/>
<rect x="56" width="37" height="20" fill="#61c354"/>
<rect x="65.5" width="27" height="20" fill="#007ec6"/>
<rect x="75" width="17" height="20" fill="#744ca1"/>
<rect x="84.5" width="9.5" height="20" rx="3" ry="3" fill="#8b00ff"/>
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="8">
<text x="18.5" y="15" fill="#fff">LGBTIQ+</text>
</g>
</svg></p>
</div>
</footer>
</body>
</html>

View file

@ -3,4 +3,4 @@
version, please visit
<a href="https://private.coffee" class="alert-link">https://private.coffee</a
>.
</div>
</div>

View file

@ -1,2 +0,0 @@
flask
jinja2

110
simple.html Normal file
View file

@ -0,0 +1,110 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Private.coffee</title>
</head>
<body>
<div style="font-family: Arial, sans-serif; background-color: #f2f2f2; color: #333; line-height: 1.6; padding: 20px; max-width: 600px; margin: auto;">
<h2 style="color: #333;">Welcome to Private.coffee</h2>
<p>Thanks for using our Element instance! Now, why don't you join our rooms?</p>
<ul style="list-style: none; padding: 0;">
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://element.private.coffee/#/#coffeespace:private.coffee">#coffeespace:private.coffee</a> - The Private.coffee Space, containing all rooms</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://element.private.coffee/#/#private.coffee:private.coffee">#private.coffee:private.coffee</a> - General support for our services</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://element.private.coffee/#/#matrix:private.coffee">#matrix:private.coffee</a> - Support for our Matrix server</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://element.private.coffee/#/#coffeebreak:private.coffee">#coffeebreak:private.coffee</a> - ☕ Coffee Break ☕ - our off-topic room</li>
</ul>
<hr>
<p>Private.coffee operates a collection of services that respect your privacy, here are some others:</p>
<ul style="list-style: none; padding: 0;">
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://cryptpad.private.coffee">CryptPad</a> - Private, encrypted, real-time collaborative editor.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://piped.private.coffee">Piped / Invidious</a> - Watch YouTube videos without Google tracking.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://transfer.coffee">Transfer.coffee</a> - Transfer files securely using peer-to-peer connections.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://myip.coffee">MyIP.Coffee</a> - Check your IP address.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://cuddly.space">Mastodon</a> - Mastodon is a decentralized social network.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://git.private.coffee">Forgejo</a> - Forgejo is our in-house Git forge.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://bbb.private.coffee">BigBlueButton</a> - BigBlueButton is an open-source video conferencing system.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://hedgedoc.private.coffee">HedgeDoc</a> - HedgeDoc is an open-source collaborative markdown editor.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://redlib.private.coffee">redlib</a> - redlib is a privacy-friendly alternative front-end to Reddit.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://alltube.private.coffee">AllTube</a> - Download videos from YouTube, Vimeo, and more.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://structables.private.coffee">Structables</a> - Browse Instructables without being tracked.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://translate.private.coffee">LibreTranslate</a> - LibreTranslate is a self-hosted translation service powered by Argos Translate.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://wishthis.private.coffee">wishthis</a> - wishthis is a service for creating wishlists.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://penpot.private.coffee">Penpot</a> - Penpot is an open-source design and prototyping platform.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://pcof.fi">YOURLS</a> - URL shortener for creating handy links.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://rallly.private.coffee">Rallly</a> - Rallly is a free collaborative scheduling service for voting and polls.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://librey.private.coffee">LibreY</a> - Privacy-friendly metasearch engine.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://overleaf.private.coffee">Overleaf</a> - Overleaf is an online LaTeX editor for writing and sharing documents.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://gothub.private.coffee">GotHub</a> - Alternative GitHub interface that respects privacy.</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://binternet.private.coffee">Binternet</a> - Binternet is a privacy-friendly alternative front-end to Pinterest.</li>
</ul>
<p>For hosting inquiries for privacy-related, social, or wholesome projects, <a href="mailto:support@private.coffee" style="color: #1a5dab; text-decoration: none;">get in touch</a>!</p>
</div>
</body>
</html>

View file

@ -1,186 +0,0 @@
{% extends "base.html" %} {% block title %}Home{% endblock %} {% block content
%}
<header class="bg-primary-gradient">
<div class="container pt-4 pt-xl-5 pb-4 pb-xl-5">
<div class="row gy-5 pt-5">
<div class="col-md-8 col-xl-6 text-center text-md-start mx-auto">
<div class="text-center">
<h2>Empowering Privacy with Open Source</h2>
</div>
<p class="text-center special-header fancy-text-primary mb-0" style="font-weight: 500;">Private.coffee</p>
</div>
<div class="col-12 col-lg-10 mx-auto justify-content-center d-flex"><img class="mx-auto" src="/assets/img/logo-inv_grad.svg" style="max-width: 400px;width: 80vw;"></div>
</div>
</div>
</header>
<section class="bg-white">
<div class="container bg-white py-5">
<div class="row">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<p class="fw-bold mb-2 text-primary">Our self-hosted Services</p>
<h3 class="fw-bold">
Private.coffee provides a collection of services that respect your
privacy.
</h3>
</div>
</div>
<div class="py-5 p-lg-5">
<div
class="row row-cols-1 row-cols-md-2 row-cols-lg-3 mx-auto"
style="max-width: 1200px"
>
{% for service in services.services %} {% if not
service.exclude_from_index %}
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
{% if service.icon %}
<div
class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon"
style="top: 1rem; right: 1rem; position: absolute"
>
{{ service.icon | icon | safe }}
</div>
{% endif %}
<h5 class="fw-bold card-title">{{ service.name }}</h5>
<p class="text-muted card-text mb-4">
{{ service.long_description }}
</p>
{% for link in service.links %} {% if link.alternatives %}
<div class="dropdown">
<div class="btn btn-primary shadow">
<a class="main-link" href="{{ link.url }}">
{{ link.name }}
</a>
<div class="dropdown-toggle-area">&#9660;</div>
</div>
<div class="dropdown-content">
{% for alternative in link.alternatives %}
<a href="{{ alternative.url }}">{{ alternative.name }}</a>
{% endfor %}
</div>
</div>
{% else %}
<a
class="btn btn-primary shadow w-100 text-center"
href="{{ link.url }}"
>{{ link.name }}</a
>
{% endif %} {% endfor %}
</div>
</div>
</div>
{% endif %} {% endfor %}
</div>
</div>
</div>
</section>
<section class="bg-primary-gradient">
<div class="container py-5">
<div class="row align-items-center">
<div class="col">
<p class="text-end special-header fancy-text-primary mb-0">Privacy</p>
</div>
<div class="col">
<p class="text-start mb-1" style="font-size: 1.6rem">
from the <strong>community</strong>
</p>
<p class="text-start mb-0" style="font-size: 1.6rem">
for the <strong>community</strong>
</p>
</div>
</div>
<div class="mx-auto" style="max-width: 900px">
<div class="row row-cols-1 row-cols-md-2 d-flex justify-content-center">
<div class="col mb-4">
<div class="card bg-primary-subtle">
<div class="card-body text-center px-4 py-5 px-md-5">
<p class="fw-bold text-primary card-text mb-2">Join or donate</p>
<h5 class="fw-bold card-title mb-3">
Be a part of the open source community!
</h5>
<a class="btn btn-primary btn-sm" href="/membership.html"
>Learn more</a
>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card bg-secondary-subtle">
<div class="card-body text-center px-4 py-5 px-md-5">
<p class="fw-bold text-secondary card-text mb-2">
Private Hosting
</p>
<h5 class="fw-bold card-title mb-3">
Interested in Hosting Services?
</h5>
<a
class="btn btn-secondary btn-sm"
href="mailto:support@private.coffee"
>Get in touch</a
>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="py-5">
<div class="container">
<div class="row mb-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<p class="fw-bold mb-2 text-primary">Contacts</p>
<h2 class="fw-bold">How you can reach us</h2>
</div>
</div>
<div class="row d-flex justify-content-center">
<div
class="col-md-4 col-xl-4 d-flex justify-content-center justify-content-xl-start"
>
<div
class="d-flex flex-wrap flex-md-column justify-content-md-start align-items-md-start h-100"
>
<div class="d-flex align-items-center p-3">
<div
class="bs-icon-md bs-icon-circle bs-icon-primary shadow d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block bs-icon bs-icon-md"
>
{{ "envelope" | icon | safe }}
</div>
<div class="px-2">
<h6 class="fw-bold mb-0">Email</h6>
<p class="text-muted mb-0">support@private.coffee</p>
</div>
</div>
</div>
</div>
</div>
<div class="row d-flex justify-content-center">
<div
class="col-md-4 col-xl-4 d-flex justify-content-center justify-content-xl-start"
>
<div
class="d-flex flex-wrap flex-md-column justify-content-md-start align-items-md-start h-100"
>
<div class="d-flex align-items-center p-3">
<div
class="bs-icon-md bs-icon-circle bs-icon-primary shadow d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block bs-icon bs-icon-md"
>
{{ "matrix-logo" | icon | safe }}
</div>
<div class="px-2">
<h6 class="fw-bold mb-0">Matrix</h6>
<p class="text-muted mb-0">
<a
href="https://matrix.pcof.fi/#/#private.coffee:private.coffee"
>#private.coffee:private.coffee</a
>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
{% endblock %}

View file

@ -1,41 +0,0 @@
{% extends "base.html" %}
{% block title %}Legal Notice{% endblock %}
{% block content %}
<section>
<div class="container py-5">
<div class="row align-items-center">
<div class="col">
<p class="text-end special-header fancy-text-primary mb-0">
Legal Notice
</p>
</div>
<div class="col">
<p class="text-start mb-1" style="font-size: 1.6rem">
from the <strong>community</strong>
</p>
<p class="text-start mb-0" style="font-size: 1.6rem">
for the <strong>community</strong>
</p>
</div>
</div>
<div class="container">
<p>This is a legal notice for the website private.coffee</p>
<p>The website private.coffee is run by the following entity:</p>
<address>
Private.coffee &dash; Verein zur Förderung von Privatsphäre und
digitaler Souver&auml;nit&auml;t<br />
c/o Klaus-Uwe Mitterer<br />
Gartengasse 22/7/3<br />
8010 Graz<br />
Austria<br />
</address>
<p>Central Register of Associations (ZVR) Number: 1758485319</p>
<p>
Email:
<a href="mailto:support@private.coffee">support@private.coffee</a>
</p>
</div>
</div>
</section>
{% endblock %}

View file

@ -1,123 +0,0 @@
{% extends "base.html" %} {% block title %}Membership / Donations{% endblock %}
{% block content %}
<div class="container my-5">
<div class="text-center mb-5">
<h1 class="special-header fancy-text-primary">Membership/Donations</h1>
<p class="lead">
Private.coffee is a non-profit organization dedicated to supporting
privacy and digital sovereignty. We fund our activities and running
infrastructure costs through membership fees. Donations allow us to expand
our services and reach more people.
</p>
</div>
<div class="row">
<div class="col-md-4 mb-4">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title">Membership</h5>
<p class="card-text">
Membership fees help cover the costs of our day-to-day activities,
server infrastructure, domain names, and other running operating
expenses. This allows us to provide services to our members and the
public.
</p>
<p class="card-text">
Membership starts at € 5 / month!
</p>
<a href="https://pcof.fi/join" class="btn btn-primary">
Join us now!
</a>
</div>
</div>
</div>
<div class="col-md-4 mb-4">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title">Bank Donations</h5>
<p class="card-text">
Even if you're not a member, you can still support us by making a
direct donation to our bank account. Your donation will be used to
fund our activities and expand our services.
</p>
<p class="card-text"><b>Account holder:</b> Private.coffee</p>
<p class="card-text"><b>IBAN:</b> AT35 2081 5000 4554 0812</p>
<p class="card-text"><b>BIC:</b> STSPAT2GXXX</p>
</div>
</div>
</div>
<div class="col-md-4 mb-4">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title">Crypto Donations</h5>
<p class="card-text">
While our expenses are generally in fiat currency, we accept
donations in cryptocurrencies, too.
</p>
<p class="card-text">
<b>Bitcoin (BTC):</b>
<code>bc1qnu7r5sed4afacfpgx5za8hsyhaj4rs45dpm26k</code>
</p>
<p class="card-text">
<b>Monero (XMR):</b>
<code
>487Ny4iBk2pKGJwjyYrumFD8xFmrS6jCSXNA8e5EvVJ49GyS54CRDVz514MBnXgNT1EioKYiagHs33sLzUAFj8i3Pwg3AMS</code
>
</p>
<p class="card-text">
<b>Ethereum (ETH):</b> <code>Coming soon&trade;</code>
</p>
<p class="card-text">
If your client supports OpenAlias, you can just send your donation
to <code>private.coffee</code>.
</p>
</div>
</div>
</div>
</div>
<div class="card shadow-sm mt-4">
<div class="card-body">
<h5 class="card-title">Transparency Report for {{ finances_period }}</h5>
<p class="card-text">
We believe in transparency and accountability. Below is a summary of our
income and expenses for the last month, so you can see how your
donations are being used.
</p>
<div class="table-responsive">{{ finances|safe }}</div>
<p class="card-text">
Want to know how we got here? Check out all of our
<a href="/transparency.html">transparency reports</a> for more
information.
</p>
</div>
</div>
<div class="card shadow-sm mt-4">
<div class="card-body">
<h5>Central Register of Associations (ZVR) Number: 1758485319</h5>
<p>
Our statutes can be found in our Git
<a href="https://git.private.coffee/PrivateCoffee/statuten"
>in German (legally binding)</a
>
and
<a
href="https://git.private.coffee/PrivateCoffee/Statuten/src/branch/english"
>in English</a
>.
</p>
<p class="contact-info" id="contact-info">
Interested in joining the association? Reach out via
<a href="mailto:support@private.coffee">email</a> or
<a href="https://matrix.pcof.fi/#/#private.coffee:private.coffee"
>Matrix</a
>
for more information.
</p>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,30 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Private.coffee</title>
</head>
<body>
<div style="font-family: Arial, sans-serif; background-color: #f2f2f2; color: #333; line-height: 1.6; padding: 20px; max-width: 600px; margin: auto;">
<h2 style="color: #333;">Welcome to Private.coffee</h2>
<p>Thanks for using our Element instance! Now, why don't you join our rooms?</p>
<ul style="list-style: none; padding: 0;">
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://element.private.coffee/#/#coffeespace:private.coffee">#coffeespace:private.coffee</a> - The Private.coffee Space, containing all rooms</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://element.private.coffee/#/#private.coffee:private.coffee">#private.coffee:private.coffee</a> - General support for our services</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://element.private.coffee/#/#matrix:private.coffee">#matrix:private.coffee</a> - Support for our Matrix server</li>
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="https://element.private.coffee/#/#coffeebreak:private.coffee">#coffeebreak:private.coffee</a> - ☕ Coffee Break ☕ - our off-topic room</li>
</ul>
<hr>
<p>Private.coffee operates a collection of services that respect your privacy, here are some others:</p>
<ul style="list-style: none; padding: 0;">
{% for service in services.services %}
{% if not service.exclude_from_simple %}
<li style="padding: 8px 0;"><a style="color: #1a5dab; text-decoration: none;" href="{{ service.url }}">{{ service.name }}</a> - {{ service.short_description }}</li>
{% endif %}
{% endfor %}
</ul>
<p>For hosting inquiries for privacy-related, social, or wholesome projects, <a href="mailto:support@private.coffee" style="color: #1a5dab; text-decoration: none;">get in touch</a>!</p>
</div>
</body>
</html>

View file

@ -1,25 +0,0 @@
{% extends "base.html" %} {% block title %}Membership / Donations{% endblock %}
{% block content %}
<div class="container my-5">
<div class="text-center mb-5">
<h1 class="special-header fancy-text-primary">Transparency</h1>
<p class="lead">
Private.coffee is funded by its members and donations. We believe in
transparency and accountability. Below you can find financial reports for
each month since our inception.
</p>
</div>
{% for year, year_data in finances.items() %}
{% for month, month_data in year_data.items() %}
<div class="card shadow-sm mt-4">
<div class="card-body">
<h5 class="card-title">Transparency Report for {{ month }}/{{ year }}</h5>
<div class="table-responsive">{{ month_data|safe }}</div>
</div>
</div>
{% endfor %}
{% endfor %}
</div>
{% endblock %}

View file

@ -1,6 +1,58 @@
{% extends "base.html" %}
{% block title %}Terms of Service{% endblock %}
{% block content %}
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<!-- This file was created as part of the Private.coffee project
It is licensed under the MIT license
For more information, please visit https://private.coffee -->
<head>
<meta charset="utf8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Terms of Service - Private.coffee</title>
<link rel="stylesheet" href="/assets/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="/assets/css/base.css" />
</head>
<body>
<nav
class="navbar navbar-expand-md py-3 navbar-light"
id="mainNav"
>
<div class="container">
<div class="row d-lg-flex align-items-lg-center">
<div class="col p-0">
<a href="/"
><img src="/assets/img/logo-inv_grad.svg" style="height: 60px"
/></a>
</div>
<div class="col d-flex">
<a class="navbar-brand d-flex align-items-center" href="/">
<p
class="mb-0"
style="line-height: 1.2rem; color: var(--bs-tertiary-color)"
>
<span class="ps-2 fancy-text-primary"
><span style="color: rgb(35, 35, 35)"
>Private.coffee</span
></span
><br class="that-br" /><span class="ps-2 slogan"
>Empowering Privacy with Open Source</span
>
</p>
</a>
</div>
</div>
<div class="navbar" id="navcol-1">
<ul class="navbar-nav mx-auto">
<li class="nav-item"><a class="nav-link active" href="/index.html">Home</a></li>
<li class="nav-item"><a class="nav-link" href="https://status.private.coffee/">Status</a></li>
</ul><a class="btn btn-primary shadow navbar-btn" role="button" href="/membership.html">JOIN &amp; SUPPORT</a>
</div>
</nav>
<div class="container">
<div class="text-center mb-5">
<h1 class="special-header fancy-text-primary">Terms of Service</h1>
@ -152,4 +204,57 @@
</p>
</div>
</div>
{% endblock %}
<footer class="bg-primary-gradient">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
>
<h3 class="fs-6 fw-bold">Legal Stuff</h3>
<ul class="list-unstyled">
<li><a href="/legal.html">Legal Notice</a></li>
<li><a href="/privacy.html">Privacy Notice</a></li>
<li><a href="/terms.html">Terms of Service</a></li>
</ul>
</div>
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
></div>
<div
class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last"
>
<div class="fw-bold d-flex align-items-center mb-2">
<span
class="bs-icon-sm bs-icon-circle bs-icon-primary d-flex justify-content-center align-items-center bs-icon me-2"
><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M80,56V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0Zm40,8a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,120,64Zm32,0a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,152,64Zm96,56v8a40,40,0,0,1-37.51,39.91,96.59,96.59,0,0,1-27,40.09H208a8,8,0,0,1,0,16H32a8,8,0,0,1,0-16H56.54A96.3,96.3,0,0,1,24,136V88a8,8,0,0,1,8-8H208A40,40,0,0,1,248,120ZM200,96H40v40a80.27,80.27,0,0,0,45.12,72h69.76A80.27,80.27,0,0,0,200,136Zm32,24a24,24,0,0,0-16-22.62V136a95.78,95.78,0,0,1-1.2,15A24,24,0,0,0,232,128Z"></path></svg></span
><span>Private.coffee</span>
</div>
<p class="text-muted">
Private.coffee is a privacy-focused non-profit association, dedicated
to supporting privacy and digital sovereignty.
</p>
</div>
</div>
<hr />
<div
class="text-muted d-flex justify-content-between align-items-center pt-3"
>
<p class="mb-0">Made with ❤️ and ☕ by Private.coffee</p>
<p class="mb-0"><svg xmlns="http://www.w3.org/2000/svg" width="94" height="20" role="img" aria-label="LGBTIQ+">
<title>LGBTIQ+</title>
<rect rx="3" width="94" height="20" fill="#555"/>
<rect x="37" width="57" height="20" fill="#e05d44"/>
<rect x="46.5" width="47.5" height="20" fill="#fecc00"/>
<rect x="56" width="37" height="20" fill="#61c354"/>
<rect x="65.5" width="27" height="20" fill="#007ec6"/>
<rect x="75" width="17" height="20" fill="#744ca1"/>
<rect x="84.5" width="9.5" height="20" rx="3" ry="3" fill="#8b00ff"/>
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="8">
<text x="18.5" y="15" fill="#fff">LGBTIQ+</text>
</g>
</svg></p>
</div>
</footer>
</body>
</html>

200
transparency.html Normal file
View file

@ -0,0 +1,200 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<!-- This file was created as part of the Private.coffee project
It is licensed under the MIT license
For more information, please visit https://private.coffee -->
<head>
<meta charset="utf8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, shrink-to-fit=no"
/>
<title>Membership / Donations - Private.coffee</title>
<link rel="stylesheet" href="/assets/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="/assets/css/base.css" />
</head>
<body>
<nav
class="navbar navbar-expand-md py-3 navbar-light"
id="mainNav"
>
<div class="container">
<div class="row d-lg-flex align-items-lg-center">
<div class="col p-0">
<a href="/"
><img src="/assets/img/logo-inv_grad.svg" style="height: 60px"
/></a>
</div>
<div class="col d-flex">
<a class="navbar-brand d-flex align-items-center" href="/">
<p
class="mb-0"
style="line-height: 1.2rem; color: var(--bs-tertiary-color)"
>
<span class="ps-2 fancy-text-primary"
><span style="color: rgb(35, 35, 35)"
>Private.coffee</span
></span
><br class="that-br" /><span class="ps-2 slogan"
>Empowering Privacy with Open Source</span
>
</p>
</a>
</div>
</div>
<div class="navbar" id="navcol-1">
<ul class="navbar-nav mx-auto">
<li class="nav-item"><a class="nav-link active" href="/index.html">Home</a></li>
<li class="nav-item"><a class="nav-link" href="https://status.private.coffee/">Status</a></li>
</ul><a class="btn btn-primary shadow navbar-btn" role="button" href="/membership.html">JOIN &amp; SUPPORT</a>
</div>
</nav>
<div class="container my-5">
<div class="text-center mb-5">
<h1 class="special-header fancy-text-primary">Transparency</h1>
<p class="lead">
Private.coffee is funded by its members and donations. We believe in
transparency and accountability. Below you can find financial reports for
each month since our inception.
</p>
</div>
<div class="card shadow-sm mt-4">
<div class="card-body">
<h5 class="card-title">Transparency Report for 7/2024</h5>
<div class="table-responsive">
<table class="table table-bordered table-transparency">
<thead class="table-light">
<tr>
<th scope="col">Category</th>
<th class="currency-col" scope="col">Euros (€)</th><th class="currency-col" scope="col">Bitcoin (BTC)</th><th class="currency-col" scope="col">Monero (XMR)</th>
</tr>
</thead>
<tbody>
<tr><td>Account Balance (start of month)</td><td>+ €72.29</td><td>+ 0.000434000 BTC</td><td>+ 0.447661806 XMR</td></tr><tr><td>Membership Fees</td><td>+ €382.42</td><td></td><td></td></tr><tr><td>Server Costs</td><td>- €317.62</td><td></td><td></td></tr><tr><td>Bank Fees</td><td>- €49.05</td><td></td><td></td></tr><tr class="table-secondary"><td><b>Total Income</b></td><td><b>+ €382.42</b></td><td><b>0.000000000 BTC</b></td><td><b>0.000000000 XMR</b></td></tr><tr class="table-secondary"><td><b>Total Expenses</b></td><td><b>- €366.67</b></td><td><b>0.000000000 BTC</b></td><td><b>0.000000000 XMR</b></td></tr><tr class="table-secondary"><td><b>Account Balance (end of month)</b></td><td><b>+ €88.04</b></td><td><b>+ 0.000434000 BTC</b></td><td><b>+ 0.447661806 XMR</b></td></tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="card shadow-sm mt-4">
<div class="card-body">
<h5 class="card-title">Transparency Report for 6/2024</h5>
<div class="table-responsive">
<table class="table table-bordered table-transparency">
<thead class="table-light">
<tr>
<th scope="col">Category</th>
<th class="currency-col" scope="col">Euros (€)</th><th class="currency-col" scope="col">Bitcoin (BTC)</th><th class="currency-col" scope="col">Monero (XMR)</th>
</tr>
</thead>
<tbody>
<tr><td>Account Balance (start of month)</td><td>+ €72.29</td><td>+ 0.000434000 BTC</td><td>+ 0.447661806 XMR</td></tr><tr><td>Membership Fees</td><td>+ €382.42</td><td></td><td></td></tr><tr><td>Server Costs</td><td>- €317.62</td><td></td><td></td></tr><tr><td>Bank Fees</td><td>- €49.05</td><td></td><td></td></tr><tr class="table-secondary"><td><b>Total Income</b></td><td><b>+ €382.42</b></td><td><b>0.000000000 BTC</b></td><td><b>0.000000000 XMR</b></td></tr><tr class="table-secondary"><td><b>Total Expenses</b></td><td><b>- €366.67</b></td><td><b>0.000000000 BTC</b></td><td><b>0.000000000 XMR</b></td></tr><tr class="table-secondary"><td><b>Account Balance (end of month)</b></td><td><b>+ €88.04</b></td><td><b>+ 0.000434000 BTC</b></td><td><b>+ 0.447661806 XMR</b></td></tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="card shadow-sm mt-4">
<div class="card-body">
<h5 class="card-title">Transparency Report for 5/2024</h5>
<div class="table-responsive">
<table class="table table-bordered table-transparency">
<thead class="table-light">
<tr>
<th scope="col">Category</th>
<th class="currency-col" scope="col">Euros (€)</th><th class="currency-col" scope="col">Bitcoin (BTC)</th><th class="currency-col" scope="col">Monero (XMR)</th>
</tr>
</thead>
<tbody>
<tr><td>Account Balance (start of month)</td><td>+ €112.33</td><td>0.000000000 BTC</td><td>0.000000000 XMR</td></tr><tr><td>Membership Fees</td><td>+ €390.00</td><td></td><td></td></tr><tr><td>Donations</td><td></td><td>+ 0.000434000 BTC</td><td>+ 0.447661806 XMR</td></tr><tr><td>Server Costs*</td><td>- €430.04</td><td></td><td></td></tr><tr class="table-secondary"><td><b>Total Income</b></td><td><b>+ €390.00</b></td><td><b>+ 0.000434000 BTC</b></td><td><b>+ 0.447661806 XMR</b></td></tr><tr class="table-secondary"><td><b>Total Expenses</b></td><td><b>- €430.04</b></td><td><b>0.000000000 BTC</b></td><td><b>0.000000000 XMR</b></td></tr><tr class="table-secondary"><td><b>Account Balance (end of month)</b></td><td><b>+ €72.29</b></td><td><b>+ 0.000434000 BTC</b></td><td><b>+ 0.447661806 XMR</b></td></tr>
</tbody>
</table>
<p><b>Notes:</b></p><ul><li>Server Costs: Includes setup costs and two monthly payments for new server</li></ul></div>
</div>
</div>
<div class="card shadow-sm mt-4">
<div class="card-body">
<h5 class="card-title">Transparency Report for 4/2024</h5>
<div class="table-responsive">
<table class="table table-bordered table-transparency">
<thead class="table-light">
<tr>
<th scope="col">Category</th>
<th class="currency-col" scope="col">Euros (€)</th>
</tr>
</thead>
<tbody>
<tr><td>Account Balance (start of month)</td><td>€0.00</td></tr><tr><td>Membership Fees</td><td>+ €365.00</td></tr><tr><td>Server Costs</td><td>- €216.57</td></tr><tr><td>Administrative Expenses*</td><td>- €36.10</td></tr><tr class="table-secondary"><td><b>Total Income</b></td><td><b>+ €365.00</b></td></tr><tr class="table-secondary"><td><b>Total Expenses</b></td><td><b>- €252.67</b></td></tr><tr class="table-secondary"><td><b>Account Balance (end of month)</b></td><td><b>+ €112.33</b></td></tr>
</tbody>
</table>
<p><b>Notes:</b></p><ul><li>Administrative Expenses: Administrative fee for the formation of the association</li></ul></div>
</div>
</div>
</div>
<footer class="bg-primary-gradient">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
>
<h3 class="fs-6 fw-bold">Legal Stuff</h3>
<ul class="list-unstyled">
<li><a href="/legal.html">Legal Notice</a></li>
<li><a href="/privacy.html">Privacy Notice</a></li>
<li><a href="/terms.html">Terms of Service</a></li>
</ul>
</div>
<div
class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column"
></div>
<div
class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last"
>
<div class="fw-bold d-flex align-items-center mb-2">
<span
class="bs-icon-sm bs-icon-circle bs-icon-primary d-flex justify-content-center align-items-center bs-icon me-2"
><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M80,56V24a8,8,0,0,1,16,0V56a8,8,0,0,1-16,0Zm40,8a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,120,64Zm32,0a8,8,0,0,0,8-8V24a8,8,0,0,0-16,0V56A8,8,0,0,0,152,64Zm96,56v8a40,40,0,0,1-37.51,39.91,96.59,96.59,0,0,1-27,40.09H208a8,8,0,0,1,0,16H32a8,8,0,0,1,0-16H56.54A96.3,96.3,0,0,1,24,136V88a8,8,0,0,1,8-8H208A40,40,0,0,1,248,120ZM200,96H40v40a80.27,80.27,0,0,0,45.12,72h69.76A80.27,80.27,0,0,0,200,136Zm32,24a24,24,0,0,0-16-22.62V136a95.78,95.78,0,0,1-1.2,15A24,24,0,0,0,232,128Z"></path></svg></span
><span>Private.coffee</span>
</div>
<p class="text-muted">
Private.coffee is a privacy-focused non-profit association, dedicated
to supporting privacy and digital sovereignty.
</p>
</div>
</div>
<hr />
<div
class="text-muted d-flex justify-content-between align-items-center pt-3"
>
<p class="mb-0">Made with ❤️ and ☕ by Private.coffee</p>
<p class="mb-0"><svg xmlns="http://www.w3.org/2000/svg" width="94" height="20" role="img" aria-label="LGBTIQ+">
<title>LGBTIQ+</title>
<rect rx="3" width="94" height="20" fill="#555"/>
<rect x="37" width="57" height="20" fill="#e05d44"/>
<rect x="46.5" width="47.5" height="20" fill="#fecc00"/>
<rect x="56" width="37" height="20" fill="#61c354"/>
<rect x="65.5" width="27" height="20" fill="#007ec6"/>
<rect x="75" width="17" height="20" fill="#744ca1"/>
<rect x="84.5" width="9.5" height="20" rx="3" ry="3" fill="#8b00ff"/>
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="8">
<text x="18.5" y="15" fill="#fff">LGBTIQ+</text>
</g>
</svg></p>
</div>
</footer>
</body>
</html>