diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 8c4978c7..d9080062 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -9,10 +9,25 @@ jobs:
steps:
- uses: actions/checkout@v2
- - name: Set up Python 3
- uses: actions/setup-python@v4
- with:
- python-version: '3.10'
- - name: Check apps.json
+
+ - name: Check JSON validity for apps.json
run: |
- python -m json.tool apps.json
+ cat apps.json | jq >/dev/null
+
+ - name: Check all working apps have consistent app id / app url
+ run: |
+ FAULTY_APPS="false";
+ for LINE in $(cat apps.json | jq -r 'to_entries[] | select ( .value.state=="working" ) | "\(.key)|\(.value.url)"')
+ do
+ APP=$(echo $LINE | awk -F'|' '{print $1}')
+ URL_END=$(echo $LINE | awk -F'/' '{print $NF}')
+ [ "$APP" == "$(echo $APP | tr [A-Z] [a-z])" ] || { FAULTY_APPS="true"; echo "$APP : app id should be lowercase" >&2; }
+ [ "$URL_END" == "${APP}_ynh" ] || { FAULTY_APPS="true"; echo "$APP : the url should end with ${APP}_ynh" >&2; }
+ done
+ [ $FAULTY_APPS = "false" ]
+
+ - name: Check all working apps have a category
+ run: |
+ APPS_WITH_NO_CATEGORY=$(jq -e -r '.[] | select ( .state=="working" ) | select ( has("category") | not )' apps.json || true)
+ [ "$APPS_WITH_NO_CATEGORY" == "" ] || { echo "Some working apps are missing a category: $APPS_WITH_NO_CATEGORY" >&2; false; }
+
diff --git a/README.md b/README.md
index c185bd68..dbbf1353 100644
--- a/README.md
+++ b/README.md
@@ -23,26 +23,36 @@ https://app.yunohost.org/default/.
N.B.: The YunoHost project will **NOT** integrate in its catalog applications that are not
based on free-software upstreams.
+N.B.2: We strongly encourage you to transfer the ownership of your repository to
+the YunoHost-Apps organization on GitHub, such that the community will help you
+with keeping your app working and up to date with packaging evolutions.
+
To add your application to the catalog:
* Fork this repository and edit the [apps.json](https://github.com/YunoHost/apps/tree/master/apps.json) file
* Add your app's ID and git information at the right alphabetical place
* Indicate the app's functioning state: `notworking`, `inprogress`, or `working`
-* *Do not* add the level entry by yourself. Our automatic test suite ("the CI") will handle it.
+* Indicate the app category, which you can pick from `categories.yml`
+* Indicate any anti-feature that your app may be subject to, see `antifeatures.yml` (or remove the `antifeatures` key if there's none)
+* Indicate if your app can be thought of as an alternative to popular proprietary services (or remove the `potential_alternative_to` key if there's none)
+* *Do not* add the `level` entry by yourself. Our automatic test suite ("the CI") will handle it.
* Create a [Pull Request](https://github.com/YunoHost/apps/pulls/)
App example addition:
```json
- "wallabag": {
- "url": "https://github.com/abeudin/wallabag_ynh",
- "state": "working"
+ "your_app": {
+ "antifeatures": [
+ "deprecated-software"
+ ],
+ "potential_alternative_to": [
+ "YouTube"
+ ],
+ "category": "pick_the_appropriate_category",
+ "state": "working",
+ "url": "https://github.com/YunoHost-Apps/your_app_ynh"
}
```
-N.B.: We strongly encourage you to transfer the ownership of your repository to
-the YunoHost-Apps organization on GitHub, such that the community will help you
-with keeping your app working and up to date with packaging evolutions.
-
-N.B.2: Implicitly, the catalog publishes the `HEAD` of branch `master`
+N.B: Implicitly, the catalog publishes the `HEAD` of branch `master`
(this can be overwritten by adding keys `branch` and `revision`).
Therefore, **be careful that any commit on the `master` branch will automatically be published**.
**We strongly encourage you to develop in separate branches**, and only
@@ -50,28 +60,9 @@ merge changes that were carefully tested. Get in touch with the Apps group to
obtain an access to the developer CI where you'll be able to test your app
easily.
-### Updating apps' level in the catalog
+### Updating apps levels in the catalog
-App packagers should *not* manually set their apps' level. The levels of all the apps are automatically updated once per week on Friday.
-
-#### Helper script
-
-You can use the add_or_update.py
Python script to add or update
-your app from one of the 2 JSON files.
-
-Usage:
-
-```bash
-./add_or_update.py apps.json [github/gitlab url OR app name [github/gitlab url OR app name [github/gitlab url OR app name ...]]]
-```
-
-### How to help translating
-
-Update on Nov. 2020: this part is broken / not maintained anymore for the
-moment...
-
-We invite you to use [translate.yunohost.org](https://translate.yunohost.org/)
-instead of doing Pull Request for files in `locales` folder.
+App packagers should *not* manually set their apps' level. The levels of all the apps are automatically updated once per week on Friday, according to the results from the official app CI.
### Apps flagged as not-maintained
diff --git a/add_or_update.py b/add_or_update.py
deleted file mode 100755
index 33c72915..00000000
--- a/add_or_update.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/env python2
-
-import os
-import sys
-import json
-
-from urllib2 import urlopen
-from urlparse import urlparse
-
-states = {
- 1: "notworking",
- 2: "inprogress",
- 3: "working",
-}
-
-if __name__ == '__main__':
- if not len(sys.argv[1:]):
- print("I need a json file as first argument and a list of github urls")
- sys.exit(0)
-
- if len(sys.argv[1:]) < 2:
- print("I need a list of github urls or app names after the json file")
- sys.exit(0)
-
- if not os.path.exists(sys.argv[1]):
- print("The json file '%s' doesn't exist" % sys.argv[1])
-
- content = json.load(open(sys.argv[1], "r"))
-
- for url in sys.argv[2:]:
- if not url.startswith("http"):
- if url in content:
- url = content[url]["url"]
- else:
- print "App name '%s' not in %s" % (url, sys.argv[1])
- sys.exit(1)
-
- if url.endswith("/"):
- url = url[:-1]
-
- if url.endswith(".git"):
- url = url[:-len(".git")]
-
- if not url.startswith("https://github.com"):
- sys.stderr.write("WARNING: url '%s' doesn't starts with https://github.com, we will try with gitlab api\n" % url)
-
- owner, repo = filter(None, url.split("/"))[-2:]
- project_name = filter(None, url.split("/"))[-1].replace("_ynh", "")
-
- if url.startswith("https://github.com"):
- git_data = json.load(urlopen("https://api.github.com/repos/%(owner)s/%(repo)s/commits" % {"owner": owner, "repo": repo}))
- revision = git_data[0]["sha"]
- else:
- parsed_uri = urlparse(url)
- base_url = '{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)
- # Try with gitlab api
- git_data = json.load(urlopen("%(base_url)sapi/v4/projects/%(owner)s%%2F%(repo)s/repository/commits/HEAD" % {"base_url": base_url, "owner": owner, "repo": repo}))
- revision = git_data["id"]
-
- if project_name not in content:
- content[project_name] = {}
- else:
- print("INFO: project already in '%s', I'm updating it" % sys.argv[1])
-
- content[project_name]["url"] = url
- content[project_name]["revision"] = revision
- content[project_name]["branch"] = "master"
-
- if sys.argv[1] == "official.json":
- content[project_name]["state"] = "validated"
-
- else:
- got_state = False
- while not got_state:
- answer = input("Give me a state for this repository (digit or name) in:\n%s\n\nState: " % "\n".join(["%s: %s" % x for x in sorted(states.items(), key=lambda x: x[0])]) + "\n")
-
- if answer in states:
- answer = states[answer]
- got_state = True
- elif answer in states.values():
- got_state = True
- else:
- print("Invalid state.\n")
-
- content[project_name]["state"] = answer
-
- open(sys.argv[1], "w").write("\n".join(json.dumps(content, indent=4, sort_keys=True).split(" \n")) + "\n")
- os.system("git diff")
diff --git a/apps.json b/apps.json
index 3d31e6e4..87f0637a 100644
--- a/apps.json
+++ b/apps.json
@@ -23,7 +23,7 @@
"category": "system_tools",
"level": 7,
"state": "working",
- "url": "https://github.com/YunoHost-Apps/2FAuth_ynh"
+ "url": "https://github.com/YunoHost-Apps/2fauth_ynh"
},
"abantecart": {
"category": "publishing",
@@ -343,6 +343,15 @@
],
"url": "https://github.com/YunoHost-Apps/bookstack_ynh"
},
+ "bookwyrm": {
+ "category": "social_media",
+ "state": "working",
+ "maintained": true,
+ "potential_alternative_to": [
+ "ActivityPub"
+ ],
+ "url": "https://github.com/YunoHost-Apps/bookwyrm_ynh"
+ },
"borg": {
"category": "system_tools",
"level": 6,
@@ -391,6 +400,17 @@
],
"url": "https://github.com/YunoHost-Apps/cachet_ynh"
},
+ "calckey": {
+ "category": "social_media",
+ "state": "working",
+ "maintained": true,
+ "potential_alternative_to": [
+ "Twitter",
+ "Mastodon",
+ "Pleroma"
+ ],
+ "url": "https://github.com/YunoHost-Apps/calckey_ynh"
+ },
"calibreweb": {
"category": "reading",
"level": 8,
@@ -662,7 +682,7 @@
"category": "games",
"level": 8,
"state": "working",
- "url": "https://github.com/YunoHost-Apps/Cubiks-2048_ynh"
+ "url": "https://github.com/YunoHost-Apps/cubiks-2048_ynh"
},
"cypht": {
"category": "communication",
@@ -861,7 +881,7 @@
],
"url": "https://github.com/Jojo144/django_app_ynh"
},
- "django_example_ynh": {
+ "django_example": {
"category": "dev",
"level": 7,
"state": "working",
@@ -2142,7 +2162,7 @@
"level": 0,
"revision": "a38a83fea289f77910fd98b34ea58eea5f5909db",
"state": "notworking",
- "url": "https://github.com/YunoHost-Apps/LBCAlerte_ynh"
+ "url": "https://github.com/YunoHost-Apps/lbcalerte_ynh"
},
"leed": {
"category": "reading",
@@ -2685,6 +2705,7 @@
"url": "https://github.com/YunoHost-Apps/modernpaste_ynh"
},
"mongo-express": {
+ "branch": "main",
"category": "system_tools",
"state": "working",
"subtags": [
@@ -3070,6 +3091,17 @@
"state": "working",
"url": "https://github.com/YunoHost-Apps/openproject_ynh"
},
+ "opensearch": {
+ "category": "dev",
+ "state": "working",
+ "subtags": [
+ "programming"
+ ],
+ "potential_alternative_to": [
+ "ElasticSearch"
+ ],
+ "url": "https://github.com/YunoHost-Apps/opensearch_ynh"
+ },
"opensondage": {
"category": "productivity_and_management",
"level": 8,
@@ -3577,7 +3609,6 @@
"potential_alternative_to": [
"TikTok"
],
- "state": "working",
"url": "https://github.com/YunoHost-Apps/proxitok_ynh"
},
"psitransfer": {
@@ -3731,7 +3762,7 @@
"remotestorage": {
"category": "small_utilities",
"state": "notworking",
- "url": "https://github.com/YunoHost-Apps/RemoteStorage_ynh"
+ "url": "https://github.com/YunoHost-Apps/remotestorage_ynh"
},
"restic": {
"category": "system_tools",
@@ -3998,7 +4029,7 @@
"category": "small_utilities",
"level": 7,
"state": "working",
- "url": "https://github.com/YunoHost-Apps/Signaturepdf_ynh"
+ "url": "https://github.com/YunoHost-Apps/signaturepdf_ynh"
},
"simple-hash-generator": {
"category": "small_utilities",
@@ -4022,7 +4053,7 @@
"subtags": [
"websites"
],
- "url": "https://github.com/YunoHost-Apps/SitemagicCMS_ynh"
+ "url": "https://github.com/YunoHost-Apps/sitemagiccms_ynh"
},
"slingcode": {
"category": "dev",
@@ -4166,6 +4197,11 @@
"state": "notworking",
"url": "https://github.com/YunoHost-Apps/staticwebapp_ynh"
},
+ "statping_ng": {
+ "category": "system_tools",
+ "state": "working",
+ "url": "https://github.com/YunoHost-Apps/statping_ng_ynh"
+ },
"streama": {
"category": "multimedia",
"level": 6,
@@ -4586,7 +4622,7 @@
"category": "multimedia",
"level": 6,
"state": "working",
- "url": "https://github.com/YunoHost-Apps/UMS_ynh"
+ "url": "https://github.com/YunoHost-Apps/ums_ynh"
},
"unattended_upgrades": {
"category": "system_tools",
diff --git a/check_id_unicity.py b/check_id_unicity.py
deleted file mode 100644
index 53ab7605..00000000
--- a/check_id_unicity.py
+++ /dev/null
@@ -1,56 +0,0 @@
-import sys
-import json
-import requests
-
-
-def get_json(url, verify=True, token=None):
-
- try:
- # Retrieve and load manifest
- if ".github" in url:
- r = requests.get(url, verify=verify, auth=token)
- else:
- r = requests.get(url, verify=verify)
- r.raise_for_status()
- return r.json()
- except requests.exceptions.RequestException as e:
- print("-> Error: unable to request %s, %s" % (url, e))
- return None
- except ValueError as e:
- print("-> Error: unable to decode JSON from %s : %s" % (url, e))
- return None
-
-
-def main(apps):
- for app_id, app_data in apps.items():
- url = app_data["url"]
- github_repo_name = url.split("/")[-1].replace("_ynh", "")
-
- if app_id != github_repo_name:
- print "[%s] GitHub repo name is not coherent with app id: '%s' vs '%s' (%s)" % (app_id, app_id, url.split("/")[-1], url)
-
- owner, repo_name = url.split("/")[-2:]
-
- raw_url = "https://raw.githubusercontent.com/%s/%s/%s/manifest.json" % (
- owner, repo_name, app_data["revision"]
- )
-
- manifest = get_json(raw_url)
-
- if manifest is None:
- continue
-
- manifest_id = manifest["id"]
- if app_id != manifest_id:
- print "[%s] manifest id is different from app id: '%s' vs '%s' (manifest_id" % (app_id, app_id, manifest_id)
-
- if manifest_id != github_repo_name:
- print "[%s] manifest id is different from GitHub repo name: '%s' vs '%s' (%s)" % (app_id, manifest_id, url.split("/")[-1], url)
-
-
-if __name__ == '__main__':
- if not sys.argv[1:]:
- print "Usage: python check_id_unicity.py list.json"
- sys.exit(1)
-
- main(json.load(open(sys.argv[1])))
diff --git a/list_builder.py b/list_builder.py
index 8e3debe2..dd049eb3 100755
--- a/list_builder.py
+++ b/list_builder.py
@@ -213,6 +213,16 @@ def build_catalog():
if "manifest" in app and "resources" in app["manifest"]:
del app["manifest"]["resources"]
+ for appid, app in result_dict_with_manifest_v2.items():
+ appid = appid.lower()
+ if os.path.exists(f"logos/{appid}.png"):
+ logo_hash = subprocess.check_output(["sha256sum", f"logos/{appid}.png"]).strip().decode("utf-8").split()[0]
+ os.system(f"cp logos/{appid}.png builds/default/v3/logos/{logo_hash}.png")
+ # FIXME: implement something to cleanup old logo stuf in the builds/.../logos/ folder somehow
+ else:
+ logo_hash = None
+ app["logo_hash"] = logo_hash
+
os.system("mkdir -p ./builds/default/v3/")
with open("builds/default/v3/apps.json", "w") as f:
f.write(
diff --git a/logos/adguardhome.png b/logos/adguardhome.png
new file mode 100644
index 00000000..78bf3496
Binary files /dev/null and b/logos/adguardhome.png differ
diff --git a/logos/adminer.png b/logos/adminer.png
new file mode 100644
index 00000000..65b3aab0
Binary files /dev/null and b/logos/adminer.png differ
diff --git a/logos/aeneria.png b/logos/aeneria.png
new file mode 100644
index 00000000..e1fe3662
Binary files /dev/null and b/logos/aeneria.png differ
diff --git a/logos/agendav.png b/logos/agendav.png
new file mode 100644
index 00000000..b0b44f6f
Binary files /dev/null and b/logos/agendav.png differ
diff --git a/logos/airsonic.png b/logos/airsonic.png
new file mode 100644
index 00000000..b64ea9fe
Binary files /dev/null and b/logos/airsonic.png differ
diff --git a/logos/alltube.png b/logos/alltube.png
new file mode 100644
index 00000000..6d83e053
Binary files /dev/null and b/logos/alltube.png differ
diff --git a/logos/ampache.png b/logos/ampache.png
new file mode 100644
index 00000000..91a6831a
Binary files /dev/null and b/logos/ampache.png differ
diff --git a/logos/anarchism.png b/logos/anarchism.png
new file mode 100644
index 00000000..d160a61c
Binary files /dev/null and b/logos/anarchism.png differ
diff --git a/logos/archivebox.png b/logos/archivebox.png
new file mode 100644
index 00000000..c6aa4cee
Binary files /dev/null and b/logos/archivebox.png differ
diff --git a/logos/audiobookshelf.png b/logos/audiobookshelf.png
new file mode 100644
index 00000000..9ebf834f
Binary files /dev/null and b/logos/audiobookshelf.png differ
diff --git a/logos/backdrop.png b/logos/backdrop.png
new file mode 100644
index 00000000..3682858e
Binary files /dev/null and b/logos/backdrop.png differ
diff --git a/logos/baikal.png b/logos/baikal.png
new file mode 100644
index 00000000..5f59a9b3
Binary files /dev/null and b/logos/baikal.png differ
diff --git a/logos/bazarr.png b/logos/bazarr.png
new file mode 100644
index 00000000..5a120a6a
Binary files /dev/null and b/logos/bazarr.png differ
diff --git a/logos/beehive.png b/logos/beehive.png
new file mode 100644
index 00000000..d6f220c1
Binary files /dev/null and b/logos/beehive.png differ
diff --git a/logos/biboumi.png b/logos/biboumi.png
new file mode 100644
index 00000000..c6e018c4
Binary files /dev/null and b/logos/biboumi.png differ
diff --git a/logos/bicbucstriim.png b/logos/bicbucstriim.png
new file mode 100644
index 00000000..a868cfcf
Binary files /dev/null and b/logos/bicbucstriim.png differ
diff --git a/logos/blogotext.png b/logos/blogotext.png
new file mode 100644
index 00000000..d129893b
Binary files /dev/null and b/logos/blogotext.png differ
diff --git a/logos/bludit.png b/logos/bludit.png
new file mode 100644
index 00000000..5a8c9328
Binary files /dev/null and b/logos/bludit.png differ
diff --git a/logos/bookstack.png b/logos/bookstack.png
new file mode 100644
index 00000000..5791636d
Binary files /dev/null and b/logos/bookstack.png differ
diff --git a/logos/borg.png b/logos/borg.png
new file mode 100644
index 00000000..ee2667bd
Binary files /dev/null and b/logos/borg.png differ
diff --git a/logos/borgserver.png b/logos/borgserver.png
new file mode 100644
index 00000000..ee2667bd
Binary files /dev/null and b/logos/borgserver.png differ
diff --git a/logos/cachet.png b/logos/cachet.png
new file mode 100644
index 00000000..4aa39f6a
Binary files /dev/null and b/logos/cachet.png differ
diff --git a/logos/calibreweb.png b/logos/calibreweb.png
new file mode 100644
index 00000000..a8424ee5
Binary files /dev/null and b/logos/calibreweb.png differ
diff --git a/logos/castopod.png b/logos/castopod.png
new file mode 100644
index 00000000..3fa43c8d
Binary files /dev/null and b/logos/castopod.png differ
diff --git a/logos/cinny.png b/logos/cinny.png
new file mode 100644
index 00000000..495b004c
Binary files /dev/null and b/logos/cinny.png differ
diff --git a/logos/civicrm_drupal7.png b/logos/civicrm_drupal7.png
new file mode 100644
index 00000000..d0657a5f
Binary files /dev/null and b/logos/civicrm_drupal7.png differ
diff --git a/logos/cockpit.png b/logos/cockpit.png
new file mode 100644
index 00000000..4e5da1ba
Binary files /dev/null and b/logos/cockpit.png differ
diff --git a/logos/code-server.png b/logos/code-server.png
new file mode 100644
index 00000000..795fc143
Binary files /dev/null and b/logos/code-server.png differ
diff --git a/logos/codimd.png b/logos/codimd.png
new file mode 100644
index 00000000..63e15b6a
Binary files /dev/null and b/logos/codimd.png differ
diff --git a/logos/collabora.png b/logos/collabora.png
new file mode 100644
index 00000000..37814808
Binary files /dev/null and b/logos/collabora.png differ
diff --git a/logos/commento.png b/logos/commento.png
new file mode 100644
index 00000000..e85e509d
Binary files /dev/null and b/logos/commento.png differ
diff --git a/logos/concrete5.png b/logos/concrete5.png
new file mode 100644
index 00000000..6813324d
Binary files /dev/null and b/logos/concrete5.png differ
diff --git a/logos/converse.png b/logos/converse.png
new file mode 100644
index 00000000..bf2d8636
Binary files /dev/null and b/logos/converse.png differ
diff --git a/logos/conversejs.png b/logos/conversejs.png
new file mode 100644
index 00000000..bf2d8636
Binary files /dev/null and b/logos/conversejs.png differ
diff --git a/logos/couchpotato.png b/logos/couchpotato.png
new file mode 100644
index 00000000..a3f528d1
Binary files /dev/null and b/logos/couchpotato.png differ
diff --git a/logos/cowyo.png b/logos/cowyo.png
new file mode 100644
index 00000000..cd3f2496
Binary files /dev/null and b/logos/cowyo.png differ
diff --git a/logos/cryptpad.png b/logos/cryptpad.png
new file mode 100644
index 00000000..f74705bd
Binary files /dev/null and b/logos/cryptpad.png differ
diff --git a/logos/cypht.png b/logos/cypht.png
new file mode 100644
index 00000000..05551674
Binary files /dev/null and b/logos/cypht.png differ
diff --git a/logos/diagramsnet.png b/logos/diagramsnet.png
new file mode 100644
index 00000000..38496678
Binary files /dev/null and b/logos/diagramsnet.png differ
diff --git a/logos/diaspora.png b/logos/diaspora.png
new file mode 100644
index 00000000..addb5017
Binary files /dev/null and b/logos/diaspora.png differ
diff --git a/logos/discourse.png b/logos/discourse.png
new file mode 100644
index 00000000..67154a2d
Binary files /dev/null and b/logos/discourse.png differ
diff --git a/logos/dokuwiki.png b/logos/dokuwiki.png
new file mode 100644
index 00000000..1d2d0029
Binary files /dev/null and b/logos/dokuwiki.png differ
diff --git a/logos/dolibarr.png b/logos/dolibarr.png
new file mode 100644
index 00000000..b085a391
Binary files /dev/null and b/logos/dolibarr.png differ
diff --git a/logos/domoticz.png b/logos/domoticz.png
new file mode 100644
index 00000000..c92b7439
Binary files /dev/null and b/logos/domoticz.png differ
diff --git a/logos/dotclear2.png b/logos/dotclear2.png
new file mode 100644
index 00000000..48d4cc7e
Binary files /dev/null and b/logos/dotclear2.png differ
diff --git a/logos/droppy.png b/logos/droppy.png
new file mode 100644
index 00000000..adbce012
Binary files /dev/null and b/logos/droppy.png differ
diff --git a/logos/drupal.png b/logos/drupal.png
new file mode 100644
index 00000000..e2947493
Binary files /dev/null and b/logos/drupal.png differ
diff --git a/logos/drupal7.png b/logos/drupal7.png
new file mode 100644
index 00000000..e2947493
Binary files /dev/null and b/logos/drupal7.png differ
diff --git a/logos/duniter.png b/logos/duniter.png
new file mode 100644
index 00000000..9316af7f
Binary files /dev/null and b/logos/duniter.png differ
diff --git a/logos/easyappointments.png b/logos/easyappointments.png
new file mode 100644
index 00000000..089645c5
Binary files /dev/null and b/logos/easyappointments.png differ
diff --git a/logos/ecko.png b/logos/ecko.png
new file mode 100644
index 00000000..b747d48a
Binary files /dev/null and b/logos/ecko.png differ
diff --git a/logos/elabftw.png b/logos/elabftw.png
new file mode 100644
index 00000000..87f9e6c0
Binary files /dev/null and b/logos/elabftw.png differ
diff --git a/logos/element.png b/logos/element.png
new file mode 100644
index 00000000..f6008e90
Binary files /dev/null and b/logos/element.png differ
diff --git a/logos/emailpoubelle.png b/logos/emailpoubelle.png
new file mode 100644
index 00000000..4835d488
Binary files /dev/null and b/logos/emailpoubelle.png differ
diff --git a/logos/ethercalc.png b/logos/ethercalc.png
new file mode 100644
index 00000000..64f8fde0
Binary files /dev/null and b/logos/ethercalc.png differ
diff --git a/logos/etherpad_mypads.png b/logos/etherpad_mypads.png
new file mode 100644
index 00000000..7ad54c13
Binary files /dev/null and b/logos/etherpad_mypads.png differ
diff --git a/logos/excalidraw.png b/logos/excalidraw.png
new file mode 100644
index 00000000..913c2396
Binary files /dev/null and b/logos/excalidraw.png differ
diff --git a/logos/ffsync.png b/logos/ffsync.png
new file mode 100644
index 00000000..618e316f
Binary files /dev/null and b/logos/ffsync.png differ
diff --git a/logos/filebrowser.png b/logos/filebrowser.png
new file mode 100644
index 00000000..28f36cad
Binary files /dev/null and b/logos/filebrowser.png differ
diff --git a/logos/firefly-iii.png b/logos/firefly-iii.png
new file mode 100644
index 00000000..42f2fbc4
Binary files /dev/null and b/logos/firefly-iii.png differ
diff --git a/logos/flarum.png b/logos/flarum.png
new file mode 100644
index 00000000..e7a4aacd
Binary files /dev/null and b/logos/flarum.png differ
diff --git a/logos/flood.png b/logos/flood.png
new file mode 100644
index 00000000..eb8cb673
Binary files /dev/null and b/logos/flood.png differ
diff --git a/logos/fluxbb.png b/logos/fluxbb.png
new file mode 100644
index 00000000..2140dc4d
Binary files /dev/null and b/logos/fluxbb.png differ
diff --git a/logos/focalboard.png b/logos/focalboard.png
new file mode 100644
index 00000000..d84d599a
Binary files /dev/null and b/logos/focalboard.png differ
diff --git a/logos/framaforms.png b/logos/framaforms.png
new file mode 100644
index 00000000..1c2b3116
Binary files /dev/null and b/logos/framaforms.png differ
diff --git a/logos/freshrss.png b/logos/freshrss.png
new file mode 100644
index 00000000..0c0dc338
Binary files /dev/null and b/logos/freshrss.png differ
diff --git a/logos/friendica.png b/logos/friendica.png
new file mode 100644
index 00000000..7c9129ef
Binary files /dev/null and b/logos/friendica.png differ
diff --git a/logos/funkwhale.png b/logos/funkwhale.png
new file mode 100644
index 00000000..075aa14f
Binary files /dev/null and b/logos/funkwhale.png differ
diff --git a/logos/ghost.png b/logos/ghost.png
new file mode 100644
index 00000000..8a513763
Binary files /dev/null and b/logos/ghost.png differ
diff --git a/logos/gitea.png b/logos/gitea.png
new file mode 100644
index 00000000..e023d65b
Binary files /dev/null and b/logos/gitea.png differ
diff --git a/logos/gitlab-runner.png b/logos/gitlab-runner.png
new file mode 100644
index 00000000..c11766e1
Binary files /dev/null and b/logos/gitlab-runner.png differ
diff --git a/logos/gitlab.png b/logos/gitlab.png
new file mode 100644
index 00000000..51468474
Binary files /dev/null and b/logos/gitlab.png differ
diff --git a/logos/glowingbear.png b/logos/glowingbear.png
new file mode 100644
index 00000000..46b2ec86
Binary files /dev/null and b/logos/glowingbear.png differ
diff --git a/logos/gogs.png b/logos/gogs.png
new file mode 100644
index 00000000..c07a24cc
Binary files /dev/null and b/logos/gogs.png differ
diff --git a/logos/gotify.png b/logos/gotify.png
new file mode 100644
index 00000000..8711118f
Binary files /dev/null and b/logos/gotify.png differ
diff --git a/logos/grafana.png b/logos/grafana.png
new file mode 100644
index 00000000..cd0a5b43
Binary files /dev/null and b/logos/grafana.png differ
diff --git a/logos/grav.png b/logos/grav.png
new file mode 100644
index 00000000..327ed0bb
Binary files /dev/null and b/logos/grav.png differ
diff --git a/logos/grocy.png b/logos/grocy.png
new file mode 100644
index 00000000..d1b38ae1
Binary files /dev/null and b/logos/grocy.png differ
diff --git a/logos/guacamole.png b/logos/guacamole.png
new file mode 100644
index 00000000..66b42ae0
Binary files /dev/null and b/logos/guacamole.png differ
diff --git a/logos/halcyon.png b/logos/halcyon.png
new file mode 100644
index 00000000..410041b6
Binary files /dev/null and b/logos/halcyon.png differ
diff --git a/logos/headphones.png b/logos/headphones.png
new file mode 100644
index 00000000..ec8d5bc7
Binary files /dev/null and b/logos/headphones.png differ
diff --git a/logos/hedgedoc.png b/logos/hedgedoc.png
new file mode 100644
index 00000000..ba467e35
Binary files /dev/null and b/logos/hedgedoc.png differ
diff --git a/logos/hextris.png b/logos/hextris.png
new file mode 100644
index 00000000..8db52099
Binary files /dev/null and b/logos/hextris.png differ
diff --git a/logos/homeassistant.png b/logos/homeassistant.png
new file mode 100644
index 00000000..65bad62d
Binary files /dev/null and b/logos/homeassistant.png differ
diff --git a/logos/horde.png b/logos/horde.png
new file mode 100644
index 00000000..e83c4b54
Binary files /dev/null and b/logos/horde.png differ
diff --git a/logos/hubzilla.png b/logos/hubzilla.png
new file mode 100644
index 00000000..c578ff10
Binary files /dev/null and b/logos/hubzilla.png differ
diff --git a/logos/huginn.png b/logos/huginn.png
new file mode 100644
index 00000000..c6ac85a8
Binary files /dev/null and b/logos/huginn.png differ
diff --git a/logos/humhub.png b/logos/humhub.png
new file mode 100644
index 00000000..58c95347
Binary files /dev/null and b/logos/humhub.png differ
diff --git a/logos/ihatemoney.png b/logos/ihatemoney.png
new file mode 100644
index 00000000..27beeb26
Binary files /dev/null and b/logos/ihatemoney.png differ
diff --git a/logos/internetarchive.png b/logos/internetarchive.png
new file mode 100644
index 00000000..48558334
Binary files /dev/null and b/logos/internetarchive.png differ
diff --git a/logos/invidious.png b/logos/invidious.png
new file mode 100644
index 00000000..a2b3d833
Binary files /dev/null and b/logos/invidious.png differ
diff --git a/logos/invoiceninja.png b/logos/invoiceninja.png
new file mode 100644
index 00000000..36235b1b
Binary files /dev/null and b/logos/invoiceninja.png differ
diff --git a/logos/invoiceninja5.png b/logos/invoiceninja5.png
new file mode 100644
index 00000000..36235b1b
Binary files /dev/null and b/logos/invoiceninja5.png differ
diff --git a/logos/jackett.png b/logos/jackett.png
new file mode 100644
index 00000000..05b992c7
Binary files /dev/null and b/logos/jackett.png differ
diff --git a/logos/jappix.png b/logos/jappix.png
new file mode 100644
index 00000000..80493819
Binary files /dev/null and b/logos/jappix.png differ
diff --git a/logos/jeedom.png b/logos/jeedom.png
new file mode 100644
index 00000000..45a3dd8c
Binary files /dev/null and b/logos/jeedom.png differ
diff --git a/logos/jellyfin.png b/logos/jellyfin.png
new file mode 100644
index 00000000..4313ab74
Binary files /dev/null and b/logos/jellyfin.png differ
diff --git a/logos/jenkins.png b/logos/jenkins.png
new file mode 100644
index 00000000..cca8fce9
Binary files /dev/null and b/logos/jenkins.png differ
diff --git a/logos/jirafeau.png b/logos/jirafeau.png
new file mode 100644
index 00000000..2d942799
Binary files /dev/null and b/logos/jirafeau.png differ
diff --git a/logos/jitsi.png b/logos/jitsi.png
new file mode 100644
index 00000000..ae65d22e
Binary files /dev/null and b/logos/jitsi.png differ
diff --git a/logos/joomla.png b/logos/joomla.png
new file mode 100644
index 00000000..452ba05e
Binary files /dev/null and b/logos/joomla.png differ
diff --git a/logos/jupyterlab.png b/logos/jupyterlab.png
new file mode 100644
index 00000000..783706f2
Binary files /dev/null and b/logos/jupyterlab.png differ
diff --git a/logos/kanboard.png b/logos/kanboard.png
new file mode 100644
index 00000000..53d8e07a
Binary files /dev/null and b/logos/kanboard.png differ
diff --git a/logos/kavita.png b/logos/kavita.png
new file mode 100644
index 00000000..7132bff9
Binary files /dev/null and b/logos/kavita.png differ
diff --git a/logos/keeweb.png b/logos/keeweb.png
new file mode 100644
index 00000000..9c429c61
Binary files /dev/null and b/logos/keeweb.png differ
diff --git a/logos/kimai2.png b/logos/kimai2.png
new file mode 100644
index 00000000..29118151
Binary files /dev/null and b/logos/kimai2.png differ
diff --git a/logos/kiwiirc.png b/logos/kiwiirc.png
new file mode 100644
index 00000000..356acc0b
Binary files /dev/null and b/logos/kiwiirc.png differ
diff --git a/logos/kodi.png b/logos/kodi.png
new file mode 100644
index 00000000..fa81bf8f
Binary files /dev/null and b/logos/kodi.png differ
diff --git a/logos/komga.png b/logos/komga.png
new file mode 100644
index 00000000..a121dfd0
Binary files /dev/null and b/logos/komga.png differ
diff --git a/logos/kresus.png b/logos/kresus.png
new file mode 100644
index 00000000..c3ae0137
Binary files /dev/null and b/logos/kresus.png differ
diff --git a/logos/laverna.png b/logos/laverna.png
new file mode 100644
index 00000000..86b9419c
Binary files /dev/null and b/logos/laverna.png differ
diff --git a/logos/leed.png b/logos/leed.png
new file mode 100644
index 00000000..fb8211df
Binary files /dev/null and b/logos/leed.png differ
diff --git a/logos/librarian.png b/logos/librarian.png
new file mode 100644
index 00000000..385e356f
Binary files /dev/null and b/logos/librarian.png differ
diff --git a/logos/librephotos.png b/logos/librephotos.png
new file mode 100644
index 00000000..dbbce638
Binary files /dev/null and b/logos/librephotos.png differ
diff --git a/logos/librespeed.png b/logos/librespeed.png
new file mode 100644
index 00000000..a5b71d4e
Binary files /dev/null and b/logos/librespeed.png differ
diff --git a/logos/lidarr.png b/logos/lidarr.png
new file mode 100644
index 00000000..973b368a
Binary files /dev/null and b/logos/lidarr.png differ
diff --git a/logos/limesurvey.png b/logos/limesurvey.png
new file mode 100644
index 00000000..c234869d
Binary files /dev/null and b/logos/limesurvey.png differ
diff --git a/logos/lstu.png b/logos/lstu.png
new file mode 100644
index 00000000..d1ab2142
Binary files /dev/null and b/logos/lstu.png differ
diff --git a/logos/luckysheet.png b/logos/luckysheet.png
new file mode 100644
index 00000000..2ca2155a
Binary files /dev/null and b/logos/luckysheet.png differ
diff --git a/logos/lufi.png b/logos/lufi.png
new file mode 100644
index 00000000..f24397d8
Binary files /dev/null and b/logos/lufi.png differ
diff --git a/logos/lutim.png b/logos/lutim.png
new file mode 100644
index 00000000..37b6c1a6
Binary files /dev/null and b/logos/lutim.png differ
diff --git a/logos/lxd.png b/logos/lxd.png
new file mode 100644
index 00000000..bf8e0b21
Binary files /dev/null and b/logos/lxd.png differ
diff --git a/logos/mailman.png b/logos/mailman.png
new file mode 100644
index 00000000..326dc8f7
Binary files /dev/null and b/logos/mailman.png differ
diff --git a/logos/make_logo_review.sh b/logos/make_logo_review.sh
new file mode 100644
index 00000000..c9b27616
--- /dev/null
+++ b/logos/make_logo_review.sh
@@ -0,0 +1,57 @@
+cat << EOF > logo_review.html
+
+