diff --git a/README.md b/README.md
index 1fe7f6c..eaeb40a 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,7 @@ scan files
## Ideas
+* tabs horizontal stacked for xrforge.max.css
* fuzzy search: https://github.com/ssimonp/FuzzySearch-Roblox
* landingpage = /about
* scan functions in xrforge.lua / .xrforge
diff --git a/src/.init.lua b/src/.init.lua
index 26de663..1888f5a 100644
--- a/src/.init.lua
+++ b/src/.init.lua
@@ -35,10 +35,14 @@ app.init = function() end
app.opts = require('config')(app)
-- load system plugins
-app.plugin.moderation = require('plugin/moderation')
-app.plugin.diskscan = require('plugin/diskscan')
-app.plugin.manyfold = require('plugin/manyfold')
-app.plugin.janusxr = require('plugin/janusxr')
+app.plugin.moderation = require('plugin/moderation')
+app.plugin.diskscan = require('plugin/diskscan')
+app.plugin.manyfold = require('plugin/manyfold')
+app.plugin.janusxr = require('plugin/janusxr')
+app.plugin.git = require('plugin/git')
+app.plugin.clouddrive = require('plugin/clouddrive')
+app.plugin.webhook = require('plugin/webhook')
+app.plugin.markdown = require('plugin/markdown')
-- ensure plugin config-defaults
foreach( app.plugin, function(name,plugin)
diff --git a/src/plugin/clouddrive.lua b/src/plugin/clouddrive.lua
new file mode 100644
index 0000000..9671314
--- /dev/null
+++ b/src/plugin/clouddrive.lua
@@ -0,0 +1,57 @@
+local util = require('util')
+
+app.on('scan_experience', function(exp)
+ --print_r(exp)
+end)
+
+app.on('scan_experience_file', function(exp)
+end)
+
+app.on('set', function(k,v)
+ print("content was updated")
+end)
+
+-- this registers the plugin UI
+local plugin = {
+ name = 'Cloud drives disabled',
+ info = '',
+ opts = {
+ {
+ key='app.opts.plugin_clouddrive_webdir',
+ title='Webdirectory URL',
+ info='scan for experiences in open webdirs (apache/lighttpd/nginx/rclone/archive.org/copyparty)',
+ default="https://archive.org/download/janusxr-1",
+ values=''
+ },
+ {
+ key='app.opts.plugin_clouddrive_remotestorage',
+ title='Remotestorage URL',
+ info='scan for experiences via remotestorage protocol (via 5apps e.g.',
+ default="username@5apps.com",
+ values=''
+ },
+ {
+ key='app.opts.plugin_clouddrive_webdav',
+ title='WebDav URL',
+ info='scan for experiences in WebDav-drive (NextCloud/copyparty e.g.) via rclone',
+ default="",
+ values=''
+ },
+ {
+ key='app.opts.plugin_clouddrive_dropbox',
+ title='Dropbox remote',
+ info='scan for experiences in Dropbox via rclone',
+ default="",
+ values=''
+ },
+ {
+ key='app.opts.plugin_clouddrive_gdrive',
+ title='Gdrive remote',
+ info='scan for experiences in Google Drive via rclone',
+ default="",
+ values=''
+ }
+ }
+}
+
+return plugin
diff --git a/src/plugin/git.lua b/src/plugin/git.lua
new file mode 100644
index 0000000..764329e
--- /dev/null
+++ b/src/plugin/git.lua
@@ -0,0 +1,43 @@
+local util = require('util')
+
+app.on('scan_experience', function(exp)
+ --print_r(exp)
+end)
+
+app.on('scan_experience_file', function(exp)
+end)
+
+app.on('set', function(k,v)
+ print("content was updated")
+end)
+
+-- this registers the plugin UI
+local plugin = {
+ name = 'Git disabled',
+ info = '',
+ opts = {
+ {
+ key='app.opts.plugin_git_repo_1',
+ title='Git repo 1 URL',
+ info='git repository to scan experiences',
+ default="https://codeberg.org/myuser/reponame",
+ values=''
+ },
+ {
+ key='app.opts.plugin_git_repo_2',
+ title='Git repo 2 URL',
+ info='git repository to scan experiences',
+ default="",
+ values=''
+ },
+ {
+ key='app.opts.plugin_git_repo_3',
+ title='Git repo 3 URL',
+ info='git repository to scan experiences',
+ default="",
+ values=''
+ }
+ }
+}
+
+return plugin
diff --git a/src/plugin/markdown.lua b/src/plugin/markdown.lua
new file mode 100644
index 0000000..2a7bc31
--- /dev/null
+++ b/src/plugin/markdown.lua
@@ -0,0 +1,36 @@
+local util = require('util')
+
+app.on('scan_experience', function(exp)
+ --print_r(exp)
+end)
+
+app.on('scan_experience_file', function(exp)
+end)
+
+app.on('set', function(k,v)
+ print("content was updated")
+end)
+
+-- this registers the plugin UI
+local plugin = {
+ name = 'Markdown disabled',
+ info = '',
+ opts = {
+ {
+ key='app.opts.plugin_markdown_files',
+ title='Markdown files',
+ info='Space-separated, lua patterns are allowed',
+ default="README.md",
+ values=''
+ },
+ {
+ key='app.opts.plugin_markdown_strategy',
+ title='Markdown strategy',
+ info='',
+ default="README.md",
+ values={headerparagraph='title is first header + 1st paragraph is description',disabled='disabled'}
+ },
+ }
+}
+
+return plugin
diff --git a/src/plugin/webhook.lua b/src/plugin/webhook.lua
new file mode 100644
index 0000000..27616aa
--- /dev/null
+++ b/src/plugin/webhook.lua
@@ -0,0 +1,57 @@
+local util = require('util')
+
+app.on('scan_experience', function(exp)
+ --print_r(exp)
+end)
+
+app.on('scan_experience_file', function(exp)
+end)
+
+app.on('set', function(k,v)
+ print("content was updated")
+end)
+
+-- this registers the plugin UI
+local plugin = {
+ name = 'Webhooks disabled',
+ info = '',
+ opts = {
+ {
+ key='app.opts.plugin_webhook_method',
+ title='Webhook method',
+ info='http method to use',
+ default="POST",
+ values={POST="POST",GET="GET"}
+ },
+ {
+ key='app.opts.plugin_webhook_format',
+ title='Webhook format',
+ info='http format to use',
+ default="JSON",
+ values={JSON="JSON",text="text"}
+ },
+ {
+ key='app.opts.plugin_webhook_url_1',
+ title='Webhook URL 1',
+ info='URL to trigger when changes occur',
+ default="",
+ values=''
+ },
+ {
+ key='app.opts.plugin_webhook_url_2',
+ title='Webhook URL 2',
+ info='URL to trigger when changes occur',
+ default="",
+ values=''
+ },
+ {
+ key='app.opts.plugin_webhook_url_3',
+ title='Webhook URL 3',
+ info='URL to trigger when changes occur',
+ default="",
+ values=''
+ }
+ }
+}
+
+return plugin