Metadata-Version: 2.4
Name: an-website
Version: 26.3.14
Summary: #1 Website in the Worlds
Home-page: https://github.com/asozialesnetzwerk/an-website
Author: Das Asoziale Netzwerk
Author-email: contact@asozial.org
License: AGPL-3.0-or-later
Platform: OS Independent
Classifier: Development Status :: 5 - Production/Stable
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Typing :: Typed
Requires-Python: >=3.14
Description-Content-Type: text/markdown
License-File: LICENSE.md
Requires-Dist: accept-types==0.4.1
Requires-Dist: aiodns==4.0.0; python_version >= "3.10"
Requires-Dist: aiohappyeyeballs==2.6.1; python_version >= "3.9"
Requires-Dist: aiohttp[speedups]==3.13.3; python_version >= "3.9"
Requires-Dist: aiosignal==1.4.0; python_version >= "3.9"
Requires-Dist: ansi2html==1.9.2; python_version >= "3.7"
Requires-Dist: attrs==25.4.0; python_version >= "3.9"
Requires-Dist: beautifulsoup4==4.14.3; python_full_version >= "3.7.0"
Requires-Dist: blake3==1.0.8; python_version >= "3.8"
Requires-Dist: brotli==1.2.0
Requires-Dist: certifi==2026.2.25; python_version >= "3.7"
Requires-Dist: cffi==2.0.0; python_version >= "3.9"
Requires-Dist: defity==0.7.0; python_version >= "3.10"
Requires-Dist: defusedxml==0.7.1; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3, 3.4"
Requires-Dist: dill==0.4.1; python_version >= "3.9"
Requires-Dist: dunamai==1.26.0; python_version >= "3.5"
Requires-Dist: ecs-logging==2.3.0; python_version >= "3.8"
Requires-Dist: elastic-apm==6.25.0; python_version >= "3.6" and python_version < "4"
Requires-Dist: elastic-enterprise-search==8.18.0; python_version >= "3.6"
Requires-Dist: elastic-transport==8.17.1; python_version >= "3.8"
Requires-Dist: elasticsearch[async]==8.19.3; python_version >= "3.8"
Requires-Dist: emoji==2.15.0; python_version >= "3.8"
Requires-Dist: frozenlist==1.8.0; python_version >= "3.9"
Requires-Dist: funcparserlib==1.0.1; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6"
Requires-Dist: get-version==3.5.5; python_version >= "3.9"
Requires-Dist: hangman-solver-rs==0.6.9; python_version >= "3.12"
Requires-Dist: hiredis==3.3.0; python_version >= "3.8"
Requires-Dist: html2text==2025.4.15; python_version >= "3.9"
Requires-Dist: hy==1.2.0; python_version < "3.15" and python_version >= "3.9"
Requires-Dist: hyrule==1.0.1
Requires-Dist: idna==3.11; python_version >= "3.8"
Requires-Dist: jsonpickle==4.1.1; python_version >= "3.8"
Requires-Dist: lxml==6.0.2; python_version >= "3.8"
Requires-Dist: multidict==6.7.1; python_version >= "3.9"
Requires-Dist: openmoji-dist==16.0.0
Requires-Dist: orjson==3.11.7; python_version >= "3.10"
Requires-Dist: packaging==26.0; python_version >= "3.8"
Requires-Dist: pillow==12.1.1; python_version >= "3.10"
Requires-Dist: pillow-jxl-plugin==1.3.7; python_version >= "3.9"
Requires-Dist: propcache==0.4.1; python_version >= "3.9"
Requires-Dist: pycares==5.0.1; python_version >= "3.9"
Requires-Dist: pycparser==3.0; python_version >= "3.10"
Requires-Dist: pycryptodome==3.23.0; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6"
Requires-Dist: pycurl==7.45.2; python_version >= "3.5"
Requires-Dist: pyjwt==2.12.1; python_version >= "3.9"
Requires-Dist: pysocks==1.7.1; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
Requires-Dist: python-dateutil==2.9.0.post0; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2"
Requires-Dist: python-geoip-geolite2-yplan==2019.1224
Requires-Dist: python-geoip-yplan==1.2
Requires-Dist: pyyaml==6.0.3; python_version >= "3.8"
Requires-Dist: qoi-rs[pillow]==4.0.3; python_version >= "3.12"
Requires-Dist: rapidfuzz==3.14.3; python_version >= "3.10"
Requires-Dist: redis[hiredis]==5.3.1; python_version >= "3.8"
Requires-Dist: regex==2026.2.28; python_version >= "3.10"
Requires-Dist: setproctitle==1.3.7; python_version >= "3.8"
Requires-Dist: six==1.17.0; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2"
Requires-Dist: soupsieve==2.8.3; python_version >= "3.9"
Requires-Dist: tornado==6.5.5; python_version >= "3.9"
Requires-Dist: typed-stream==0.155.1; python_version >= "3.10"
Requires-Dist: typing-extensions==4.15.0; python_version >= "3.9"
Requires-Dist: tzdata==2025.3; python_version >= "2"
Requires-Dist: ultradict==0.0.6; python_version >= "3.8"
Requires-Dist: urllib3==2.6.3; python_version >= "3.9"
Requires-Dist: uvloop==0.22.1; python_full_version >= "3.8.1"
Requires-Dist: wrapt==2.1.2; python_version >= "3.9"
Requires-Dist: yarl==1.23.0; python_version >= "3.10"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license
Dynamic: license-file
Dynamic: platform
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# Webseite des AN

![License](https://img.shields.io/pypi/l/an-website?label=License)
![Python](https://img.shields.io/pypi/pyversions/an-website?label=Python)
![Implementation](https://img.shields.io/pypi/implementation/an-website?label=Implementation)
[![PyPI](https://img.shields.io/pypi/v/an-website.svg?label=PyPI)](https://pypi.org/project/an-website)\
[![Style: Black](https://img.shields.io/badge/Code%20Style-Black-000000.svg)](https://github.com/psf/black)
[![Imports: isort](https://img.shields.io/badge/Imports-isort-1674b1.svg?labelColor=ef8336)](https://pycqa.github.io/isort)
[![Coverage](https://asozialesnetzwerk.github.io/an-website/coverage/badge.svg)](https://asozialesnetzwerk.github.io/an-website/coverage)
[![Lines of Code](https://img.shields.io/endpoint?url=https%3A%2F%2Ftokei.kojix2.net%2Fbadge%2Fgithub%2Fasozialesnetzwerk%2Fan-website%2Flines&label=Total%20lines)](https://tokei.kojix2.net/github/asozialesnetzwerk/an-website)\
[![Downloads](https://pepy.tech/badge/an-website)](https://pepy.tech/project/an-website)
[![Downloads](https://pepy.tech/badge/an-website/month)](https://pepy.tech/project/an-website)
[![Downloads](https://pepy.tech/badge/an-website/week)](https://pepy.tech/project/an-website)\
[![Check](https://github.com/asozialesnetzwerk/an-website/actions/workflows/check.yml/badge.svg)](https://github.com/asozialesnetzwerk/an-website/actions/workflows/check.yml)
[![Deploy](https://github.com/asozialesnetzwerk/an-website/actions/workflows/deploy.yml/badge.svg)](https://github.com/asozialesnetzwerk/an-website/actions/workflows/deploy.yml)

## Large Language Models

Do not submit any code or prose written or modified by large language models or
"artificial intelligence" such as GitHub Copilot or ChatGPT to this project.
These tools produce code that looks plausible, which means that not only is it
likely to contain bugs those bugs are likely to be difficult to notice on
review. In addition, because these models were trained indiscriminately and
non-consensually on open-source code with a variety of licenses, it's not
obvious that we have the moral or legal right to redistribute code they
generate.

## How to develop

You need:

- Git (obviously)
- CPython 3.14+
- Packages from pip-dev-requirements.txt
- C and C++ compiler for some of the dependencies
- Depending on the used version of CPython: Rust
- [Just](https://just.systems/man/en/introduction.html)
- For formatting TypeScript and Markdown: [dprint](https://dprint.dev/)
- For building JavaScript and CSS: [Deno](https://deno.com/)\
  (`just build`)
- For linting TypeScript: Node.js and pnpm\
  (`corepack enable` or `alias pnpm="corepack pnpm"`)

### How to check

- `./check.sh`

### How to run

- `python -Xdev -Xwarn_default_encoding -m an_website --redis-enabled=1 --ratelimits=0 --port=8080`

(`-Xdev` enables development mode)

## How to run (production)

### Linux

You need:

- CPython 3.14+
- C and C++ compiler for some of the dependencies
- Depending on the used version of CPython: Rust
- Supervisord
- Redis 6.2
- redis-cell (for ratelimits)
- Elasticsearch 8.19+
- UwUFetch

How:

- [Create a virtual environment](https://docs.python.org/3/library/venv.html)
- Install an-website in the venv (`pip install an-website`)
- create a `config.ini` and configure it
- run it (`an-website` / `python -m an_website`) with Supervisord

### FreeBSD

Should work similar to Linux.

### macOS

Not supported, but should work.

### Windows

Not supported, but maybe works.
