diff --git a/docs/content/docs/usage/shortcuts.md b/docs/content/docs/usage/shortcuts.md
index 8063dfbd44..0a205912b9 100644
--- a/docs/content/docs/usage/shortcuts.md
+++ b/docs/content/docs/usage/shortcuts.md
@@ -5,47 +5,4 @@ weight = 70
selfoss offers some keyboard shortcuts. They are very similar to what Google Reader used:
-
-- space
-- select and open next entry
-- j
-- select and open next entry
-- n
-- select next entry
-- →
-- select next entry (and open it when the current is open)
-- shift+space
-- select and open previous entry
-- k
-- select and open previous entry
-- p
-- select previous entry
-- ←
-- select previous entry (and open it when the current is open)
-- s
-- mark and unmark current selected entry as starred/unstarred
-- m
-- mark and unmark current selected entry as read/unread
-- t
-- throw current item (mark as read and open next)
-- shift+t
-- throw current item (mark as read and open previous)
-- v
-- open url of current entry in new tab/window
-- shift+v
-- open url of current entry in new tab/window and mark read
-- ctrl+m
-- mark all as read
-- r
-- reload the list
-- o
-- open / close current item
-- shift+o
-- close all open items
-- shift+n
-- open newest items page
-- shift+u
-- open unread items page
-- shift+s
-- open starred items page
-
+{{ shortcuts(path="static/shortcuts.json") }}
diff --git a/docs/static/shortcuts.json b/docs/static/shortcuts.json
new file mode 100644
index 0000000000..24841e5ca5
--- /dev/null
+++ b/docs/static/shortcuts.json
@@ -0,0 +1,90 @@
+[
+ {
+ "key": "space",
+ "description": "select and open next entry"
+ },
+ {
+ "key": "j",
+ "description": "select and open next entry"
+ },
+ {
+ "key": "n",
+ "description": "select next entry"
+ },
+ {
+ "key": "→",
+ "description": "select next entry (and open it when the current is open)"
+ },
+ {
+ "key": "space",
+ "shift": true,
+ "description": "select and open previous entry"
+ },
+ {
+ "key": "k",
+ "description": "select and open previous entry"
+ },
+ {
+ "key": "p",
+ "description": "select previous entry"
+ },
+ {
+ "key": "←",
+ "description": "select previous entry (and open it when the current is open)"
+ },
+ {
+ "key": "s",
+ "description": "mark and unmark current selected entry as starred/unstarred"
+ },
+ {
+ "key": "m",
+ "description": "mark and unmark current selected entry as read/unread"
+ },
+ {
+ "key": "t",
+ "description": "throw current item (mark as read and open next)"
+ },
+ {
+ "key": "t",
+ "shift": true,
+ "description": "throw current item (mark as read and open previous)"
+ },
+ {
+ "key": "v",
+ "description": "open url of current entry in new tab/window"
+ },
+ {
+ "key": "v",
+ "shift": true,
+ "description": "open url of current entry in new tab/window and mark read"
+ },
+ {
+ "key": "m",
+ "ctrl": true,
+ "description": "mark all as read"
+ },
+ {
+ "key": "o",
+ "description": "open / close current item"
+ },
+ {
+ "key": "o",
+ "shift": true,
+ "description": "close all open items"
+ },
+ {
+ "key": "n",
+ "shift": true,
+ "description": "open newest items page"
+ },
+ {
+ "key": "u",
+ "shift": true,
+ "description": "open unread items page"
+ },
+ {
+ "key": "s",
+ "shift": true,
+ "description": "open starred items page"
+ }
+]
diff --git a/docs/templates/shortcodes/shortcuts.html b/docs/templates/shortcodes/shortcuts.html
new file mode 100644
index 0000000000..280354925b
--- /dev/null
+++ b/docs/templates/shortcodes/shortcuts.html
@@ -0,0 +1,7 @@
+{% set shortcuts = load_data(path=path) %}
+
+ {% for shortcut in shortcuts %}
+ - {% if shortcut.ctrl %}ctrl + {% endif %}{% if shortcut.shift %}shift + {% endif %}{{ shortcut.key }}
+ - {{ shortcut.description }}
+ {% endfor %}
+