{"id":17004398,"url":"https://github.com/ppfeufer/aa-forum","last_synced_at":"2026-01-05T22:16:33.280Z","repository":{"id":38419822,"uuid":"370130338","full_name":"ppfeufer/aa-forum","owner":"ppfeufer","description":"Forum Module for Alliance Auth","archived":false,"fork":false,"pushed_at":"2024-05-16T15:34:57.000Z","size":8216,"stargazers_count":4,"open_issues_count":2,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-05-16T16:46:01.394Z","etag":null,"topics":["allianceauth","django","eve-online","forum"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ppfeufer.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"ko_fi":"ppfeufer"}},"created_at":"2021-05-23T18:36:42.000Z","updated_at":"2024-05-30T20:29:29.958Z","dependencies_parsed_at":"2024-05-16T16:55:25.270Z","dependency_job_id":null,"html_url":"https://github.com/ppfeufer/aa-forum","commit_stats":{"total_commits":821,"total_committers":4,"mean_commits":205.25,"dds":0.09987819732034109,"last_synced_commit":"ddcc8e010b6318d602a8e188524067883da41ac6"},"previous_names":[],"tags_count":79,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppfeufer%2Faa-forum","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppfeufer%2Faa-forum/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppfeufer%2Faa-forum/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppfeufer%2Faa-forum/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ppfeufer","download_url":"https://codeload.github.com/ppfeufer/aa-forum/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243858929,"owners_count":20359260,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["allianceauth","django","eve-online","forum"],"created_at":"2024-10-14T04:43:34.793Z","updated_at":"2026-01-05T22:16:33.265Z","avatar_url":"https://github.com/ppfeufer.png","language":"Python","funding_links":["https://ko-fi.com/ppfeufer","https://ko-fi.com/N4N8CL1BY"],"categories":[],"sub_categories":[],"readme":"# AA Forum\u003ca name=\"aa-forum\"\u003e\u003c/a\u003e\n\n[![Badge: Version]][aa-forum on pypi]\n[![Badge: License]][aa-forum license]\n[![Badge: Supported Python Versions]][aa-forum on pypi]\n[![Badge: Supported Django Versions]][aa-forum on pypi]\n![Badge: pre-commit]\n[![Badge: pre-commit.ci status]][pre-commit.ci status]\n[![Badge: Code Style: black]][black code formatter documentation]\n[![Badge: Support Discord]][support discord]\n[![Badge: Automated Tests]][automated tests on github]\n[![Badge: Code Coverage]][aa-forum on codecov]\n[![Badge: Translation Status]][weblate engage]\n[![Badge: Contributor Covenant]][code of conduct]\n\n[![Badge: Buy me a coffee]][ppfeufer on ko-fi]\n\nSimple forum app for [Alliance Auth]\n\n______________________________________________________________________\n\n\u003c!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=2 --\u003e\n\n- [Before You Install This Module](#before-you-install-this-module)\n- [Overview](#overview)\n  - [Features](#features)\n  - [Screenshots](#screenshots)\n    - [Forum Index](#forum-index)\n    - [Topic Overview / Board Index](#topic-overview--board-index)\n    - [Topic View](#topic-view)\n    - [Start New Topic (ckEditor)](#start-new-topic-ckeditor)\n    - [Admin View](#admin-view)\n- [Installation](#installation)\n  - [Step 1: Install the Package](#step-1-install-the-package)\n  - [Step 2: Configure Alliance Auth](#step-2-configure-alliance-auth)\n    - [Settings in `/home/allianceserver/myauth/myauth/settings/local.py`](#settings-in-homeallianceservermyauthmyauthsettingslocalpy)\n    - [Settings in `/home/allianceserver/myauth/myauth/urls.py`](#settings-in-homeallianceservermyauthmyauthurlspy)\n  - [Step 3: Configure Your Webserver](#step-3-configure-your-webserver)\n    - [Apache](#apache)\n    - [Nginx](#nginx)\n  - [Step 4: Finalizing the Installation](#step-4-finalizing-the-installation)\n  - [Step 5: Setting up Permissions](#step-5-setting-up-permissions)\n  - [Step 6: (Optional) Settings for Discord Proxy (If Used)](#step-6-optional-settings-for-discord-proxy-if-used)\n- [Changelog](#changelog)\n- [Translation Status](#translation-status)\n- [Contributing](#contributing)\n\n\u003c!-- mdformat-toc end --\u003e\n\n______________________________________________________________________\n\n## Before You Install This Module\u003ca name=\"before-you-install-this-module\"\u003e\u003c/a\u003e\n\nThis module needs quite some configuration done before working properly. You need to\nmodify your Apache/Nginx configuration as well as the global URL config of Alliance\nAuth. So please only install if you know what you're doing/feel comfortable making\nthese kinds of changes. For your own sanity, and mine :-)\n\n## Overview\u003ca name=\"overview\"\u003e\u003c/a\u003e\n\n### Features\u003ca name=\"features\"\u003e\u003c/a\u003e\n\n- Simple permission system. Only 2 permissions. (\"has_access\" and \"can_manage\")\n- Simple administration, no maze to click through to get where you want to go.\n- Categories and boards are sortable via drag and drop in the admin view.\n- Mass creation of boards with a new category.\n- Boards can be restricted to 1 or more groups, boards without restrictions are\n  visible for everyone who has access to the forum.\n- Announcement boards where only certain users can start topics.\n- Child boards (1 Level), which inherit their access restrictions from their parent.\n- CKEditor with image upload.\n- Unread topics counter as a number on the \"Forum\" link in the left navigation.\n- Optional notifications about new topics in a board via Discord webhooks.\n- Forum profile for each user.\n- Personal Messages.\n  - Optional Discord PM for new personal messages.\u003cbr\u003e\n    This feature is disabled by default, can be enabled by each user in their forum\n    profile. Needs one of the following applications installed:\n    - [discordproxy]\n    - [AA-Discordbot]\n\n### Screenshots\u003ca name=\"screenshots\"\u003e\u003c/a\u003e\n\n#### Forum Index\u003ca name=\"forum-index\"\u003e\u003c/a\u003e\n\n![Screenshot: Forum Index]\n\n#### Topic Overview / Board Index\u003ca name=\"topic-overview--board-index\"\u003e\u003c/a\u003e\n\n![Screenshot: Topic Overview / Board Index]\n\n#### Topic View\u003ca name=\"topic-view\"\u003e\u003c/a\u003e\n\n![Screenshot: Topic View]\n\n#### Start New Topic (ckEditor)\u003ca name=\"start-new-topic-ckeditor\"\u003e\u003c/a\u003e\n\n![Screenshot: Start new Topic]\n\n#### Admin View\u003ca name=\"admin-view\"\u003e\u003c/a\u003e\n\n![Screenshot: Admin View]\n\n## Installation\u003ca name=\"installation\"\u003e\u003c/a\u003e\n\n\u003e [!NOTE]\n\u003e\n\u003e **AA Forum \u003e= 2.0.0 needs at least Alliance Auth v4!**\n\u003e\n\u003e Please make sure to update your Alliance Auth instance _before_ you install this\n\u003e module or update to the latest version, otherwise an update to Alliance Auth will\n\u003e be pulled in unsupervised.\n\u003e\n\u003e The last version of AA Forum that supports Alliance Auth v3 is `1.19.5`.\n\n**Important**: Please make sure you meet all preconditions before you proceed:\n\n- AA Forum is a plugin for Alliance Auth. If you don't have Alliance Auth running\n  already, please install it first before proceeding. (see the official\n  [AA installation guide] for details)\n- AA Forum needs a couple of changes made to your Webserver and Alliance Auth\n  configuration. So make sure you know how to do so. The steps needed will be\n  described in this document, but you need to understand what will be changed.\n\n### Step 1: Install the Package\u003ca name=\"step-1-install-the-package\"\u003e\u003c/a\u003e\n\nMake sure you're in the virtual environment (venv) of your Alliance Auth\ninstallation Then install the latest release directly from PyPi.\n\n```shell\npip install aa-forum==2.14.1\n```\n\n### Step 2: Configure Alliance Auth\u003ca name=\"step-2-configure-alliance-auth\"\u003e\u003c/a\u003e\n\n#### Settings in `/home/allianceserver/myauth/myauth/settings/local.py`\u003ca name=\"settings-in-homeallianceservermyauthmyauthsettingslocalpy\"\u003e\u003c/a\u003e\n\nThis is fairly simple, configure your AA settings (`local.py`) as follows:\n\n```python\n# AA Forum\nINSTALLED_APPS += [\n    \"django_ckeditor_5\",  # https://github.com/hvlads/django-ckeditor-5\n    \"aa_forum\",  # https://github.com/ppfeufer/aa-forum\n]\n\n# Django CKEditor 5 Configuration\nif \"django_ckeditor_5\" in INSTALLED_APPS:\n    # CKEditor 5 File Upload Configuration\n    CKEDITOR_5_FILE_UPLOAD_PERMISSION = (\n        \"authenticated\"  # Possible values: \"staff\", \"authenticated\", \"any\"\n    )\n\n    MEDIA_URL = \"/media/uploads/\"\n    MEDIA_ROOT = \"/var/www/myauth/media/uploads\"\n\n    customColorPalette = [\n        {\"color\": \"hsl(4, 90%, 58%)\", \"label\": \"Red\"},\n        {\"color\": \"hsl(340, 82%, 52%)\", \"label\": \"Pink\"},\n        {\"color\": \"hsl(291, 64%, 42%)\", \"label\": \"Purple\"},\n        {\"color\": \"hsl(262, 52%, 47%)\", \"label\": \"Deep Purple\"},\n        {\"color\": \"hsl(231, 48%, 48%)\", \"label\": \"Indigo\"},\n        {\"color\": \"hsl(207, 90%, 54%)\", \"label\": \"Blue\"},\n    ]\n\n    CKEDITOR_5_CONFIGS = {\n        \"default\": {\n            \"toolbar\": [\n                \"heading\",\n                \"|\",\n                \"bold\",\n                \"italic\",\n                \"link\",\n                \"bulletedList\",\n                \"numberedList\",\n                \"blockQuote\",\n            ],\n        },\n        \"extends\": {\n            \"blockToolbar\": [\n                \"paragraph\",\n                \"heading1\",\n                \"heading2\",\n                \"heading3\",\n                \"|\",\n                \"bulletedList\",\n                \"numberedList\",\n                \"|\",\n                \"blockQuote\",\n            ],\n            \"toolbar\": [\n                \"heading\",\n                \"|\",\n                \"outdent\",\n                \"indent\",\n                \"|\",\n                \"bold\",\n                \"italic\",\n                \"link\",\n                \"underline\",\n                \"strikethrough\",\n                \"subscript\",\n                \"superscript\",\n                \"highlight\",\n                \"|\",\n                \"insertImage\",\n                \"mediaEmbed\",\n                \"|\",\n                \"bulletedList\",\n                \"numberedList\",\n                \"todoList\",\n                \"insertTable\",\n                \"|\",\n                \"blockQuote\",\n                \"codeBlock\",\n                \"|\",\n                \"fontSize\",\n                \"fontFamily\",\n                \"fontColor\",\n                \"fontBackgroundColor\",\n                \"removeFormat\",\n                \"|\",\n                \"sourceEditing\",\n            ],\n            \"image\": {\n                \"toolbar\": [\n                    \"imageTextAlternative\",\n                    \"|\",\n                    \"imageStyle:alignLeft\",\n                    \"imageStyle:alignRight\",\n                    \"imageStyle:alignCenter\",\n                    \"imageStyle:side\",\n                    \"|\",\n                ],\n                \"styles\": [\n                    \"full\",\n                    \"side\",\n                    \"alignLeft\",\n                    \"alignRight\",\n                    \"alignCenter\",\n                ],\n            },\n            \"table\": {\n                \"contentToolbar\": [\n                    \"tableColumn\",\n                    \"tableRow\",\n                    \"mergeTableCells\",\n                    \"tableProperties\",\n                    \"tableCellProperties\",\n                ],\n                \"tableProperties\": {\n                    \"borderColors\": customColorPalette,\n                    \"backgroundColors\": customColorPalette,\n                },\n                \"tableCellProperties\": {\n                    \"borderColors\": customColorPalette,\n                    \"backgroundColors\": customColorPalette,\n                },\n            },\n            \"heading\": {\n                \"options\": [\n                    {\n                        \"model\": \"paragraph\",\n                        \"title\": \"Paragraph\",\n                        \"class\": \"ck-heading_paragraph\",\n                    },\n                    {\n                        \"model\": \"heading1\",\n                        \"view\": \"h1\",\n                        \"title\": \"Heading 1\",\n                        \"class\": \"ck-heading_heading1\",\n                    },\n                    {\n                        \"model\": \"heading2\",\n                        \"view\": \"h2\",\n                        \"title\": \"Heading 2\",\n                        \"class\": \"ck-heading_heading2\",\n                    },\n                    {\n                        \"model\": \"heading3\",\n                        \"view\": \"h3\",\n                        \"title\": \"Heading 3\",\n                        \"class\": \"ck-heading_heading3\",\n                    },\n                ]\n            },\n        },\n        \"list\": {\n            \"properties\": {\n                \"styles\": \"true\",\n                \"startIndex\": \"true\",\n                \"reversed\": \"true\",\n            }\n        },\n    }\n```\n\n#### Settings in `/home/allianceserver/myauth/myauth/urls.py`\u003ca name=\"settings-in-homeallianceservermyauthmyauthurlspy\"\u003e\u003c/a\u003e\n\nNow let's move on to editing the global URL configuration of Alliance Auth. To do so,\nyou need to open `/home/allianceserver/myauth/myauth/urls.py` and change the\nfollowing block right before the `handler` definitions:\n\n```python\nfrom django.apps import apps  # Only if not already imported earlier\nfrom django.conf import settings  # Only if not already imported earlier\nfrom django.conf.urls.static import static  # Only if not already imported earlier\nfrom django.urls import path  # Only if not already imported earlier\n\n# If django_ckeditor_5 is loaded\nif apps.is_installed(\"django_ckeditor_5\"):\n    # URL configuration for CKEditor 5\n    urlpatterns = (\n        [\n            path(\"ckeditor5/\", include(\"django_ckeditor_5.urls\")),\n        ]\n        + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)\n        + urlpatterns\n    )\n```\n\nAfter this, your `urls.py` should look similar to this:\n\n```python\nfrom django.apps import apps\nfrom django.conf import settings\nfrom django.conf.urls.static import static\nfrom django.urls import include, path, re_path\n\nfrom allianceauth import urls\n\n# Alliance auth urls\nurlpatterns = [\n    path(r\"\", include(urls)),\n]\n\n# If django_ckeditor_5 is loaded\nif apps.is_installed(\"django_ckeditor_5\"):\n    # URL configuration for CKEditor 5\n    urlpatterns = (\n        [\n            path(\"ckeditor5/\", include(\"django_ckeditor_5.urls\")),\n        ]\n        + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)\n        + urlpatterns\n    )\n\nhandler500 = \"allianceauth.views.Generic500Redirect\"\nhandler404 = \"allianceauth.views.Generic404Redirect\"\nhandler403 = \"allianceauth.views.Generic403Redirect\"\nhandler400 = \"allianceauth.views.Generic400Redirect\"\n```\n\n### Step 3: Configure Your Webserver\u003ca name=\"step-3-configure-your-webserver\"\u003e\u003c/a\u003e\n\nYour webserver needs to know from where to serve the uploaded images, of course, so we\nhave to tell it.\n\n#### Apache\u003ca name=\"apache\"\u003e\u003c/a\u003e\n\nIn your vhost configuration, you have a line `ProxyPassMatch ^/static !`, which tells\nthe server where to find all the static files. We're adding a similar line for the\nmedia, right below that one.\n\nAdd the following right below the static proxy match:\n\n```apache\nProxyPassMatch ^/media !\n```\n\nNow we also need to let the server know where to find the media directory we just\nconfigured the proxy for. To do so, add a new Alias to your configuration. This can\nbe done right below the already existing Alias for `/static`:\n\n```apache\nAlias \"/media\" \"/var/www/myauth/media/\"\n```\n\nAt last, a \"Directory\" rule is needed as well. Add the following code below the already\nexisting Directory rule for the static files:\n\n```apache\n\u003cDirectory \"/var/www/myauth/media/\"\u003e\n    Require all granted\n\u003c/Directory\u003e\n```\n\nSo the whole block should now look like this:\n\n```apache\nProxyPassMatch ^/static !\nProxyPassMatch ^/media !  # *** NEW proxy rule\nProxyPass / http://127.0.0.1:8000/\nProxyPassReverse / http://127.0.0.1:8000/\nProxyPreserveHost On\n\nAlias \"/static\" \"/var/www/myauth/static/\"\nAlias \"/media\" \"/var/www/myauth/media/\"\n\n\u003cDirectory \"/var/www/myauth/static/\"\u003e\n    Require all granted\n\u003c/Directory\u003e\n\n\u003cDirectory \"/var/www/myauth/media/\"\u003e\n    Require all granted\n\u003c/Directory\u003e\n```\n\nRestart your Apache webserver.\n\n#### Nginx\u003ca name=\"nginx\"\u003e\u003c/a\u003e\n\nIn order to let Nginx know where to find the uploaded files, you need to add a new\nlocation rule to the configuration. Add the following right below the definition for\nyour \"static\" location.\n\n```nginx\nlocation /media {\n    alias /var/www/myauth/media;\n    autoindex off;\n}\n```\n\nRestart your Nginx webserver.\n\n### Step 4: Finalizing the Installation\u003ca name=\"step-4-finalizing-the-installation\"\u003e\u003c/a\u003e\n\nRun static files collection and migrations\n\n```shell\npython manage.py collectstatic\npython manage.py migrate\n```\n\nRestart your supervisor services for Auth\n\n### Step 5: Setting up Permissions\u003ca name=\"step-5-setting-up-permissions\"\u003e\u003c/a\u003e\n\nNow it's time to set up access permissions for your new module. You can do so in\nyour admin backend.\n\n| ID             | Description                                                      | Notes                                                                                                                                                                                                                                                                                                                                             |\n| :------------- | :--------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `basic_access` | Can access the AA-Forum module                                   | Grants access to the forum                                                                                                                                                                                                                                                                                                                        |\n| `manage_forum` | Can manage the AA-Forum module (Categories, topics and messages) | Users with this permission can create, edit and delete boards and categories in the \"Administration\" view. They can also modify and delete messages and topics in the \"Forum\" view. **Users with this permission are not bound by group restrictions and have access to all boards and topics, so choose wisely who is getting this permission.** |\n\n### Step 6: (Optional) Settings for Discord Proxy (If Used)\u003ca name=\"step-6-optional-settings-for-discord-proxy-if-used\"\u003e\u003c/a\u003e\n\nIf you are using [discordproxy] to send Discord messages, you can configure the host and port in your `local.py` settings.\n\n| Name                | Description                                      | Default     |\n| ------------------- | ------------------------------------------------ | ----------- |\n| `DISCORDPROXY_HOST` | Hostname used to communicate with Discord Proxy. | `localhost` |\n| `DISCORDPROXY_PORT` | Port used to communicate with Discord Proxy.     | `50051`     |\n\n## Changelog\u003ca name=\"changelog\"\u003e\u003c/a\u003e\n\nSee [CHANGELOG.md]\n\n## Translation Status\u003ca name=\"translation-status\"\u003e\u003c/a\u003e\n\n[![Translation status](https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-forum/multi-auto.svg)](https://weblate.ppfeufer.de/engage/alliance-auth-apps/)\n\nDo you want to help translate this app into your language or improve the existing\ntranslation? - [Join our team of translators][weblate engage]!\n\n## Contributing\u003ca name=\"contributing\"\u003e\u003c/a\u003e\n\nDo you want to contribute to this project? That's cool!\n\nPlease make sure to read the [Contribution Guidelines].\n(I promise, it's not much, just some basics)\n\n\u003c!-- Inline Links --\u003e\n\n[aa installation guide]: https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html\n[aa-discordbot]: https://github.com/pvyParts/allianceauth-discordbot \"AA-Discordbot\"\n[aa-forum license]: https://github.com/ppfeufer/aa-forum/blob/master/LICENSE\n[aa-forum on codecov]: https://codecov.io/gh/ppfeufer/aa-forum\n[aa-forum on pypi]: https://pypi.org/project/aa-forum/\n[alliance auth]: https://gitlab.com/allianceauth/allianceauth\n[automated tests on github]: https://github.com/ppfeufer/aa-forum/actions/workflows/automated-checks.yml\n[badge: automated tests]: https://github.com/ppfeufer/aa-forum/actions/workflows/automated-checks.yml/badge.svg \"Automated Tests\"\n[badge: buy me a coffee]: https://ko-fi.com/img/githubbutton_sm.svg \"Buy me a coffee\"\n[badge: code coverage]: https://codecov.io/gh/ppfeufer/aa-forum/branch/master/graph/badge.svg \"Code Coverage\"\n[badge: code style: black]: https://img.shields.io/badge/code%20style-black-000000.svg \"Code Style: black\"\n[badge: contributor covenant]: https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg \"Contributor Covenant\"\n[badge: license]: https://img.shields.io/github/license/ppfeufer/aa-forum \"License\"\n[badge: pre-commit]: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit\u0026logoColor=white \"pre-commit\"\n[badge: pre-commit.ci status]: https://results.pre-commit.ci/badge/github/ppfeufer/aa-forum/master.svg \"pre-commit.ci status\"\n[badge: support discord]: https://img.shields.io/discord/399006117012832262?label=discord \"Support Discord\"\n[badge: supported django versions]: https://img.shields.io/pypi/djversions/aa-forum?label=django \"Supported Django Versions\"\n[badge: supported python versions]: https://img.shields.io/pypi/pyversions/aa-forum \"Supported Python Versions\"\n[badge: translation status]: https://weblate.ppfeufer.de/widget/alliance-auth-apps/aa-forum/svg-badge.svg \"Translation Status\"\n[badge: version]: https://img.shields.io/pypi/v/aa-forum?label=release \"Version\"\n[black code formatter documentation]: http://black.readthedocs.io/en/latest/\n[changelog.md]: https://github.com/ppfeufer/aa-forum/blob/master/CHANGELOG.md\n[code of conduct]: https://github.com/ppfeufer/aa-forum/blob/master/CODE_OF_CONDUCT.md\n[contribution guidelines]: https://github.com/ppfeufer/aa-forum/blob/master/CONTRIBUTING.md\n[discordproxy]: https://gitlab.com/ErikKalkoken/discordproxy\n[ppfeufer on ko-fi]: https://ko-fi.com/N4N8CL1BY\n[pre-commit.ci status]: https://results.pre-commit.ci/latest/github/ppfeufer/aa-forum/master \"pre-commit.ci\"\n[screenshot: admin view]: https://raw.githubusercontent.com/ppfeufer/aa-forum/master/docs/images/admin-view.jpg \"Admin View\"\n[screenshot: forum index]: https://raw.githubusercontent.com/ppfeufer/aa-forum/master/docs/images/forum-index.jpg \"Forum Index\"\n[screenshot: start new topic]: https://raw.githubusercontent.com/ppfeufer/aa-forum/master/docs/images/start-new-topic.jpg \"Start new Topic (ckEditor)\"\n[screenshot: topic overview / board index]: https://raw.githubusercontent.com/ppfeufer/aa-forum/master/docs/images/topic-overview.jpg \"Topic Overview / Board Index\"\n[screenshot: topic view]: https://raw.githubusercontent.com/ppfeufer/aa-forum/master/docs/images/topic-view.jpg \"Topic View\"\n[support discord]: https://discord.gg/fjnHAmk \"Alliance Auth Support Discord\"\n[weblate engage]: https://weblate.ppfeufer.de/engage/alliance-auth-apps/ \"Weblate Translations\"\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fppfeufer%2Faa-forum","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fppfeufer%2Faa-forum","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fppfeufer%2Faa-forum/lists"}