From 29a54dc7c3a5d1a614c2a24cfb65071187112580 Mon Sep 17 00:00:00 2001
From: Volker Schukai <volker.schukai@schukai.com>
Date: Wed, 31 Aug 2022 00:35:44 +0200
Subject: [PATCH] chore: commit save point

---
 .gitignore                                    | 504 +++++++++++++++++
 .idea/runConfigurations/release_print.xml     |  11 +
 .idea/runConfigurations/server_serve.xml      |  11 +
 Makefile                                      |  71 +++
 README.md                                     |  92 ---
 .../source/command/cmd-release-print.go       |  15 +
 application/source/command/cmd-release.go     |   5 +
 .../source/command/cmd-server-serve.go        |  25 +
 application/source/command/cmd-server.go      |   5 +
 application/source/command/cmd.go             |  30 +
 application/source/command/execute.go         |  55 ++
 application/source/command/handler.go         |   5 +
 .../source/configuration/definition.go        |  40 ++
 .../source/configuration/getter-setter.go     |  98 ++++
 application/source/configuration/init.go      | 108 ++++
 application/source/configuration/sanitize.go  |  69 +++
 application/source/configuration/util.go      |  24 +
 application/source/constants/context.go       |  12 +
 application/source/error/console.go           |  47 ++
 application/source/error/http-errors.go       |  39 ++
 application/source/error/http.go              | 181 ++++++
 application/source/error/user.go              |   7 +
 application/source/files/httpfs.go            |  88 +++
 application/source/go.mod                     |  29 +
 application/source/go.sum                     | 159 ++++++
 application/source/header/header.go           | 131 +++++
 application/source/header/request-id.go       |  53 ++
 application/source/logging/logger.go          |  87 +++
 application/source/main.go                    |   7 +
 application/source/negotiator/main.go         |  99 ++++
 application/source/negotiator/parser.go       | 136 +++++
 application/source/release/accessor.go        |   7 +
 application/source/release/info.go            |  34 ++
 application/source/release/release.go         |   9 +
 application/source/response/standard.go       |  60 ++
 application/source/server/config.go           |   1 +
 application/source/server/reload.go           |  16 +
 application/source/server/routing.go          |  36 ++
 application/source/server/start.go            |  33 ++
 application/source/server/webmanifest.go      | 107 ++++
 application/source/session/check.go           |   1 +
 application/source/session/definition.go      |  10 +
 application/source/util/merge.go              |  44 ++
 application/source/watch/dataset.go           |  81 +++
 application/source/watch/hashsum.go           | 102 ++++
 application/source/watch/resources.go         | 278 ++++++++++
 application/source/websocket/connection.go    | 111 ++++
 development/examples/e1/config.yaml           |  28 +
 development/examples/e1/package.json          |  15 +
 development/examples/e1/pnpm-lock.yaml        | 227 ++++++++
 development/examples/e1/src/main.js           |   1 +
 development/examples/e1/web/hello.html        |  10 +
 development/examples/e1/web/scripts/bundle.js |   5 +
 .../examples/e1/web/scripts/bundle.js.map     |   7 +
 development/makefile/color.mk                 |  17 +
 development/makefile/directories-standard.mk  |  47 ++
 development/makefile/gitignore.mk             | 522 ++++++++++++++++++
 development/makefile/go.mk                    |  12 +
 development/makefile/jsdoc-json.mk            | 115 ++++
 development/makefile/jsdoc.mk                 |  12 +
 development/makefile/license-agpl3.mk         |  13 +
 development/makefile/node.mk                  |  51 ++
 development/makefile/output.mk                |  54 ++
 development/makefile/placeholder.mk           |   9 +
 development/makefile/s3.mk                    |  14 +
 development/makefile/target-caddy.mk          |  23 +
 development/makefile/target-deploy-tool.mk    |  20 +
 development/makefile/target-docman.mk         |  39 ++
 development/makefile/target-git.mk            |  47 ++
 development/makefile/target-go-build.mk       |  22 +
 .../makefile/target-go-fetch-licenses.mk      |  26 +
 development/makefile/target-help.mk           |  46 ++
 development/makefile/target-init-standard.mk  |  20 +
 development/makefile/target-jekyll.mk         |   0
 development/makefile/target-jsdoc-build.mk    |  23 +
 development/makefile/target-minerva.mk        |   0
 development/makefile/target-node-build.mk     |  26 +
 development/makefile/target-node-test.mk      |  20 +
 development/makefile/target-npm-publish.mk    |  32 ++
 .../makefile/target-update-makefiles.mk       |  23 +
 development/makefile/target-variable.mk       |  12 +
 development/makefile/terminal-check.mk        |  13 +
 development/makefile/terminal.mk              |  42 ++
 development/makefile/version.mk               |  40 ++
 project.mk                                    |   4 +
 release.json                                  |   1 +
 86 files changed, 4719 insertions(+), 92 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 .idea/runConfigurations/release_print.xml
 create mode 100644 .idea/runConfigurations/server_serve.xml
 create mode 100644 Makefile
 delete mode 100644 README.md
 create mode 100644 application/source/command/cmd-release-print.go
 create mode 100644 application/source/command/cmd-release.go
 create mode 100644 application/source/command/cmd-server-serve.go
 create mode 100644 application/source/command/cmd-server.go
 create mode 100644 application/source/command/cmd.go
 create mode 100644 application/source/command/execute.go
 create mode 100644 application/source/command/handler.go
 create mode 100644 application/source/configuration/definition.go
 create mode 100644 application/source/configuration/getter-setter.go
 create mode 100644 application/source/configuration/init.go
 create mode 100644 application/source/configuration/sanitize.go
 create mode 100644 application/source/configuration/util.go
 create mode 100644 application/source/constants/context.go
 create mode 100644 application/source/error/console.go
 create mode 100644 application/source/error/http-errors.go
 create mode 100644 application/source/error/http.go
 create mode 100644 application/source/error/user.go
 create mode 100644 application/source/files/httpfs.go
 create mode 100644 application/source/go.mod
 create mode 100644 application/source/go.sum
 create mode 100644 application/source/header/header.go
 create mode 100644 application/source/header/request-id.go
 create mode 100644 application/source/logging/logger.go
 create mode 100644 application/source/main.go
 create mode 100644 application/source/negotiator/main.go
 create mode 100644 application/source/negotiator/parser.go
 create mode 100644 application/source/release/accessor.go
 create mode 100644 application/source/release/info.go
 create mode 100644 application/source/release/release.go
 create mode 100644 application/source/response/standard.go
 create mode 100644 application/source/server/config.go
 create mode 100644 application/source/server/reload.go
 create mode 100644 application/source/server/routing.go
 create mode 100644 application/source/server/start.go
 create mode 100644 application/source/server/webmanifest.go
 create mode 100644 application/source/session/check.go
 create mode 100644 application/source/session/definition.go
 create mode 100644 application/source/util/merge.go
 create mode 100644 application/source/watch/dataset.go
 create mode 100644 application/source/watch/hashsum.go
 create mode 100644 application/source/watch/resources.go
 create mode 100644 application/source/websocket/connection.go
 create mode 100644 development/examples/e1/config.yaml
 create mode 100644 development/examples/e1/package.json
 create mode 100644 development/examples/e1/pnpm-lock.yaml
 create mode 100644 development/examples/e1/src/main.js
 create mode 100644 development/examples/e1/web/hello.html
 create mode 100644 development/examples/e1/web/scripts/bundle.js
 create mode 100644 development/examples/e1/web/scripts/bundle.js.map
 create mode 100644 development/makefile/color.mk
 create mode 100644 development/makefile/directories-standard.mk
 create mode 100644 development/makefile/gitignore.mk
 create mode 100644 development/makefile/go.mk
 create mode 100644 development/makefile/jsdoc-json.mk
 create mode 100644 development/makefile/jsdoc.mk
 create mode 100644 development/makefile/license-agpl3.mk
 create mode 100644 development/makefile/node.mk
 create mode 100644 development/makefile/output.mk
 create mode 100644 development/makefile/placeholder.mk
 create mode 100644 development/makefile/s3.mk
 create mode 100644 development/makefile/target-caddy.mk
 create mode 100644 development/makefile/target-deploy-tool.mk
 create mode 100644 development/makefile/target-docman.mk
 create mode 100644 development/makefile/target-git.mk
 create mode 100644 development/makefile/target-go-build.mk
 create mode 100644 development/makefile/target-go-fetch-licenses.mk
 create mode 100644 development/makefile/target-help.mk
 create mode 100644 development/makefile/target-init-standard.mk
 create mode 100644 development/makefile/target-jekyll.mk
 create mode 100644 development/makefile/target-jsdoc-build.mk
 create mode 100644 development/makefile/target-minerva.mk
 create mode 100644 development/makefile/target-node-build.mk
 create mode 100644 development/makefile/target-node-test.mk
 create mode 100644 development/makefile/target-npm-publish.mk
 create mode 100644 development/makefile/target-update-makefiles.mk
 create mode 100644 development/makefile/target-variable.mk
 create mode 100644 development/makefile/terminal-check.mk
 create mode 100644 development/makefile/terminal.mk
 create mode 100644 development/makefile/version.mk
 create mode 100644 project.mk
 create mode 100644 release.json

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea4f9c4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,504 @@
+# Created by https://www.toptal.com/developers/gitignore/api/intellij+iml,phpunit,git,vim,visualstudiocode,phpstorm,go,intellij+all,netbeans,dbeaver,node,yarn
+# Edit at https://www.toptal.com/developers/gitignore?templates=intellij+iml,phpunit,git,vim,visualstudiocode,phpstorm,go,intellij+all,netbeans,dbeaver,node,yarn
+
+### DBeaver ###
+# ide config file
+.dbeaver-data-sources*.xml
+
+### Git ###
+# Created by git for backups. To disable backups in Git:
+# git config --global mergetool.keepBackup false
+*.orig
+
+# Created by git when using merge tools for conflicts
+*.BACKUP.*
+*.BASE.*
+*.LOCAL.*
+*.REMOTE.*
+*_BACKUP_*.txt
+*_BASE_*.txt
+*_LOCAL_*.txt
+*_REMOTE_*.txt
+
+### Go ###
+# If you prefer the allow list template instead of the deny list, see community template:
+# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
+#
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+# Test binary, built with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+# Dependency directories (remove the comment below to include it)
+# vendor/
+
+# Go workspace file
+go.work
+
+### Go Patch ###
+/vendor/
+/Godeps/
+
+### Intellij+all ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij+all Patch ###
+# Ignore everything but code style settings and run configurations
+# that are supposed to be shared within teams.
+
+.idea/*
+
+!.idea/codeStyles
+!.idea/runConfigurations
+
+### Intellij+iml ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+
+# AWS User-specific
+
+# Generated files
+
+# Sensitive or high-churn files
+
+# Gradle
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+
+# Mongo Explorer plugin
+
+# File-based project format
+
+# IntelliJ
+
+# mpeltonen/sbt-idea plugin
+
+# JIRA plugin
+
+# Cursive Clojure plugin
+
+# SonarLint plugin
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+
+# Editor-based Rest Client
+
+# Android studio 3.1+ serialized cache file
+
+### Intellij+iml Patch ###
+# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
+
+*.iml
+modules.xml
+.idea/misc.xml
+*.ipr
+
+### NetBeans ###
+**/nbproject/private/
+**/nbproject/Makefile-*.mk
+**/nbproject/Package-*.bash
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+### Node ###
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+.pnpm-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional stylelint cache
+.stylelintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variable files
+.env
+.env.development.local
+.env.test.local
+.env.production.local
+.env.local
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# vuepress v2.x temp and cache directory
+.temp
+
+# Docusaurus cache and generated files
+.docusaurus
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
+
+### Node Patch ###
+# Serverless Webpack directories
+.webpack/
+
+# Optional stylelint cache
+
+# SvelteKit build / generate output
+.svelte-kit
+
+### PhpStorm ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+
+# AWS User-specific
+
+# Generated files
+
+# Sensitive or high-churn files
+
+# Gradle
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+
+# Mongo Explorer plugin
+
+# File-based project format
+
+# IntelliJ
+
+# mpeltonen/sbt-idea plugin
+
+# JIRA plugin
+
+# Cursive Clojure plugin
+
+# SonarLint plugin
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+
+# Editor-based Rest Client
+
+# Android studio 3.1+ serialized cache file
+
+### PhpStorm Patch ###
+# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
+
+# *.iml
+# modules.xml
+# .idea/misc.xml
+# *.ipr
+
+# Sonarlint plugin
+# https://plugins.jetbrains.com/plugin/7973-sonarlint
+.idea/**/sonarlint/
+
+# SonarQube Plugin
+# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
+.idea/**/sonarIssues.xml
+
+# Markdown Navigator plugin
+# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
+.idea/**/markdown-navigator.xml
+.idea/**/markdown-navigator-enh.xml
+.idea/**/markdown-navigator/
+
+# Cache file creation bug
+# See https://youtrack.jetbrains.com/issue/JBR-2257
+.idea/ACHE_FILE
+# CodeStream plugin
+# https://plugins.jetbrains.com/plugin/12206-codestream
+.idea/codestream.xml
+
+# Azure Toolkit for IntelliJ plugin
+# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
+.idea/**/azureSettings.xml
+
+### PHPUnit ###
+# Covers PHPUnit
+# Reference: https://phpunit.de/
+
+# Generated files
+.phpunit.result.cache
+.phpunit.cache
+
+# PHPUnit
+/app/phpunit.xml
+/phpunit.xml
+
+# Build data
+/build/
+
+### Vim ###
+# Swap
+[._]*.s[a-v][a-z]
+!*.svg  # comment out if you don't need vector files
+[._]*.sw[a-p]
+[._]s[a-rt-v][a-z]
+[._]ss[a-gi-z]
+[._]sw[a-p]
+
+# Session
+Session.vim
+Sessionx.vim
+
+# Temporary
+.netrwhist
+*~
+# Auto-generated tag files
+tags
+# Persistent undo
+[._]*.un~
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+!.vscode/*.code-snippets
+
+# Local History for Visual Studio Code
+.history/
+
+# Built Visual Studio Code Extensions
+*.vsix
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+.ionide
+
+# Support for Project snippet scope
+.vscode/*.code-snippets
+
+# Ignore code-workspaces
+*.code-workspace
+
+### yarn ###
+# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
+
+.yarn/*
+!.yarn/releases
+!.yarn/patches
+!.yarn/plugins
+!.yarn/sdks
+!.yarn/versions
+
+# if you are NOT using Zero-installs, then:
+# comment the following lines
+!.yarn/cache
+
+# and uncomment the following lines
+# .pnp.*
+
diff --git a/.idea/runConfigurations/release_print.xml b/.idea/runConfigurations/release_print.xml
new file mode 100644
index 0000000..567033b
--- /dev/null
+++ b/.idea/runConfigurations/release_print.xml
@@ -0,0 +1,11 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="release print" type="GoApplicationRunConfiguration" factoryName="Go Application">
+    <module name="conan" />
+    <working_directory value="$PROJECT_DIR$" />
+    <parameters value="--config=development/examples/e1/config.yaml release print" />
+    <kind value="DIRECTORY" />
+    <directory value="$PROJECT_DIR$/application/source" />
+    <filePath value="$PROJECT_DIR$/application/source/main.go" />
+    <method v="2" />
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/.idea/runConfigurations/server_serve.xml b/.idea/runConfigurations/server_serve.xml
new file mode 100644
index 0000000..1aec316
--- /dev/null
+++ b/.idea/runConfigurations/server_serve.xml
@@ -0,0 +1,11 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="server serve" type="GoApplicationRunConfiguration" factoryName="Go Application">
+    <module name="conan" />
+    <working_directory value="$PROJECT_DIR$/development/examples/e1" />
+    <parameters value="--config=development/examples/e1/config.yaml server serve" />
+    <kind value="DIRECTORY" />
+    <directory value="$PROJECT_DIR$/application/source" />
+    <filePath value="$PROJECT_DIR$/application/source/main.go" />
+    <method v="2" />
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..74b3d0a
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,71 @@
+#############################################################################################
+#############################################################################################
+##
+## PROJECT-DEFINITIONS
+##
+#############################################################################################
+#############################################################################################
+
+COMPONENT_NAME        := Monster
+
+#############################################################################################
+#############################################################################################
+##
+## MORE GENERAL BLOCK WITH STANDARD DEFINITIONS
+##
+#############################################################################################
+#############################################################################################
+
+# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
+THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
+PROJECT_ROOT:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)/
+THIS_MAKEFILE:=$(PROJECT_ROOT)$(THIS_MAKEFILE_PATH)
+
+
+-include $(PROJECT_ROOT)project.mk
+
+
+## Define the location of Makefiles
+MAKEFILE_IMPORT_PATH?=$(PROJECT_ROOT)makefiles/
+-include $(MAKEFILE_IMPORT_PATH)project.mk
+
+#############################################################################################
+#############################################################################################
+##
+## INCLUSION OF VARIOUS STANDARD RULES
+##
+#############################################################################################
+#############################################################################################
+
+include $(MAKEFILE_IMPORT_PATH)directories-standard.mk
+#include $(MAKEFILE_IMPORT_PATH)jsdoc.mk
+include $(MAKEFILE_IMPORT_PATH)output.mk
+include $(MAKEFILE_IMPORT_PATH)placeholder.mk
+#include $(MAKEFILE_IMPORT_PATH)s3.mk
+#include $(MAKEFILE_IMPORT_PATH)license-agpl3.mk
+#include $(MAKEFILE_IMPORT_PATH)jsdoc-json.mk
+#include $(MAKEFILE_IMPORT_PATH)go.mk
+include $(MAKEFILE_IMPORT_PATH)gitignore.mk
+include $(MAKEFILE_IMPORT_PATH)color.mk
+include $(MAKEFILE_IMPORT_PATH)version.mk
+#include $(MAKEFILE_IMPORT_PATH)node.mk
+include $(MAKEFILE_IMPORT_PATH)terminal.mk
+#include $(MAKEFILE_IMPORT_PATH)target-go-fetch-licenses.mk
+#include $(MAKEFILE_IMPORT_PATH)target-deploy-tool.mk
+#include $(MAKEFILE_IMPORT_PATH)target-jsdoc-build.mk
+#include $(MAKEFILE_IMPORT_PATH)target-jekyll.mk
+#include $(MAKEFILE_IMPORT_PATH)target-minerva.mk
+#include $(MAKEFILE_IMPORT_PATH)target-docman.mk
+#include $(MAKEFILE_IMPORT_PATH)target-node-build.mk
+#include $(MAKEFILE_IMPORT_PATH)target-caddy.mk
+include $(MAKEFILE_IMPORT_PATH)target-update-makefiles.mk
+include $(MAKEFILE_IMPORT_PATH)target-help.mk
+#include $(MAKEFILE_IMPORT_PATH)target-go-build.mk
+#include $(MAKEFILE_IMPORT_PATH)target-node-test.mk
+#include $(MAKEFILE_IMPORT_PATH)target-npm-publish.mk
+include $(MAKEFILE_IMPORT_PATH)target-git.mk
+include $(MAKEFILE_IMPORT_PATH)target-variable.mk	
+include $(MAKEFILE_IMPORT_PATH)terminal-check.mk
+
+
+#############################################################################################
diff --git a/README.md b/README.md
deleted file mode 100644
index 40e4090..0000000
--- a/README.md
+++ /dev/null
@@ -1,92 +0,0 @@
-# Conan
-
-
-
-## Getting started
-
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
-
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
-
-## Add your files
-
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
-
-```
-cd existing_repo
-git remote add origin https://gitlab.schukai.com/oss/utilities/conan.git
-git branch -M master
-git push -uf origin master
-```
-
-## Integrate with your tools
-
-- [ ] [Set up project integrations](https://gitlab.schukai.com/oss/utilities/conan/-/settings/integrations)
-
-## Collaborate with your team
-
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
-
-## Test and Deploy
-
-Use the built-in continuous integration in GitLab.
-
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
-
-***
-
-# Editing this README
-
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template.
-
-## Suggestions for a good README
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
-
-## Name
-Choose a self-explaining name for your project.
-
-## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
-
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
-
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
-
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
-
-## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
-
-## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
-
-## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
-
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
-
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
-
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
-
-## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
-
-## License
-For open source projects, say how it is licensed.
-
-## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
diff --git a/application/source/command/cmd-release-print.go b/application/source/command/cmd-release-print.go
new file mode 100644
index 0000000..3ac8718
--- /dev/null
+++ b/application/source/command/cmd-release-print.go
@@ -0,0 +1,15 @@
+package command
+
+import (
+	"fmt"
+	"gitlab.schukai.com/oss/utilities/conan/release"
+)
+
+type ReleasePrintCommand struct {
+}
+
+func (r *ReleasePrintCommand) execute() {
+	fmt.Println("Mnemonic: ", release.GetMnemonic())
+	fmt.Println("Version: ", release.GetVersion())
+	fmt.Println("Build: ", release.GetBuild())
+}
diff --git a/application/source/command/cmd-release.go b/application/source/command/cmd-release.go
new file mode 100644
index 0000000..c16e5db
--- /dev/null
+++ b/application/source/command/cmd-release.go
@@ -0,0 +1,5 @@
+package command
+
+type ReleaseCommand struct {
+	Print ReleasePrintCommand `command:"print" alias:"p" description:"Print release information"`
+}
diff --git a/application/source/command/cmd-server-serve.go b/application/source/command/cmd-server-serve.go
new file mode 100644
index 0000000..f874153
--- /dev/null
+++ b/application/source/command/cmd-server-serve.go
@@ -0,0 +1,25 @@
+package command
+
+import (
+	"gitlab.schukai.com/oss/utilities/conan/configuration"
+	"gitlab.schukai.com/oss/utilities/conan/logging"
+	"gitlab.schukai.com/oss/utilities/conan/server"
+)
+
+type ServerServeCommand struct {
+	Port    string `long:"port" short:"p" description:"Port to listen on"`
+	Address string `long:"address" short:"a" description:"Address to serve on"`
+	WebPath string `long:"web-path" short:"w" description:"Path to web files"`
+}
+
+func (r *ServerServeCommand) execute() {
+
+	configuration.SetServerPort(r.Port)
+	configuration.SetServerAddress(r.Address)
+	configuration.SetServerWebPath(r.WebPath)
+
+	logging.InitLogger()
+
+	server.Start()
+
+}
diff --git a/application/source/command/cmd-server.go b/application/source/command/cmd-server.go
new file mode 100644
index 0000000..42042ae
--- /dev/null
+++ b/application/source/command/cmd-server.go
@@ -0,0 +1,5 @@
+package command
+
+type ServerCommand struct {
+	Serve ServerServeCommand `command:"serve" alias:"s" description:"Serve the application"`
+}
diff --git a/application/source/command/cmd.go b/application/source/command/cmd.go
new file mode 100644
index 0000000..f0a8e11
--- /dev/null
+++ b/application/source/command/cmd.go
@@ -0,0 +1,30 @@
+package command
+
+import "github.com/jessevdk/go-flags"
+
+type CommandsStruct struct {
+	ConfigPath string         `long:"config" short:"c" description:"Path to configuration file"`
+	Release    ReleaseCommand `command:"release" alias:"r" description:"Release commands"`
+	Server     ServerCommand  `command:"server" alias:"s" description:"Start server and listen for requests"`
+}
+
+type commandsStruct struct {
+	parser     *flags.Parser
+	definition *CommandsStruct
+	handler    map[string]handler
+}
+
+var cmdInst *commandsStruct
+
+func init() {
+	cmdInst = &commandsStruct{}
+	cmdInst.definition = &CommandsStruct{}
+	cmdInst.handler = make(map[string]handler)
+
+	registerCommandHandler("release-print", &cmdInst.definition.Release.Print)
+	registerCommandHandler("server-serve", &cmdInst.definition.Server.Serve)
+}
+
+func registerCommandHandler(name string, handler handler) {
+	cmdInst.handler[name] = handler
+}
diff --git a/application/source/command/execute.go b/application/source/command/execute.go
new file mode 100644
index 0000000..dbc3ef7
--- /dev/null
+++ b/application/source/command/execute.go
@@ -0,0 +1,55 @@
+package command
+
+import (
+	"github.com/jessevdk/go-flags"
+	"gitlab.schukai.com/oss/utilities/conan/configuration"
+	error2 "gitlab.schukai.com/oss/utilities/conan/error"
+	"gitlab.schukai.com/oss/utilities/conan/release"
+)
+
+func Execute() {
+
+	cmdInst.parser = flags.NewParser(cmdInst.definition, flags.Default)
+
+	_, err := cmdInst.parser.Parse()
+	if err != nil {
+		return
+	}
+
+	configuration.InitConfiguration(cmdInst.definition.ConfigPath, release.GetMnemonic())
+
+	c := cmdInst.parser.Command
+	if c == nil || c.Active == nil {
+		error2.PrintErrorAndExit("No command specified")
+	}
+
+	name := getActiveCommandName(c.Active, "")
+	if name == "" {
+		error2.PrintErrorAndExit("Unknown command: " + c.Name)
+	}
+
+	p, ok := cmdInst.handler[name]
+	if !ok {
+		error2.PrintErrorAndExit("No handler for command: " + name)
+	}
+
+	p.execute()
+
+}
+
+func getActiveCommandName(c *flags.Command, base string) string {
+	if c == nil {
+		return base
+	}
+
+	if c.Active != nil {
+		return getActiveCommandName(c.Active, c.Name)
+	}
+
+	if base != "" {
+		base = base + "-"
+	}
+
+	return base + c.Name
+
+}
diff --git a/application/source/command/handler.go b/application/source/command/handler.go
new file mode 100644
index 0000000..3a43a1b
--- /dev/null
+++ b/application/source/command/handler.go
@@ -0,0 +1,5 @@
+package command
+
+type handler interface {
+	execute()
+}
diff --git a/application/source/configuration/definition.go b/application/source/configuration/definition.go
new file mode 100644
index 0000000..d821ede
--- /dev/null
+++ b/application/source/configuration/definition.go
@@ -0,0 +1,40 @@
+package configuration
+
+type Settings map[string]interface{}
+type ClientAddress *Client
+
+type Client struct {
+	Endpoints struct {
+		Messages string `env:"CLIENT_ENDPOINT_MESSAGES,default=/messages" yaml:"Messages" json:"Messages"`
+	} `yaml:"Endpoints" json:"Endpoints"`
+	Settings `yaml:"Settings" json:"Settings"`
+}
+
+type Watch struct {
+	Path    string   `yaml:"Path" json:"Path"`
+	Command string   `yaml:"Command" json:"Command"`
+	Exclude []string `yaml:"Exclude" json:"Exclude"`
+}
+
+type ConfigStruct struct {
+	Server struct {
+		Address string `env:"SERVER_ADDRESS" yaml:"Address"`
+		Host    string `env:"SERVER_HOST" yaml:"Host"`
+		Port    int    `env:"SERVER_PORT,default=8080" yaml:"Port"`
+		Path    struct {
+			Web      string `env:"SERVER_PATH_WEB,default=web/" yaml:"Web"`
+			Source   string `env:"SERVER_PATH_SOURCE,default=source/" yaml:"Source"`
+			Resource string `env:"SERVER_PATH_RESOURCE" yaml:"Resource"`
+		} `yaml:"Path"`
+		Logging struct {
+			Level string `env:"SERVER_LOGGING_LEVEL,default=info" yaml:"Level"`
+		}
+		Flags struct {
+			Debug          bool `env:"SERVER_FLAGS_DEBUG,default=false" yaml:"Debug"`
+			FollowSymlinks bool `env:"SERVER_FLAGS_FOLLOW_SYMLINKS,default=false" yaml:"FollowSymlinks"`
+		} `yaml:"Flags"`
+		Watch []Watch `yaml:"Watch"`
+	} `yaml:"Server"`
+
+	Client Client `yaml:"Client" json:"Client"`
+}
diff --git a/application/source/configuration/getter-setter.go b/application/source/configuration/getter-setter.go
new file mode 100644
index 0000000..d0d79bf
--- /dev/null
+++ b/application/source/configuration/getter-setter.go
@@ -0,0 +1,98 @@
+package configuration
+
+import (
+	error2 "gitlab.schukai.com/oss/utilities/conan/error"
+	"net/url"
+	"strconv"
+)
+
+func GetConfigurationPath() string {
+	return configurationPath
+}
+
+func GetWatch() []Watch {
+	return configurationInstance.Server.Watch
+}
+
+func GetServerFlagFollowSymlinks() bool {
+	return configurationInstance.Server.Flags.FollowSymlinks
+}
+
+func GetServerLoglevel() string {
+	return configurationInstance.Server.Logging.Level
+}
+
+func GetClientMessagesEndpointPath() string {
+	u, err := url.ParseRequestURI(configurationInstance.Client.Endpoints.Messages)
+	error2.CheckError(err)
+	return u.Path
+}
+
+func GetClientMessagesEndpoint() string {
+	return configurationInstance.Client.Endpoints.Messages
+}
+
+func SetServerPort(port string) {
+
+	if port == "" {
+		return
+	}
+
+	p, err := strconv.Atoi(port)
+	error2.CheckError(err)
+	configurationInstance.Server.Port = p
+}
+
+func SetServerHost(host string) {
+
+	if host == "" {
+		return
+	}
+
+	configurationInstance.Server.Host = host
+}
+func SetServerAddress(address string) {
+
+	if address == "" {
+		return
+	}
+
+	configurationInstance.Server.Address = address
+}
+
+func SetServerWebPath(path string) {
+
+	if path == "" {
+		return
+	}
+
+	configurationInstance.Server.Path.Web = path
+}
+
+func GetServerPort() string {
+	return strconv.FormatInt(int64(configurationInstance.Server.Port), 10)
+}
+
+func GetServerAddress() string {
+	return configurationInstance.Server.Address
+}
+
+func GetServerHost() string {
+	return configurationInstance.Server.Host
+}
+
+func GetServerWebPath() string {
+	return getAbsolutePath(configurationInstance.Server.Path.Web)
+}
+
+func GetServerSourcePath() string {
+	return getAbsolutePath(configurationInstance.Server.Path.Source)
+}
+
+func IsResourcePathSet() bool {
+	return configurationInstance.Server.Path.Resource != ""
+}
+
+func GetResourcePath() string {
+	return getAbsolutePath(configurationInstance.Server.Path.Resource)
+}
diff --git a/application/source/configuration/init.go b/application/source/configuration/init.go
new file mode 100644
index 0000000..b210216
--- /dev/null
+++ b/application/source/configuration/init.go
@@ -0,0 +1,108 @@
+package configuration
+
+import (
+	"context"
+	envconfig "github.com/sethvargo/go-envconfig"
+	"gitlab.schukai.com/oss/utilities/conan/constants"
+	error2 "gitlab.schukai.com/oss/utilities/conan/error"
+	"gitlab.schukai.com/oss/utilities/conan/logging"
+	"gopkg.in/yaml.v3"
+	"os"
+	"os/user"
+	"path"
+	"strings"
+)
+
+var configurationInstance *ConfigStruct
+var configurationPath string
+
+func init() {
+	configurationInstance = &ConfigStruct{}
+	configurationInstance.Client = NewClient()
+
+}
+
+func NewClient() Client {
+	c := Client{}
+	c.Settings = Settings{}
+	return c
+}
+
+func GetConfiguration() *ConfigStruct {
+	return configurationInstance
+}
+
+func GetDefaultClientConfiguration() Client {
+	return configurationInstance.Client
+}
+
+func InitConfiguration(cfgPath, mnemonic string) {
+
+	userConfig := ""
+
+	usr, err := user.Current()
+	if err == nil {
+		userConfig = path.Join(usr.HomeDir, ".config", mnemonic, constants.ConfigFileName)
+	}
+
+	var currentConfigPath string
+
+	current, err := os.Getwd()
+	if err == nil {
+		currentConfigPath = path.Join(current, constants.ConfigFileName)
+	}
+
+	etcConfigPath := path.Join("/etc", mnemonic, constants.ConfigFileName)
+
+	if cfgPath != "" && !path.IsAbs(cfgPath) {
+		cfgPath = path.Join(current, cfgPath)
+	}
+
+	ctx := context.Background()
+
+	l := envconfig.PrefixLookuper(strings.ReplaceAll(strings.ToUpper(mnemonic), "-", "_")+"_", envconfig.OsLookuper())
+	err = envconfig.ProcessWith(ctx, configurationInstance, l)
+
+	error2.CheckError(err)
+
+	for _, p := range []string{
+		cfgPath,
+		currentConfigPath,
+		userConfig,
+		etcConfigPath} {
+		if checkAndInitConfiguration(p, configurationInstance) {
+			configurationPath = path.Dir(p)
+			break
+		}
+	}
+
+	sanitize()
+
+}
+
+func Reload() {
+	logging.LogInfo("Reloading configuration")
+	checkAndInitConfiguration(path.Join(configurationPath, constants.ConfigFileName), configurationInstance)
+}
+
+func checkAndInitConfiguration(name string, config *ConfigStruct) bool {
+
+	if name == "" {
+		return false
+	}
+
+	ptr, err := os.Open(name)
+	if err != nil {
+		return false
+	}
+	defer ptr.Close()
+
+	decoder := yaml.NewDecoder(ptr)
+	err = decoder.Decode(config)
+
+	if err != nil {
+		return false
+	}
+
+	return true
+}
diff --git a/application/source/configuration/sanitize.go b/application/source/configuration/sanitize.go
new file mode 100644
index 0000000..4ad00d8
--- /dev/null
+++ b/application/source/configuration/sanitize.go
@@ -0,0 +1,69 @@
+package configuration
+
+import (
+	error2 "gitlab.schukai.com/oss/utilities/conan/error"
+	"net/url"
+	"path"
+	"strconv"
+)
+
+func sanitizeMessageEndpoint() {
+	e := configurationInstance.Client.Endpoints.Messages
+
+	u, err := url.ParseRequestURI(e)
+	error2.CheckError(err)
+
+	if u.Scheme != "ws" {
+		u.Scheme = "ws"
+	}
+
+	if u.Host == "" {
+
+		u.Host = configurationInstance.Server.Host
+		if u.Host == "" {
+			error2.PrintErrorAndExit("Host not set")
+		}
+	}
+
+	configurationInstance.Client.Endpoints.Messages = u.String()
+
+}
+
+func sanitizeSerer() {
+
+	if configurationInstance.Server.Address == "localhost" {
+		configurationInstance.Server.Address = "127.0.0.1"
+	}
+
+	if configurationInstance.Server.Port == 0 {
+		configurationInstance.Server.Port = 8080
+	}
+
+	if configurationInstance.Server.Host == "" {
+		configurationInstance.Server.Host = "127.0.0.1:" + strconv.Itoa(configurationInstance.Server.Port)
+	}
+
+}
+
+func sanitizeWatch() {
+	for i := range configurationInstance.Server.Watch {
+		if configurationInstance.Server.Watch[i].Path == "." {
+			configurationInstance.Server.Watch[i].Path = GetConfigurationPath()
+			continue
+		}
+
+		if configurationInstance.Server.Watch[i].Path == "" {
+			continue
+		}
+
+		if !path.IsAbs(configurationInstance.Server.Watch[i].Path) {
+			configurationInstance.Server.Watch[i].Path = path.Join(GetConfigurationPath(), configurationInstance.Server.Watch[i].Path)
+		}
+	}
+}
+
+func sanitize() {
+	sanitizeSerer()
+	sanitizeWatch()
+	sanitizeMessageEndpoint()
+}
diff --git a/application/source/configuration/util.go b/application/source/configuration/util.go
new file mode 100644
index 0000000..7257162
--- /dev/null
+++ b/application/source/configuration/util.go
@@ -0,0 +1,24 @@
+package configuration
+
+import (
+	error2 "gitlab.schukai.com/oss/utilities/conan/error"
+	"os"
+	"path"
+)
+
+func getAbsolutePath(sub string) string {
+
+	if path.IsAbs(sub) {
+		return sub
+	}
+
+	if configurationPath != "" {
+		return path.Clean(path.Join(configurationPath, sub))
+	}
+
+	p, err := os.Getwd()
+	error2.CheckError(err)
+
+	return path.Clean(path.Join(p, sub))
+
+}
diff --git a/application/source/constants/context.go b/application/source/constants/context.go
new file mode 100644
index 0000000..78990c5
--- /dev/null
+++ b/application/source/constants/context.go
@@ -0,0 +1,12 @@
+package constants
+
+const ConfigFileName = "config.yaml"
+
+const WebManifestName = "app.webmanifest"
+const FaviconName = "favicon.ico"
+const AssetsPath = "assets"
+
+const AppStyleDirectory = "styles"
+const AppScriptDirectory = "scripts"
+
+const StandardCacheControl = "no-cache, no-store, must-revalidate"
diff --git a/application/source/error/console.go b/application/source/error/console.go
new file mode 100644
index 0000000..4323db4
--- /dev/null
+++ b/application/source/error/console.go
@@ -0,0 +1,47 @@
+package error
+
+import (
+	"github.com/gookit/color"
+	"os"
+)
+
+func CheckError(err error) {
+	if err != nil {
+		PrintErrorAndExit(err.Error())
+	}
+
+}
+
+func Exit(code int) {
+	os.Exit(code)
+}
+
+var lastBlock string
+
+func PrintErrorAndExit(message string, a ...interface{}) {
+	PrintError(message, a...)
+	os.Exit(1)
+}
+
+func PrintError(message string, a ...interface{}) {
+
+	if lastBlock == "error" {
+		color.Error.Println("\t"+message, a)
+		return
+	}
+
+	lastBlock = "error"
+	color.Error.Block(message, a...)
+
+}
+
+func PrintWarning(message string, a ...interface{}) {
+
+	if lastBlock == "warning" {
+		color.Warn.Println("\t"+message, a)
+		return
+	}
+
+	lastBlock = "warning"
+	color.Warn.Block(message, a...)
+}
diff --git a/application/source/error/http-errors.go b/application/source/error/http-errors.go
new file mode 100644
index 0000000..bbdca47
--- /dev/null
+++ b/application/source/error/http-errors.go
@@ -0,0 +1,39 @@
+package error
+
+import (
+	"errors"
+)
+
+var (
+
+	// ErrNotFound is the error returned when a resource is not found.
+	ErrNotFound = errors.New("not found")
+	// ErrAlreadyExists is the error returned when a resource already exists.
+	ErrAlreadyExists = errors.New("already exists")
+	// ErrInvalidArgument is the error returned when an invalid argument is provided.
+	ErrInvalidArgument = errors.New("invalid argument")
+	// ErrInvalidState is the error returned when an operation is not allowed in the current state.
+	ErrInvalidState = errors.New("invalid state")
+	// ErrNotImplemented is the error returned when an operation is not implemented.
+	ErrNotImplemented = errors.New("not implemented")
+	// ErrTimeout is the error returned when an operation times out.
+	ErrTimeout = errors.New("timeout")
+	// ErrCanceled is the error returned when an operation is canceled.
+	ErrCanceled = errors.New("canceled")
+	// ErrUnauthorized is the error returned when an operation is unauthorized.
+	ErrUnauthorized = errors.New("unauthorized")
+	// ErrForbidden is the error returned when an operation is forbidden.
+	ErrForbidden = errors.New("forbidden")
+	// ErrFailedPrecondition is the error returned when an operation failed precondition.
+	ErrFailedPrecondition = errors.New("failed precondition")
+	// ErrAborted is the error returned when an operation is aborted.
+	ErrAborted = errors.New("aborted")
+	// ErrOutOfRange is the error returned when an operation is out of range.
+	ErrOutOfRange = errors.New("out of range")
+	// ErrUnavailable is the error returned when an operation is unavailable.
+	ErrUnavailable = errors.New("unavailable")
+	// ErrDataLoss is the error returned when data is lost.
+	ErrDataLoss = errors.New("data loss")
+	// ErrUnauthenticated is the error returned when an operation is unauthenticated.
+	ErrUnauthenticated = errors.New("unauthenticated")
+)
diff --git a/application/source/error/http.go b/application/source/error/http.go
new file mode 100644
index 0000000..9e17cfc
--- /dev/null
+++ b/application/source/error/http.go
@@ -0,0 +1,181 @@
+package error
+
+import (
+	"embed"
+	"encoding/json"
+	"gitlab.schukai.com/oss/utilities/conan/header"
+	"gitlab.schukai.com/oss/utilities/conan/negotiator"
+	"go.uber.org/zap"
+	"net/http"
+	"os"
+	"path/filepath"
+	"reflect"
+	"strconv"
+	"strings"
+)
+
+type configAccess interface {
+	GetResourcePath() string
+	IsResourcePathSet() bool
+}
+
+func fileExists(path string) bool {
+	_, err := os.Stat(path)
+	return !os.IsNotExist(err)
+}
+
+type ErrorResponse struct {
+	Status           int
+	Hint             string
+	ValidationErrors ValidationErrors
+}
+
+func NewErrorResponse(status int, hint string) ErrorResponse {
+	return ErrorResponse{
+		Status:           status,
+		Hint:             hint,
+		ValidationErrors: []ValidationError{},
+	}
+}
+
+func (e ErrorResponse) Error() string {
+	return "Status " + string(e.Status) + " " + e.Hint
+}
+
+func (e *ErrorResponse) AppendValidationError(err ValidationError) {
+	e.ValidationErrors = append(e.ValidationErrors, err)
+}
+func (e *ErrorResponse) GetValidationErrors() ValidationErrors {
+	return e.ValidationErrors
+}
+
+type ValidationError struct {
+	Message     string
+	Namespace   string
+	Field       string
+	StructField string
+	Tag         string
+	ActualTag   string
+	Kind        reflect.Kind
+	Type        reflect.Type
+	Value       interface{}
+	Param       string
+}
+
+type validationDetails struct {
+	// the field affected by the review
+	Message   string      `json:"message,omitempty"`
+	Field     string      `json:"field,omitempty"`
+	Tag       string      `json:"rules,omitempty"`
+	ActualTag string      `json:"broken-rule,omitempty"`
+	Value     interface{} `json:"value,omitempty"`
+	Param     string      `json:"param,omitempty"`
+}
+
+type ValidationErrors []ValidationError
+
+func StandardErrorResponse(w http.ResponseWriter, r *http.Request, errorResponse ErrorResponse) {
+
+	cfg := r.Context().Value("config")
+	emd := r.Context().Value("embed")
+
+	neg := negotiator.New(r.Header)
+
+	if neg.Type("text/html") != "" {
+
+		w.Header().Set("X-Alvine-Hint", errorResponse.Hint)
+		w.WriteHeader(errorResponse.Status)
+
+		var i interface{} = cfg
+		v, ok := i.(configAccess)
+		if ok == true {
+			if v.IsResourcePathSet() {
+				wp := v.GetResourcePath()
+				fp := filepath.Join(wp, "error/"+strconv.Itoa(errorResponse.Status)+".html")
+
+				if fileExists(fp) {
+					http.ServeFile(w, r, filepath.Join(wp, "error/"+strconv.Itoa(errorResponse.Status)+".html"))
+					return
+				}
+			}
+		}
+
+		if emd != nil {
+			resources := emd.(embed.FS)
+			fp := filepath.Join("web/resource/error/", ""+strconv.Itoa(errorResponse.Status)+".html")
+
+			content, err := resources.ReadFile(fp)
+			if err == nil {
+				w.Write(content)
+				return
+			}
+
+		}
+		w.Write([]byte("" + strconv.Itoa(errorResponse.Status)))
+
+		return
+	} else if neg.Type("application/json", "text/json") != "" {
+		writeJsonError(w, errorResponse)
+	} else {
+		// https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/406
+		w.Header().Set("X-Alvine-Hint", errorResponse.Hint)
+		w.WriteHeader(http.StatusNotAcceptable)
+	}
+
+}
+
+type internalErrorResponseSys struct {
+	Error string `json:"error,omitempty"`
+	Code  int    `json:"code"`
+	// a more detailed explanation of the error
+	Hint string `json:"hint,omitempty"`
+	// An optional field name to which this validation applies
+	Validation []validationDetails `json:"validation,omitempty"`
+}
+
+type internalErrorResponse struct {
+	Sys internalErrorResponseSys `json:"sys"`
+}
+
+func writeJsonError(w http.ResponseWriter, data ErrorResponse) {
+
+	o := []validationDetails{}
+	for _, a := range data.ValidationErrors {
+
+		var rules string
+
+		if a.Tag != a.ActualTag {
+			rules = a.Tag
+		}
+
+		o = append(o, validationDetails{
+			//Message: a.Tr
+			Message:   a.Message,
+			Field:     strings.ToLower(strings.ReplaceAll(a.Namespace, "CreateOptions.", "")),
+			Tag:       rules,
+			ActualTag: a.ActualTag,
+			Value:     a.Value,
+			Param:     a.Param,
+		})
+	}
+
+	response := internalErrorResponse{
+		Sys: internalErrorResponseSys{
+			Error:      http.StatusText(data.Status),
+			Code:       data.Status,
+			Hint:       data.Hint,
+			Validation: o,
+		},
+	}
+
+	b, err := json.Marshal(response)
+	if err != nil {
+		zap.S().Error("json.Marshal fail: %s", err)
+	}
+
+	header.ApplicationJsonHeader(w)
+	w.WriteHeader(data.Status)
+
+	_, _ = w.Write(b)
+
+}
diff --git a/application/source/error/user.go b/application/source/error/user.go
new file mode 100644
index 0000000..ea1d84f
--- /dev/null
+++ b/application/source/error/user.go
@@ -0,0 +1,7 @@
+package error
+
+import (
+	"errors"
+)
+
+var ErrPropertyNotFound = errors.New("property not found")
diff --git a/application/source/files/httpfs.go b/application/source/files/httpfs.go
new file mode 100644
index 0000000..b1a5392
--- /dev/null
+++ b/application/source/files/httpfs.go
@@ -0,0 +1,88 @@
+package files
+
+//
+//func handler404(w http.ResponseWriter, r *http.Request) {
+//	error2.StandardErrorResponse(w, r,
+//		error2.ErrorResponse{
+//			Status: http.StatusNotFound,
+//			Hint:   "check your url",
+//		})
+//
+//}
+//
+//func ServeAppFiles(webPath string) http.HandlerFunc {
+//	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+//		appID := chi.RouteContext(r.Context()).URLParam("appID")
+//		watch.WriteApp(w, r, appID)
+//
+//	})
+//}
+//
+//func isSlashRune(r rune) bool { return r == '/' || r == '\\' }
+//
+//func ServeResourceFiles(webPath string) http.HandlerFunc {
+//
+//	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+//		//make sure the url path starts with /
+//		upath := r.URL.Path
+//		if !strings.HasPrefix(upath, "/") {
+//			upath = "/" + upath
+//			r.URL.Path = upath
+//		}
+//
+//		upath = path.Clean(upath)
+//
+//		regex := regexp.MustCompile(`(?m)(?P<uuid>/[a-f0-9]{32})(?P<path>/.*\.(js|css))$`)
+//		upath = regex.ReplaceAllString(upath, "$path")
+//
+//		p := path.Join(webPath, upath)
+//
+//		if strings.Contains(p, "..") {
+//			handler404(w, r)
+//			return
+//		}
+//
+//		for _, ent := range strings.FieldsFunc(p, isSlashRune) {
+//			if ent == ".." {
+//				handler404(w, r)
+//				return
+//			}
+//		}
+//
+//		// attempt to open the file via the http.FileSystem
+//		f, err := os.Open(p)
+//		//close if successfully opened
+//		if f != nil {
+//			defer f.Close()
+//		}
+//
+//		if err != nil {
+//			if os.IsNotExist(err) {
+//				handler404(w, r)
+//				return
+//			}
+//		}
+//
+//		s, err := f.Stat()
+//
+//		if err != nil {
+//			if os.IsNotExist(err) {
+//				// call handler
+//				handler404(w, r)
+//				return
+//			}
+//		}
+//
+//		if s.IsDir() {
+//			error2.StandardErrorResponse(w, r,
+//				error2.ErrorResponse{
+//					Status: http.StatusForbidden,
+//					Hint:   "this is a directory",
+//				})
+//			return
+//		}
+//
+//		http.ServeContent(w, r, p, s.ModTime(), f)
+//
+//	})
+//}
diff --git a/application/source/go.mod b/application/source/go.mod
new file mode 100644
index 0000000..d72d73e
--- /dev/null
+++ b/application/source/go.mod
@@ -0,0 +1,29 @@
+module gitlab.schukai.com/oss/utilities/conan
+
+go 1.19
+
+require (
+	gitea.com/go-chi/session v0.0.0-20211218221615-e3605d8b28b8
+	github.com/fsnotify/fsnotify v1.5.4
+	github.com/go-chi/chi/v5 v5.0.7
+	github.com/google/uuid v1.3.0
+	github.com/gookit/color v1.5.1
+	github.com/gorilla/websocket v1.5.0
+	github.com/jessevdk/go-flags v1.5.0
+	github.com/pkg/errors v0.9.1
+	github.com/sethvargo/go-envconfig v0.8.2
+	go.uber.org/zap v1.23.0
+	gopkg.in/yaml.v3 v3.0.1
+)
+
+require (
+	bitbucket.org/creachadair/shell v0.0.7 // indirect
+	github.com/bitfield/script v0.20.2 // indirect
+	github.com/itchyny/gojq v0.12.7 // indirect
+	github.com/itchyny/timefmt-go v0.1.3 // indirect
+	github.com/unknwon/com v1.0.1 // indirect
+	github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
+	go.uber.org/atomic v1.7.0 // indirect
+	go.uber.org/multierr v1.6.0 // indirect
+	golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
+)
diff --git a/application/source/go.sum b/application/source/go.sum
new file mode 100644
index 0000000..4ec1200
--- /dev/null
+++ b/application/source/go.sum
@@ -0,0 +1,159 @@
+bitbucket.org/creachadair/shell v0.0.7 h1:Z96pB6DkSb7F3Y3BBnJeOZH2gazyMTWlvecSD4vDqfk=
+bitbucket.org/creachadair/shell v0.0.7/go.mod h1:oqtXSSvSYr4624lnnabXHaBsYW6RD80caLi2b3hJk0U=
+gitea.com/go-chi/session v0.0.0-20211218221615-e3605d8b28b8 h1:tJQRXgZigkLeeW9LPlps9G9aMoE6LAmqigLA+wxmd1Q=
+gitea.com/go-chi/session v0.0.0-20211218221615-e3605d8b28b8/go.mod h1:fc/pjt5EqNKgqQXYzcas1Z5L5whkZHyOvTA7OzWVJck=
+github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
+github.com/bitfield/script v0.20.2 h1:4DexsRtBILVMEn3EZwHbtJdDqdk43sXI8gM3F04JXgs=
+github.com/bitfield/script v0.20.2/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA=
+github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/couchbase/go-couchbase v0.0.0-20201026062457-7b3be89bbd89/go.mod h1:+/bddYDxXsf9qt0xpDUtRR47A2GjaXmGGAqQ/k3GJ8A=
+github.com/couchbase/gomemcached v0.1.1/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo=
+github.com/couchbase/goutils v0.0.0-20201030094643-5e82bb967e67/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
+github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
+github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
+github.com/go-chi/chi/v5 v5.0.4/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
+github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8=
+github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
+github.com/go-redis/redis/v8 v8.4.0/go.mod h1:A1tbYoHSa1fXwN+//ljcCYYJeLmVrwL9hbQN45Jdy0M=
+github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gookit/color v1.5.1 h1:Vjg2VEcdHpwq+oY63s/ksHrgJYCTo0bwWvmmYWdE9fQ=
+github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg=
+github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
+github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/itchyny/gojq v0.12.7 h1:hYPTpeWfrJ1OT+2j6cvBScbhl0TkdwGM4bc66onUSOQ=
+github.com/itchyny/gojq v0.12.7/go.mod h1:ZdvNHVlzPgUf8pgjnuDTmGfHA/21KoutQUJ3An/xNuw=
+github.com/itchyny/timefmt-go v0.1.3 h1:7M3LGVDsqcd0VZH2U+x393obrzZisp7C0uEe921iRkU=
+github.com/itchyny/timefmt-go v0.1.3/go.mod h1:0osSSCQSASBJMsIZnhAaF1C2fCBTJZXrnj37mG8/c+A=
+github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
+github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
+github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
+github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/sethvargo/go-envconfig v0.8.2 h1:DDUVuG21RMgeB/bn4leclUI/837y6cQCD4w8hb5797k=
+github.com/sethvargo/go-envconfig v0.8.2/go.mod h1:Iz1Gy1Sf3T64TQlJSvee81qDhf7YIlt8GMUX6yyNFs0=
+github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
+github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg=
+github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY=
+github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
+github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8=
+github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
+github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
+github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
+github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs=
+github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
+github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
+github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
+go.opentelemetry.io/otel v0.14.0/go.mod h1:vH5xEuwy7Rts0GNtsCW3HYQoZDY+OmBJ6t1bFGGlxgw=
+go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
+go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=
+go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
+golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/application/source/header/header.go b/application/source/header/header.go
new file mode 100644
index 0000000..fa30a2a
--- /dev/null
+++ b/application/source/header/header.go
@@ -0,0 +1,131 @@
+package header
+
+import (
+	"context"
+	"net/http"
+	"net/textproto"
+)
+
+// "sync/atomic"
+
+const (
+	Accept                        = "Accept"
+	AcceptCharset                 = "Accept-Charset"
+	AcceptEncoding                = "Accept-Encoding"
+	AcceptLanguage                = "Accept-Language"
+	Authorization                 = "Authorization"
+	CacheControl                  = "Cache-Control"
+	ContentLength                 = "Content-Length"
+	ContentMD5                    = "Content-MD5"
+	ContentType                   = "Content-Type"
+	DoNotTrack                    = "DNT"
+	IfMatch                       = "If-Match"
+	IfModifiedSince               = "If-Modified-Since"
+	IfNoneMatch                   = "If-None-Match"
+	IfRange                       = "If-Range"
+	IfUnmodifiedSince             = "If-Unmodified-Since"
+	MaxForwards                   = "Max-Forwards"
+	ProxyAuthorization            = "Proxy-Authorization"
+	Pragma                        = "Pragma"
+	Range                         = "Range"
+	Referer                       = "Referer"
+	UserAgent                     = "User-Agent"
+	TE                            = "TE"
+	Via                           = "Via"
+	Warning                       = "Warning"
+	Cookie                        = "Cookie"
+	Origin                        = "Origin"
+	AcceptDatetime                = "Accept-Datetime"
+	XRequestedWith                = "X-Requested-With"
+	AccessControlAllowOrigin      = "Access-Control-Allow-Origin"
+	AccessControlAllowMethods     = "Access-Control-Allow-Methods"
+	AccessControlAllowHeaders     = "Access-Control-Allow-Headers"
+	AccessControlAllowCredentials = "Access-Control-Allow-Credentials"
+	AccessControlExposeHeaders    = "Access-Control-Expose-Headers"
+	AccessControlMaxAge           = "Access-Control-Max-Age"
+	AccessControlRequestMethod    = "Access-Control-Request-Method"
+	AccessControlRequestHeaders   = "Access-Control-Request-Headers"
+	AcceptPatch                   = "Accept-Patch"
+	AcceptRanges                  = "Accept-Ranges"
+	Allow                         = "Allow"
+	ContentEncoding               = "Content-Encoding"
+	ContentLanguage               = "Content-Language"
+	ContentLocation               = "Content-Location"
+	ContentDisposition            = "Content-Disposition"
+	ContentRange                  = "Content-Range"
+	ETag                          = "ETag"
+	Expires                       = "Expires"
+	LastModified                  = "Last-Modified"
+	Link                          = "Link"
+	Location                      = "Location"
+	P3P                           = "P3P"
+	ProxyAuthenticate             = "Proxy-Authenticate"
+	Refresh                       = "Refresh"
+	RetryAfter                    = "Retry-After"
+	Server                        = "Server"
+	SetCookie                     = "Set-Cookie"
+	StrictTransportSecurity       = "Strict-Transport-Security"
+	TransferEncoding              = "Transfer-Encoding"
+	Upgrade                       = "Upgrade"
+	Vary                          = "Vary"
+	WWWAuthenticate               = "WWW-Authenticate"
+
+	// Non-Standard
+	XFrameOptions          = "X-Frame-Options"
+	XXSSProtection         = "X-XSS-Protection"
+	ContentSecurityPolicy  = "Content-Security-Policy"
+	XContentSecurityPolicy = "X-Content-Security-Policy"
+	XWebKitCSP             = "X-WebKit-CSP"
+	XContentTypeOptions    = "X-Content-Type-Options"
+	XPoweredBy             = "X-Powered-By"
+	XUACompatible          = "X-UA-Compatible"
+	XForwardedProto        = "X-Forwarded-Proto"
+	XHTTPMethodOverride    = "X-HTTP-Method-Override"
+	XForwardedFor          = "X-Forwarded-For"
+	XRealIP                = "X-Real-IP"
+	XCSRFToken             = "X-CSRF-Token"
+	XRatelimitLimit        = "X-Ratelimit-Limit"
+	XRatelimitRemaining    = "X-Ratelimit-Remaining"
+	XRatelimitReset        = "X-Ratelimit-Reset"
+	XConanRequestID        = "X-Conan-Request-Id"
+)
+
+// Normalize formats the input header to the formation of "Xxx-Xxx".
+func Normalize(header string) string {
+	return textproto.CanonicalMIMEHeaderKey(header)
+}
+
+func ApplicationJsonHeader(w http.ResponseWriter) {
+	w.Header().Set(ContentType, "application/json")
+}
+
+///**
+//Über `println(w.Header().Get("X-Alvine-Request-Id"))` kann
+//die ID in den Handler ausgelesen werden.
+// */
+//func RequestIDHeader(w http.ResponseWriter) {
+//	w.Header().Set(XConanRequestID, )
+//}
+
+// RequestID is a middleware that injects a request ID into the context of each
+// request. A request ID is a uuid-string.
+func RequestID(next http.Handler) http.Handler {
+	fn := func(w http.ResponseWriter, r *http.Request) {
+		//var requestID RequestUUID
+		ctx := r.Context()
+		requestID := NewRequestUUID()
+		//currentUUID := r.Header.Get(XConanRequestID)
+		//if currentUUID == "" {
+		//	requestID=	NewRequestUUID()
+		//} else {
+		//		requestID,err:=uuid.Parse(currentUUID).(RequestUUID)
+		//		if err!=nil {
+		//			requestID=	NewRequestUUID()
+		//		}
+		//	}
+		w.Header().Set(XConanRequestID, requestID.String())
+		ctx = context.WithValue(ctx, XConanRequestID, &requestID)
+		next.ServeHTTP(w, r.WithContext(ctx))
+	}
+	return http.HandlerFunc(fn)
+}
diff --git a/application/source/header/request-id.go b/application/source/header/request-id.go
new file mode 100644
index 0000000..25cf3aa
--- /dev/null
+++ b/application/source/header/request-id.go
@@ -0,0 +1,53 @@
+package header
+
+import (
+	"context"
+	"database/sql/driver"
+	"github.com/google/uuid"
+	"net/http"
+)
+
+type RequestUUID uuid.UUID
+
+func NewRequestUUID() RequestUUID {
+	return RequestUUID(uuid.New())
+}
+
+func (r RequestUUID) UUID() uuid.UUID {
+	return uuid.UUID(r)
+}
+
+func (r RequestUUID) String() string {
+	return r.UUID().String()
+}
+
+// GormDataType -> sets type to binary(16)
+func (r RequestUUID) GormDataType() string {
+	return "binary(16)"
+}
+
+// Scan --> tells GORM how to receive from the database
+func (r *RequestUUID) Scan(value interface{}) error {
+	bytes, _ := value.([]byte)
+	parseByte, err := uuid.FromBytes(bytes)
+	*r = RequestUUID(parseByte)
+	return err
+}
+
+// Value -> tells GORM how to save into the database
+func (r *RequestUUID) Value() (driver.Value, error) {
+	return uuid.UUID(*r).MarshalBinary()
+}
+
+// RequestIDMiddleware is a middleware that injects a request ID into the context of each
+// request. A request ID is a uuid-string.
+func RequestIDMiddleware(next http.Handler) http.Handler {
+	fn := func(w http.ResponseWriter, r *http.Request) {
+		ctx := r.Context()
+		requestID := NewRequestUUID()
+		w.Header().Set(XConanRequestID, requestID.String())
+		ctx = context.WithValue(ctx, XConanRequestID, &requestID)
+		next.ServeHTTP(w, r.WithContext(ctx))
+	}
+	return http.HandlerFunc(fn)
+}
diff --git a/application/source/logging/logger.go b/application/source/logging/logger.go
new file mode 100644
index 0000000..ed3aa0d
--- /dev/null
+++ b/application/source/logging/logger.go
@@ -0,0 +1,87 @@
+package logging
+
+import (
+	"github.com/go-chi/chi/v5/middleware"
+	"gitlab.schukai.com/oss/utilities/conan/header"
+	"go.uber.org/zap"
+	"go.uber.org/zap/zapcore"
+	"net/http"
+	"time"
+)
+
+var logger *zap.Logger
+var sugaredLogger *zap.SugaredLogger
+
+func InitLogger() {
+
+	if logger != nil && sugaredLogger != nil {
+		return
+	}
+
+	var mode string
+
+	logger, _ = zap.NewDevelopment()
+
+	defer logger.Sync() // flushes buffer, if any
+
+	sugaredLogger = logger.Sugar()
+	sugaredLogger.Infof("init %s logger", mode)
+
+}
+
+func LogInfo(template string, args ...interface{}) {
+	if sugaredLogger == nil {
+		InitLogger()
+	}
+	sugaredLogger.Infof(template, args)
+}
+
+func LogDebug(template string, args ...interface{}) {
+	if sugaredLogger == nil {
+		InitLogger()
+	}
+	sugaredLogger.Debugf(template, args)
+}
+
+func LogError(template string, args ...interface{}) {
+	if sugaredLogger == nil {
+		InitLogger()
+	}
+	sugaredLogger.Errorf(template, args)
+}
+
+func LoggerMiddleware(next http.Handler) http.Handler {
+
+	fn := func(w http.ResponseWriter, r *http.Request) {
+		start := time.Now()
+		ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor)
+		next.ServeHTTP(ww, r)
+
+		ctx := r.Context()
+		requestIDString := ""
+		requestID, ok := ctx.Value(header.XConanRequestID).(header.RequestUUID)
+		if ok {
+			requestIDString = requestID.String()
+		}
+
+		latency := time.Since(start)
+
+		fields := []zapcore.Field{
+			zap.Int("status", ww.Status()),
+			zap.String("request-id", requestIDString),
+			zap.Duration("took", latency),
+			zap.Int64("measure.latency", latency.Nanoseconds()),
+			zap.String("remote", r.RemoteAddr),
+			zap.String("request", r.RequestURI),
+			zap.String("method", r.Method),
+		}
+
+		if logger == nil {
+			InitLogger()
+		}
+		logger.Info("request completed", fields...)
+
+	}
+
+	return http.HandlerFunc(fn)
+}
diff --git a/application/source/main.go b/application/source/main.go
new file mode 100644
index 0000000..169a605
--- /dev/null
+++ b/application/source/main.go
@@ -0,0 +1,7 @@
+package main
+
+import "gitlab.schukai.com/oss/utilities/conan/command"
+
+func main() {
+	command.Execute()
+}
diff --git a/application/source/negotiator/main.go b/application/source/negotiator/main.go
new file mode 100644
index 0000000..440a308
--- /dev/null
+++ b/application/source/negotiator/main.go
@@ -0,0 +1,99 @@
+package negotiator
+
+import (
+	"net/http"
+	"strings"
+)
+
+const (
+	headerAccept         = "Accept"
+	headerAcceptLanguage = "Accept-Language"
+	headerAcceptEncoding = "Accept-Encoding"
+	headerAcceptCharset  = "Accept-Charset"
+)
+
+type spec struct {
+	val string
+	q   float64
+}
+
+// Specs represents []Spec.
+type specs []spec
+
+// Len is to impelement sort.Interface for Specs.
+func (ss specs) Len() int {
+	return len(ss)
+}
+
+// Swap is to impelement sort.Interface for Specs.
+func (ss specs) Swap(i, j int) {
+	ss[i], ss[j] = ss[j], ss[i]
+}
+
+// Less is to impelement sort.Interface for Specs.
+func (ss specs) Less(i, j int) bool {
+	if ss[i].q > ss[j].q {
+		return true
+	}
+	if ss[i].q == ss[j].q {
+		if ss[i].val == "*" || strings.HasSuffix(ss[i].val, "/*") {
+			return true
+		}
+
+		if ss[j].val == "*" || strings.HasSuffix(ss[j].val, "/*") {
+			return false
+		}
+
+		return i < j
+	}
+
+	return false
+}
+
+func (ss specs) hasVal(val string) bool {
+	for _, spec := range ss {
+		if spec.val == val {
+			return true
+		}
+	}
+
+	return false
+}
+
+// Negotiator repensents the HTTP negotiator.
+type Negotiator struct {
+	header http.Header
+}
+
+// New creates an instance of Negotiator.
+func New(header http.Header) *Negotiator {
+	return &Negotiator{header}
+}
+
+// Type returns the most preferred content type from the HTTP Accept header.
+// If nothing accepted, then empty string is returned.
+func (n *Negotiator) Type(offers ...string) (bestOffer string) {
+	parser := newHeaderParser(n.header, true)
+	return parser.selectOffer(offers, parser.parse(headerAccept))
+}
+
+// Language returns the most preferred language from the HTTP Accept-Language
+// header. If nothing accepted, then empty string is returned.
+func (n *Negotiator) Language(offers ...string) (bestOffer string) {
+	parser := newHeaderParser(n.header, false)
+	return parser.selectOffer(offers, parser.parse(headerAcceptLanguage))
+}
+
+// Encoding returns the most preferred encoding from the HTTP Accept-Encoding
+// header. If nothing accepted, then empty string is returned.
+func (n *Negotiator) Encoding(offers ...string) (bestOffer string) {
+	parser := newHeaderParser(n.header, false)
+	return parser.selectOffer(offers, parser.parse(headerAcceptEncoding))
+}
+
+// Charset returns the most preferred charset from the HTTP Accept-Charset
+// header. If nothing accepted, then empty string is returned.
+func (n *Negotiator) Charset(offers ...string) (bestOffer string) {
+	parser := newHeaderParser(n.header, false)
+	return parser.selectOffer(offers, parser.parse(headerAcceptCharset))
+}
diff --git a/application/source/negotiator/parser.go b/application/source/negotiator/parser.go
new file mode 100644
index 0000000..07b5b9f
--- /dev/null
+++ b/application/source/negotiator/parser.go
@@ -0,0 +1,136 @@
+package negotiator
+
+import (
+	"net/http"
+	"sort"
+	"strconv"
+	"strings"
+)
+
+type headerParser struct {
+	header      http.Header
+	hasSlashVal bool
+	defaultQ    float64
+	wildCard    string
+}
+
+func newHeaderParser(header http.Header, hasSlashVal bool) *headerParser {
+	hp := &headerParser{header: header, hasSlashVal: hasSlashVal, defaultQ: 1.0}
+
+	if hp.hasSlashVal {
+		hp.wildCard = "*/*"
+	} else {
+		hp.wildCard = "*"
+	}
+
+	return hp
+}
+
+func (p headerParser) parse(headerName string) (specs specs) {
+	headerVal := formatHeaderVal(p.header.Get(headerName))
+
+	if headerVal == "" {
+		specs = []spec{spec{val: p.wildCard, q: p.defaultQ}}
+		return
+	}
+
+	for _, accept := range strings.Split(headerVal, ",") {
+		pair := strings.Split(strings.TrimSpace(accept), ";")
+
+		if len(pair) < 1 || len(pair) > 2 {
+			if p.hasSlashVal {
+				if strings.Index(pair[0], "/") == -1 {
+					continue
+				}
+			} else {
+				continue
+			}
+		}
+
+		spec := spec{val: pair[0], q: p.defaultQ}
+
+		if len(pair) == 2 {
+			var i int
+
+			if strings.HasPrefix(pair[1], "q=") {
+				i = 2
+			} else if strings.HasPrefix(pair[1], "level=") {
+				i = 6
+			} else {
+				continue
+			}
+
+			if q, err := strconv.ParseFloat(pair[1][i:], 64); err == nil && q != 0.0 {
+				if q > p.defaultQ {
+					q = p.defaultQ
+				}
+
+				spec.q = q
+			} else {
+				continue
+			}
+		}
+
+		specs = append(specs, spec)
+	}
+
+	sort.Sort(specs)
+
+	return
+}
+
+func (p headerParser) selectOffer(offers []string, specs specs) (bestOffer string) {
+	bestQ := 0.0
+
+	var bestWild, totalWild int
+	if p.hasSlashVal {
+		bestWild, totalWild = 3, 3
+	} else {
+		bestWild, totalWild = 2, 2
+	}
+
+	if len(specs) == 0 {
+		return
+	}
+
+	if len(offers) == 0 {
+		bestOffer = specs[0].val
+		return
+	}
+
+	for _, offer := range offers {
+		lowerCaseOffer := strings.ToLower(offer)
+
+		for _, spec := range specs {
+			switch {
+			case spec.q <= bestQ:
+				continue
+			case spec.val == p.wildCard && !specs.hasVal(lowerCaseOffer):
+				if spec.q > bestQ || bestWild > totalWild-1 {
+					bestOffer = offer
+
+					bestQ, bestWild = spec.q, totalWild-1
+				}
+			case p.hasSlashVal && strings.HasSuffix(spec.val, "/*"):
+				if strings.HasPrefix(lowerCaseOffer, spec.val[:len(spec.val)-1]) &&
+					(spec.q > bestQ || bestWild > totalWild-2) {
+					bestOffer = offer
+
+					bestQ, bestWild = spec.q, totalWild-2
+				}
+			case spec.val == lowerCaseOffer:
+				if spec.q > bestQ || bestWild > 0 {
+					bestOffer = offer
+
+					bestQ, bestWild = spec.q, 0
+				}
+			}
+		}
+	}
+
+	return
+}
+
+func formatHeaderVal(val string) string {
+	return strings.ToLower(strings.Replace(val, " ", "", -1))
+}
diff --git a/application/source/release/accessor.go b/application/source/release/accessor.go
new file mode 100644
index 0000000..fbcbb6e
--- /dev/null
+++ b/application/source/release/accessor.go
@@ -0,0 +1,7 @@
+package release
+
+type ReleaseAccessor interface {
+	GetVersion() string
+	GetBuild() string
+	GetMnemonic() string
+}
diff --git a/application/source/release/info.go b/application/source/release/info.go
new file mode 100644
index 0000000..6103251
--- /dev/null
+++ b/application/source/release/info.go
@@ -0,0 +1,34 @@
+package release
+
+type ReleaseStruct struct {
+	Version  string
+	Build    string
+	Mnemonic string
+}
+
+var release ReleaseStruct
+
+func init() {
+	InitRelease(version, build, mnemonic)
+}
+
+func InitRelease(version, build, mnemonic string) {
+	release = ReleaseStruct{
+		Version:  version,
+		Build:    build,
+		Mnemonic: mnemonic,
+	}
+
+}
+
+func GetVersion() string {
+	return release.Version
+}
+
+func GetBuild() string {
+	return release.Build
+}
+
+func GetMnemonic() string {
+	return release.Mnemonic
+}
diff --git a/application/source/release/release.go b/application/source/release/release.go
new file mode 100644
index 0000000..e5a7cf9
--- /dev/null
+++ b/application/source/release/release.go
@@ -0,0 +1,9 @@
+package release
+
+// Used when building per
+// -ldflags "-X release.version=$version -X release.build=$(due --iso-8601 | tr -d "-" )"
+var (
+	version  string = "dev"
+	build    string = "dev"
+	mnemonic string = "conan"
+)
diff --git a/application/source/response/standard.go b/application/source/response/standard.go
new file mode 100644
index 0000000..cb86994
--- /dev/null
+++ b/application/source/response/standard.go
@@ -0,0 +1,60 @@
+package response
+
+import (
+	"encoding/json"
+	"gitlab.schukai.com/oss/utilities/conan/header"
+	"gitlab.schukai.com/oss/utilities/conan/negotiator"
+	"go.uber.org/zap"
+	"net/http"
+)
+
+func WriteStandardResponse[D any](w http.ResponseWriter, r *http.Request, data StandardResponse[D]) {
+
+	neg := negotiator.New(r.Header)
+
+	if neg.Type("text/html") != "" {
+		w.WriteHeader(data.Status)
+	} else if neg.Type("application/json", "text/json") != "" {
+		WriteStandardJson(w, data)
+	} else {
+		// https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/406
+		w.Header().Set("X-Alvine-Hint", "Mime type not acceptable")
+		w.WriteHeader(http.StatusNotAcceptable)
+	}
+}
+
+type StandardResponse[D any] struct {
+	Status int
+	Hint   string
+	Data   D
+}
+
+func WriteStandardJson[D any](w http.ResponseWriter, data StandardResponse[D]) {
+
+	response := internalResponse{
+		Sys: internalResponseSys{
+			Code: data.Status,
+		},
+		Data: data.Data,
+	}
+
+	b, err := json.Marshal(response)
+	if err != nil {
+		zap.S().Error("json.Marshal fail: %s", err)
+	}
+
+	header.ApplicationJsonHeader(w)
+	w.WriteHeader(data.Status)
+
+	_, _ = w.Write(b)
+
+}
+
+type internalResponse struct {
+	Data interface{}         `json:"data"`
+	Sys  internalResponseSys `json:"sys"`
+}
+
+type internalResponseSys struct {
+	Code int `json:"code"`
+}
diff --git a/application/source/server/config.go b/application/source/server/config.go
new file mode 100644
index 0000000..abb4e43
--- /dev/null
+++ b/application/source/server/config.go
@@ -0,0 +1 @@
+package server
diff --git a/application/source/server/reload.go b/application/source/server/reload.go
new file mode 100644
index 0000000..125824f
--- /dev/null
+++ b/application/source/server/reload.go
@@ -0,0 +1,16 @@
+package server
+
+import (
+	"net/http"
+)
+
+func reloadMiddleware(next http.Handler) http.Handler {
+
+	fn := func(w http.ResponseWriter, r *http.Request) {
+
+		next.ServeHTTP(w, r)
+
+	}
+
+	return http.HandlerFunc(fn)
+}
diff --git a/application/source/server/routing.go b/application/source/server/routing.go
new file mode 100644
index 0000000..6ba8265
--- /dev/null
+++ b/application/source/server/routing.go
@@ -0,0 +1,36 @@
+package server
+
+import (
+	"crypto/tls"
+	"github.com/go-chi/chi/v5"
+	"github.com/go-chi/chi/v5/middleware"
+	"gitlab.schukai.com/oss/utilities/conan/configuration"
+	"gitlab.schukai.com/oss/utilities/conan/header"
+	"gitlab.schukai.com/oss/utilities/conan/logging"
+	"net/http"
+)
+
+func getRouter() *chi.Mux {
+
+	/** x509: certificate signed by unknown authority */
+	http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
+
+	router := chi.NewRouter()
+
+	router.Use(middleware.RealIP)
+	router.Use(middleware.Heartbeat("ping"))
+
+	router.Use(header.RequestIDMiddleware)
+
+	router.Use(middleware.Compress(5))
+	router.Use(logging.LoggerMiddleware)
+	router.Use(reloadMiddleware)
+
+	router.Handle("/*", http.FileServer(
+		http.Dir(configuration.GetServerWebPath()+"/")))
+
+	return router
+
+}
+
+
diff --git a/application/source/server/start.go b/application/source/server/start.go
new file mode 100644
index 0000000..feaeb78
--- /dev/null
+++ b/application/source/server/start.go
@@ -0,0 +1,33 @@
+package server
+
+import (
+	"gitlab.schukai.com/oss/utilities/conan/configuration"
+	error2 "gitlab.schukai.com/oss/utilities/conan/error"
+	"gitlab.schukai.com/oss/utilities/conan/logging"
+	"gitlab.schukai.com/oss/utilities/conan/watch"
+	"net/http"
+)
+
+func Start() {
+
+	address := configuration.GetServerAddress() + ":" + configuration.GetServerPort()
+
+	server := http.Server{
+		Handler: getRouter(),
+		Addr:    address,
+	}
+
+	watch.InitWatch()
+
+	logging.LogInfo("Server started on %s", address)
+	logging.LogInfo("Web path: %s", configuration.GetServerWebPath())
+	logging.LogInfo("Available at (non-exhaustive list): %s", "http://"+configuration.GetServerHost()+"/")
+	logging.LogInfo("Press %s to quit.", "Ctrl+C")
+
+	watch.StartWatching()
+	err := server.ListenAndServe()
+	error2.CheckError(err)
+
+	watch.DestroyApps()
+
+}
diff --git a/application/source/server/webmanifest.go b/application/source/server/webmanifest.go
new file mode 100644
index 0000000..2259011
--- /dev/null
+++ b/application/source/server/webmanifest.go
@@ -0,0 +1,107 @@
+package server
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/go-chi/chi/v5"
+	"gitlab.schukai.com/oss/utilities/conan/constants"
+	error2 "gitlab.schukai.com/oss/utilities/conan/error"
+	"gitlab.schukai.com/oss/utilities/conan/header"
+	"gitlab.schukai.com/oss/utilities/conan/negotiator"
+	"go.uber.org/zap"
+	"net/http"
+)
+
+type WebManifest struct {
+	Name      string `json:"name"`
+	ShortName string `json:"short_name"`
+	Scope     string `json:"scope"`
+
+	StartUrl            string                           `json:"start_url"`
+	Display             string                           `json:"display"`
+	BackgroundColor     string                           `json:"background_color"`
+	Description         string                           `json:"description"`
+	Icons               []WebManifestIcons               `json:"icons"`
+	RelatedApplications []WebManifestRelatedApplications `json:"related_applications"`
+}
+
+type WebManifestRelatedApplications struct {
+	Platform string `json:"platform"`
+	Url      string `json:"url,omitempty"`
+}
+
+type WebManifestIcons struct {
+	Src   string `json:"src"`
+	Sizes string `json:"sizes"`
+	Type  string `json:"type"`
+}
+
+func GetWebmanifestHandler() http.Handler {
+
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+
+		neg := negotiator.New(r.Header)
+
+		a := neg.Type("application/json")
+		fmt.Println(a)
+
+		if neg.Type("application/json") == "" {
+			error2.StandardErrorResponse(w, r,
+				error2.ErrorResponse{
+					Status: http.StatusNotAcceptable,
+					Hint:   "the webmanifest is only available for the app as a json file",
+				})
+			return
+		}
+
+		//r, _ = DoCheck(w, r)
+		//if r == nil {
+		//	return
+		//}
+
+		appID := chi.RouteContext(r.Context()).URLParam("appID")
+
+		manifest := WebManifest{
+			Name:            appID,
+			ShortName:       appID,
+			Scope:           "/app/" + appID,
+			StartUrl:        "/app/" + appID,
+			Display:         "standalone", // fullscreen,minimal-ui,standalone,browser
+			BackgroundColor: "#ffffff",
+			Description:     appID,
+			Icons: []WebManifestIcons{
+				{
+					Src:   "/app/" + appID + "/" + constants.AssetsPath + "/android-chrome-192x192.png",
+					Sizes: "192x192",
+					Type:  "image/png",
+				},
+				{
+					Src:   "/app/" + appID + "/" + constants.AssetsPath + "/android-chrome-512x512.png",
+					Sizes: "512x512",
+					Type:  "image/png",
+				},
+			},
+			RelatedApplications: []WebManifestRelatedApplications{
+				{
+					Platform: "android",
+					Url:      "https://play.google.com/store/apps/details?id=com.agenor.app." + appID,
+				},
+				{
+					Platform: "ios",
+					Url:      "https://itunes.apple.com/us/app/agenor-app/" + appID + "?ls=1&mt=8",
+				},
+			},
+		}
+
+		b, err := json.Marshal(manifest)
+		if err != nil {
+			zap.S().Error("json.Marshal fail: %s", err)
+		}
+
+		w.Header().Set(header.ContentType, "application/manifest+json")
+		w.WriteHeader(http.StatusOK)
+
+		_, _ = w.Write(b)
+
+	})
+}
diff --git a/application/source/session/check.go b/application/source/session/check.go
new file mode 100644
index 0000000..ab87616
--- /dev/null
+++ b/application/source/session/check.go
@@ -0,0 +1 @@
+package session
diff --git a/application/source/session/definition.go b/application/source/session/definition.go
new file mode 100644
index 0000000..ead6fd7
--- /dev/null
+++ b/application/source/session/definition.go
@@ -0,0 +1,10 @@
+package session
+
+type Session struct {
+	SID string
+	UID uint32
+}
+
+func (s *Session) GetUID() uint32 {
+	return s.UID
+}
diff --git a/application/source/util/merge.go b/application/source/util/merge.go
new file mode 100644
index 0000000..259e1d5
--- /dev/null
+++ b/application/source/util/merge.go
@@ -0,0 +1,44 @@
+package util
+
+import (
+	"reflect"
+)
+
+var (
+	MaxDepth = 32
+)
+
+// Merge recursively merges the src and dst maps. Key conflicts are resolved by
+// preferring src, or recursively descending, if both src and dst are maps.
+func Merge(dst, src map[string]interface{}) map[string]interface{} {
+	return merge(dst, src, 0)
+}
+
+func merge(dst, src map[string]interface{}, depth int) map[string]interface{} {
+	if depth > MaxDepth {
+		panic("too deep!")
+	}
+	for key, srcVal := range src {
+		if dstVal, ok := dst[key]; ok {
+			srcMap, srcMapOk := doMapping(srcVal)
+			dstMap, dstMapOk := doMapping(dstVal)
+			if srcMapOk && dstMapOk {
+				srcVal = merge(dstMap, srcMap, depth+1)
+			}
+		}
+		dst[key] = srcVal
+	}
+	return dst
+}
+
+func doMapping(i interface{}) (map[string]interface{}, bool) {
+	value := reflect.ValueOf(i)
+	if value.Kind() == reflect.Map {
+		m := map[string]interface{}{}
+		for _, k := range value.MapKeys() {
+			m[k.String()] = value.MapIndex(k).Interface()
+		}
+		return m, true
+	}
+	return map[string]interface{}{}, false
+}
diff --git a/application/source/watch/dataset.go b/application/source/watch/dataset.go
new file mode 100644
index 0000000..d3cc1a6
--- /dev/null
+++ b/application/source/watch/dataset.go
@@ -0,0 +1,81 @@
+package watch
+
+import (
+	"gitlab.schukai.com/oss/utilities/conan/configuration"
+	"gitlab.schukai.com/oss/utilities/conan/constants"
+	"path"
+)
+
+func getScriptName() string {
+	return "app.js"
+}
+func getStyleName() string {
+	return "app.css"
+}
+
+func newDataset(appID string) *Dataset {
+
+	webPath := configuration.GetServerWebPath()
+
+	scriptName := getScriptName()
+	relScriptPath := path.Join(appID, constants.AppScriptDirectory)
+	absScriptPath := path.Join(webPath, relScriptPath)
+	scriptHash := GetFileHash(path.Join(absScriptPath, scriptName))
+	relScriptPath = path.Join("/", relScriptPath, scriptHash, scriptName)
+
+	styleName := getStyleName()
+	relStylePath := path.Join(appID, constants.AppStyleDirectory)
+	absStylePath := path.Join(webPath, relStylePath)
+	styleHash := GetFileHash(path.Join(absStylePath, styleName))
+	relStylePath = path.Join("/", relStylePath, styleHash, styleName)
+
+	manifestPath := path.Join("/", appID, constants.WebManifestName)
+	faviconPath := path.Join("/", appID, constants.FaviconName)
+
+	tags := &Tags{
+		Config:      "",
+		WebManifest: "<link rel=\"manifest\" href=\"" + manifestPath + "\" crossorigin=\"use-credentials\">",
+		Favicon:     "<link rel=\"icon\" href=\"" + faviconPath + "\">",
+		Script:      "<script type=\"module\" src=\"" + relScriptPath + "\"></script>",
+		Style:       "<link rel=\"stylesheet\" href=\"" + relStylePath + "\">",
+		Cache:       "<meta http-equiv=\"cache-control\" content=\"" + constants.StandardCacheControl + "\">",
+	}
+
+	meta := &Meta{
+		Language: "en",
+	}
+
+	dataset := &Dataset{
+		Mnemonic: appID,
+		Tags:     tags,
+		Meta:     meta,
+	}
+
+	return dataset
+
+}
+
+type Meta struct {
+	Language string
+}
+
+type Resources struct {
+	Script string
+	Style  string
+}
+
+type Tags struct {
+	Config      string
+	WebManifest string
+	Favicon     string
+	Script      string
+	Style       string
+	Cache       string
+}
+
+type Dataset struct {
+	Mnemonic string
+	*Tags
+	*Meta
+	*Resources
+}
diff --git a/application/source/watch/hashsum.go b/application/source/watch/hashsum.go
new file mode 100644
index 0000000..27dc925
--- /dev/null
+++ b/application/source/watch/hashsum.go
@@ -0,0 +1,102 @@
+package watch
+
+import (
+	"crypto/md5"
+	"encoding/hex"
+	"io"
+	"os"
+	"sync"
+	"time"
+)
+
+type FileHash struct {
+	Name      string
+	Hash      string
+	expiresAt int64
+}
+
+var (
+	fileHashCache map[string]FileHash
+	fileHashMutex *sync.Mutex
+)
+
+func init() {
+	fileHashCache = make(map[string]FileHash)
+	fileHashMutex = &sync.Mutex{}
+
+	go func() {
+		for {
+			time.Sleep(time.Minute * 60 * 24) // 1 day
+			fileHashMutex.Lock()
+			for k, v := range fileHashCache {
+				if v.expiresAt < time.Now().Unix() {
+					delete(fileHashCache, k)
+				}
+			}
+			fileHashMutex.Unlock()
+		}
+	}()
+
+}
+
+func RemoveFileHash(path string) {
+	fileHashMutex.Lock()
+	defer fileHashMutex.Unlock()
+
+	if _, ok := fileHashCache[path]; ok {
+		delete(fileHashCache, path)
+	}
+
+}
+
+func GetFileHash(path string) string {
+	fileHashMutex.Lock()
+	defer fileHashMutex.Unlock()
+
+	if hash, ok := fileHashCache[path]; ok {
+		return hash.Hash
+	}
+
+	h, err := buildHash(path)
+	if err != nil {
+		return ""
+	}
+
+	fileHashCache[path] = h
+
+	return h.Hash
+}
+
+type FileHashes map[string]FileHash
+
+func buildHash(path string) (FileHash, error) {
+	var h FileHash // HASH
+
+	h.Name = path
+	h.Hash, _ = hashFile(path)
+	h.expiresAt = time.Now().Unix() + 3600*24 // 1 day
+	return h, nil
+}
+
+func hashFile(path string) (string, error) {
+	var h string // HASH
+
+	file, err := os.Open(path)
+	if err != nil {
+		return h, err
+	}
+
+	defer file.Close()
+
+	hash := md5.New()
+
+	if _, err := io.Copy(hash, file); err != nil {
+		return h, err
+	}
+
+	hashInBytes := hash.Sum(nil)[:16]
+	h = hex.EncodeToString(hashInBytes)
+
+	return h, nil
+
+}
diff --git a/application/source/watch/resources.go b/application/source/watch/resources.go
new file mode 100644
index 0000000..6647ce2
--- /dev/null
+++ b/application/source/watch/resources.go
@@ -0,0 +1,278 @@
+package watch
+
+import (
+	"bytes"
+	"github.com/bitfield/script"
+	"github.com/fsnotify/fsnotify"
+	"gitlab.schukai.com/oss/utilities/conan/configuration"
+	"gitlab.schukai.com/oss/utilities/conan/constants"
+	"gitlab.schukai.com/oss/utilities/conan/logging"
+	"os"
+	"path"
+	"path/filepath"
+	"regexp"
+	"strings"
+	"sync"
+	"text/template"
+)
+
+var (
+	watcher        *fsnotify.Watcher
+	watchList      map[string]string
+	watchListMutex = &sync.Mutex{}
+)
+
+func init() {
+	var err error
+
+	watcher, err = fsnotify.NewWatcher()
+	if err != nil {
+		logging.LogError("watching: watch error: %v", err.Error())
+	}
+	watchList = make(map[string]string)
+}
+
+func executeWatchAction(watchPath string) {
+
+	watch := configuration.GetWatch()
+
+	for _, w := range watch {
+
+		if !strings.HasPrefix(watchPath, w.Path) {
+			continue
+		}
+
+		if w.Exclude != nil {
+
+			stop := false
+
+			for _, e := range w.Exclude {
+
+				reg, err := regexp.Compile(e)
+				if err != nil {
+					logging.LogError("watching: compile exclude regex error: %v", err.Error())
+					stop = true
+					break
+				}
+
+				if reg.MatchString(watchPath) {
+					stop = true
+					break
+				}
+			}
+			if stop {
+				continue
+			}
+		}
+
+		logging.LogDebug("watching: execute watch action: %s", w.Command)
+
+		t, err := template.New("command").Parse(w.Command)
+		if err != nil {
+			logging.LogError("watching: execute watch action error: %v", err.Error())
+			continue
+		}
+
+		data := make(map[string]interface{})
+		data["Path"] = watchPath
+		data["WebPath"] = configuration.GetServerWebPath()
+		data["PID"] = os.Getpid()
+		data["Bin"] = os.Args[0]
+		data["Call"] = strings.Join(os.Args[0:], " ")
+
+		stat, err := os.Stat(watchPath)
+		if err != nil {
+			logging.LogError("watching: execute watch action error: %v", err.Error())
+			continue
+		}
+
+		if stat.IsDir() {
+			data["IsDir"] = true
+			data["Directory"] = watchPath
+		} else {
+			data["IsDir"] = false
+			data["Directory"] = path.Dir(watchPath)
+		}
+
+		var cmd bytes.Buffer
+		err = t.Execute(&cmd, data)
+		if err != nil {
+			logging.LogError("watching: execute watch action error: %v", err.Error())
+			continue
+		}
+
+		result := script.Exec(cmd.String())
+		if result.Error() != nil {
+			logging.LogError("watching: execute watch action error: %v", result.Error())
+		}
+
+		r, err := result.String()
+		logging.LogDebug("%s", r)
+
+		if err != nil {
+			logging.LogError("watching: execute watch action error: %v", err.Error())
+			continue
+		}
+
+	}
+
+}
+
+func StartWatching() error {
+
+	webPath := configuration.GetServerWebPath()
+
+	go func() {
+		for {
+			select {
+			case event, ok := <-watcher.Events:
+				if !ok {
+					return
+				}
+
+				fullPath := event.Name
+				d := strings.TrimPrefix(fullPath, webPath)
+
+				if event.Op&fsnotify.Chmod == fsnotify.Chmod {
+					logging.LogDebug("watching: chmod file: %s", d)
+					RemoveFileHash(fullPath)
+				}
+
+				if event.Op&fsnotify.Write == fsnotify.Write {
+					logging.LogDebug("watching: modified file: %s", d)
+
+					if fullPath == path.Join(configuration.GetConfigurationPath(), constants.ConfigFileName) {
+						configuration.Reload()
+						continue
+					}
+
+					RemoveFileHash(fullPath)
+					executeWatchAction(fullPath)
+				}
+
+				if event.Op&fsnotify.Create == fsnotify.Create {
+					logging.LogDebug("watching: created file: %s", d)
+					scanPath(fullPath)
+					executeWatchAction(fullPath)
+				}
+
+				if event.Op&fsnotify.Remove == fsnotify.Remove {
+					logging.LogDebug("watching: removed file: %s", d)
+					removeFromWatchlist(fullPath)
+					RemoveFileHash(fullPath)
+				}
+
+				if event.Op&fsnotify.Rename == fsnotify.Rename {
+					logging.LogDebug("watching: renamed file: %s", event.Name)
+					removeFromWatchlist(fullPath)
+					RemoveFileHash(fullPath)
+				}
+
+			case err, ok := <-watcher.Errors:
+				if !ok {
+					return
+				}
+				logging.LogError("watching: watch error: %v", err.Error())
+
+			}
+
+		}
+	}()
+
+	return nil
+
+}
+
+func InitWatch() {
+
+	watchList := configuration.GetWatch()
+	if len(watchList) == 0 {
+		watchList = append(watchList, configuration.Watch{
+			Path: configuration.GetServerWebPath(),
+		})
+	}
+
+	watchList = append(watchList, configuration.Watch{
+		Path: path.Join(configuration.GetConfigurationPath(), constants.ConfigFileName),
+	})
+
+	for _, w := range watchList {
+		scanPath(w.Path)
+	}
+
+}
+
+func scanPath(p string) {
+
+	if !path.IsAbs(p) {
+		p = path.Join(configuration.GetConfigurationPath(), p)
+	}
+
+	followFlag := configuration.GetServerFlagFollowSymlinks()
+
+	err := filepath.Walk(p,
+		func(x string, info os.FileInfo, err error) error {
+			if err != nil {
+				return err
+			}
+
+			if info.IsDir() && p == x {
+				addToWatchlist(x)
+				return nil
+			}
+
+			if followFlag {
+				x2, err := filepath.EvalSymlinks(x)
+				if err != nil {
+					return err
+				}
+
+				if x2 != x {
+					scanPath(x2)
+					return nil
+				}
+			}
+
+			//if info.IsDir() {
+			addToWatchlist(x)
+			//}
+
+			return nil
+		})
+
+	if err != nil {
+		logging.LogError("watching: watch files error %s", err.Error())
+	}
+}
+
+func removeFromWatchlist(p string) {
+
+	watchListMutex.Lock()
+	for k, _ := range watchList {
+		if k == p {
+			delete(watchList, k)
+			break
+		}
+	}
+
+	watchListMutex.Unlock()
+}
+
+func addToWatchlist(p string) {
+
+	watchListMutex.Lock()
+	err := watcher.Add(p)
+	if err != nil {
+		logging.LogError("watching: watch error: %v", err.Error())
+	} else {
+		logging.LogInfo("watching: watching %s", p)
+		watchList[p] = p
+	}
+
+	watchListMutex.Unlock()
+
+}
+
+func DestroyApps() {
+	watcher.Close()
+}
diff --git a/application/source/websocket/connection.go b/application/source/websocket/connection.go
new file mode 100644
index 0000000..14c190b
--- /dev/null
+++ b/application/source/websocket/connection.go
@@ -0,0 +1,111 @@
+package websocket
+
+import (
+	"fmt"
+	"gitea.com/go-chi/session"
+	"github.com/gorilla/websocket"
+	"gitlab.schukai.com/oss/utilities/conan/logging"
+	"log"
+	"net/http"
+)
+
+var (
+	upgrader    = websocket.Upgrader{}
+	connections = make(map[string]*websocket.Conn)
+)
+
+//func getCmd(input string) string {
+//	inputArr := strings.Split(input, " ")
+//	return inputArr[0]
+//}
+//
+//func getMessage(input string) string {
+//	inputArr := strings.Split(input, " ")
+//	var result string
+//	for i := 1; i < len(inputArr); i++ {
+//		result += inputArr[i]
+//	}
+//	return result
+//}
+
+func SendMessageToAll(message []byte) {
+
+	for _, conn := range connections {
+		conn.WriteMessage(websocket.TextMessage, message)
+	}
+
+}
+
+func closeConnection(session string) error {
+	if conn, ok := connections[session]; ok {
+		conn.Close()
+		delete(connections, session)
+
+	}
+	return nil
+}
+
+func GetWebsocketHandler() http.Handler {
+
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+
+		sessionStore := session.GetSession(r)
+		session := sessionStore.ID()
+
+		conn, err := upgrader.Upgrade(w, r, nil)
+		if err != nil {
+			logging.LogError("websocket error %s", err.Error())
+			return
+		}
+
+		conn.SetCloseHandler(func(code int, text string) error {
+			return closeConnection(session)
+
+		})
+
+		connections[session] = conn
+
+		defer func() {
+			closeConnection(session)
+		}()
+
+		//if sessionStore.Get("user") == nil {
+		//	http.Error(w, "Forbidden", http.StatusForbidden)
+		//	return
+		//}
+
+		// Continuosly read and write message
+		for {
+			mt, message, err := conn.ReadMessage()
+			if err != nil {
+				log.Println("read failed:", err)
+				break
+			}
+
+			if string(message) == "exit" {
+				break
+			}
+
+			fmt.Println(mt, string(message), "!!!!!!!!!!!!!!!!!!")
+			//input := string(message)
+			//cmd := getCmd(input)
+			//msg := getMessage(input)
+			//if cmd == "x" {
+			//	todoList = append(todoList, msg)
+			//} else if cmd == "done" {
+			//	updateTodoList(msg)
+			//}
+			//output := "Current Todos: \n"
+			//for _, todo := range todoList {
+			//	output += "\n - " + todo + "\n"
+			//}
+			//output += "\n----------------------------------------"
+			//message = []byte(output)
+			//err = conn.WriteMessage(mt, message)
+			//if err != nil {
+			//	log.Println("write failed:", err)
+			//	break
+			//}
+		}
+	})
+}
diff --git a/development/examples/e1/config.yaml b/development/examples/e1/config.yaml
new file mode 100644
index 0000000..84514f3
--- /dev/null
+++ b/development/examples/e1/config.yaml
@@ -0,0 +1,28 @@
+
+Server:
+  
+  # The hostname or IP address of the server (CONAN_SERVER_HOST)
+  # Domain, IP or hostname of the server
+  #Host: localhost:8080
+  
+  # The port of the server (CONAN_SERVER_ADDRESS)
+  # Address: localhost
+  
+  # The port of the server (CONAN_SERVER_PORT)
+  Port: 8080
+  
+  # 
+  Path:
+    # The path to the server (CONAN_SERVER_WEB_PATH)  
+    Web: web
+    
+  Watch:
+    - Path: src
+      Command: /bin/bash -c "PATH=$PATH:/home/volker.schukai/.nvm/versions/node/v18.8.0/bin; npx esbuild --bundle --outfile={{ .WebPath }}/scripts/bundle.js --sourcemap {{ .Path }}"
+      Exclude:
+        - ~$
+        - ^\.
+    
+  Flags:
+    FollowSymlinks: true
+    
diff --git a/development/examples/e1/package.json b/development/examples/e1/package.json
new file mode 100644
index 0000000..abcb3a6
--- /dev/null
+++ b/development/examples/e1/package.json
@@ -0,0 +1,15 @@
+{
+  "name": "e1",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "devDependencies": {
+    "esbuild": "^0.15.6"
+  }
+}
diff --git a/development/examples/e1/pnpm-lock.yaml b/development/examples/e1/pnpm-lock.yaml
new file mode 100644
index 0000000..373e8da
--- /dev/null
+++ b/development/examples/e1/pnpm-lock.yaml
@@ -0,0 +1,227 @@
+lockfileVersion: 5.4
+
+specifiers:
+  esbuild: ^0.15.6
+
+devDependencies:
+  esbuild: 0.15.6
+
+packages:
+
+  /@esbuild/linux-loong64/0.15.6:
+    resolution: {integrity: sha512-hqmVU2mUjH6J2ZivHphJ/Pdse2ZD+uGCHK0uvsiLDk/JnSedEVj77CiVUnbMKuU4tih1TZZL8tG9DExQg/GZsw==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-android-64/0.15.6:
+    resolution: {integrity: sha512-Z1CHSgB1crVQi2LKSBwSkpaGtaloVz0ZIYcRMsvHc3uSXcR/x5/bv9wcZspvH/25lIGTaViosciS/NS09ERmVA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-android-arm64/0.15.6:
+    resolution: {integrity: sha512-mvM+gqNxqKm2pCa3dnjdRzl7gIowuc4ga7P7c3yHzs58Im8v/Lfk1ixSgQ2USgIywT48QWaACRa3F4MG7djpSw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-darwin-64/0.15.6:
+    resolution: {integrity: sha512-BsfVt3usScAfGlXJiGtGamwVEOTM8AiYiw1zqDWhGv6BncLXCnTg1As+90mxWewdTZKq3iIy8s9g8CKkrrAXVw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-darwin-arm64/0.15.6:
+    resolution: {integrity: sha512-CnrAeJaEpPakUobhqO4wVSA4Zm6TPaI5UY4EsI62j9mTrjIyQPXA1n4Ju6Iu5TVZRnEqV6q8blodgYJ6CJuwCA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-freebsd-64/0.15.6:
+    resolution: {integrity: sha512-+qFdmqi+jkAsxsNJkaWVrnxEUUI50nu6c3MBVarv3RCDCbz7ZS1a4ZrdkwEYFnKcVWu6UUE0Kkb1SQ1yGEG6sg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-freebsd-arm64/0.15.6:
+    resolution: {integrity: sha512-KtQkQOhnNciXm2yrTYZMD3MOm2zBiiwFSU+dkwNbcfDumzzUprr1x70ClTdGuZwieBS1BM/k0KajRQX7r504Xw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-32/0.15.6:
+    resolution: {integrity: sha512-IAkDNz3TpxwISTGVdQijwyHBZrbFgLlRi5YXcvaEHtgbmayLSDcJmH5nV1MFgo/x2QdKcHBkOYHdjhKxUAcPwg==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-64/0.15.6:
+    resolution: {integrity: sha512-gQPksyrEYfA4LJwyfTQWAZaVZCx4wpaLrSzo2+Xc9QLC+i/sMWmX31jBjrn4nLJCd79KvwCinto36QC7BEIU/A==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-arm/0.15.6:
+    resolution: {integrity: sha512-xZ0Bq2aivsthDjA/ytQZzxrxIZbG0ATJYMJxNeOIBc1zUjpbVpzBKgllOZMsTSXMHFHGrow6TnCcgwqY0+oEoQ==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-arm64/0.15.6:
+    resolution: {integrity: sha512-aovDkclFa6C9EdZVBuOXxqZx83fuoq8097xZKhEPSygwuy4Lxs8J4anHG7kojAsR+31lfUuxzOo2tHxv7EiNHA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-mips64le/0.15.6:
+    resolution: {integrity: sha512-wVpW8wkWOGizsCqCwOR/G3SHwhaecpGy3fic9BF1r7vq4djLjUcA8KunDaBCjJ6TgLQFhJ98RjDuyEf8AGjAvw==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-ppc64le/0.15.6:
+    resolution: {integrity: sha512-z6w6gsPH/Y77uchocluDC8tkCg9rfkcPTePzZKNr879bF4tu7j9t255wuNOCE396IYEGxY7y8u2HJ9i7kjCLVw==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-riscv64/0.15.6:
+    resolution: {integrity: sha512-pfK/3MJcmbfU399TnXW5RTPS1S+ID6ra+CVj9TFZ2s0q9Ja1F5A1VirUUvViPkjiw+Kq3zveyn6U09Wg1zJXrw==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-s390x/0.15.6:
+    resolution: {integrity: sha512-OZeeDu32liefcwAE63FhVqM4heWTC8E3MglOC7SK0KYocDdY/6jyApw0UDkDHlcEK9mW6alX/SH9r3PDjcCo/Q==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-netbsd-64/0.15.6:
+    resolution: {integrity: sha512-kaxw61wcHMyiEsSsi5ut1YYs/hvTC2QkxJwyRvC2Cnsz3lfMLEu8zAjpBKWh9aU/N0O/gsRap4wTur5GRuSvBA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-openbsd-64/0.15.6:
+    resolution: {integrity: sha512-CuoY60alzYfIZapUHqFXqXbj88bbRJu8Fp9okCSHRX2zWIcGz4BXAHXiG7dlCye5nFVrY72psesLuWdusyf2qw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-sunos-64/0.15.6:
+    resolution: {integrity: sha512-1ceefLdPWcd1nW/ZLruPEYxeUEAVX0YHbG7w+BB4aYgfknaLGotI/ZvPWUZpzhC8l1EybrVlz++lm3E6ODIJOg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-32/0.15.6:
+    resolution: {integrity: sha512-pBqdOsKqCD5LRYiwF29PJRDJZi7/Wgkz46u3d17MRFmrLFcAZDke3nbdDa1c8YgY78RiemudfCeAemN8EBlIpA==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-64/0.15.6:
+    resolution: {integrity: sha512-KpPOh4aTOo//g9Pk2oVAzXMpc9Sz9n5A9sZTmWqDSXCiiachfFhbuFlsKBGATYCVitXfmBIJ4nNYYWSOdz4hQg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-arm64/0.15.6:
+    resolution: {integrity: sha512-DB3G2x9OvFEa00jV+OkDBYpufq5x/K7a6VW6E2iM896DG4ZnAvJKQksOsCPiM1DUaa+DrijXAQ/ZOcKAqf/3Hg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild/0.15.6:
+    resolution: {integrity: sha512-sgLOv3l4xklvXzzczhRwKRotyrfyZ2i1fCS6PTOLPd9wevDPArGU8HFtHrHCOcsMwTjLjzGm15gvC8uxVzQf+w==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/linux-loong64': 0.15.6
+      esbuild-android-64: 0.15.6
+      esbuild-android-arm64: 0.15.6
+      esbuild-darwin-64: 0.15.6
+      esbuild-darwin-arm64: 0.15.6
+      esbuild-freebsd-64: 0.15.6
+      esbuild-freebsd-arm64: 0.15.6
+      esbuild-linux-32: 0.15.6
+      esbuild-linux-64: 0.15.6
+      esbuild-linux-arm: 0.15.6
+      esbuild-linux-arm64: 0.15.6
+      esbuild-linux-mips64le: 0.15.6
+      esbuild-linux-ppc64le: 0.15.6
+      esbuild-linux-riscv64: 0.15.6
+      esbuild-linux-s390x: 0.15.6
+      esbuild-netbsd-64: 0.15.6
+      esbuild-openbsd-64: 0.15.6
+      esbuild-sunos-64: 0.15.6
+      esbuild-windows-32: 0.15.6
+      esbuild-windows-64: 0.15.6
+      esbuild-windows-arm64: 0.15.6
+    dev: true
diff --git a/development/examples/e1/src/main.js b/development/examples/e1/src/main.js
new file mode 100644
index 0000000..a657bdc
--- /dev/null
+++ b/development/examples/e1/src/main.js
@@ -0,0 +1 @@
+console.log('Hello ME!?');
\ No newline at end of file
diff --git a/development/examples/e1/web/hello.html b/development/examples/e1/web/hello.html
new file mode 100644
index 0000000..4e8540f
--- /dev/null
+++ b/development/examples/e1/web/hello.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>Hello World</title>
+    <script src="scripts/bundle.js"></script>
+</head>
+<body>
+    <h1>Hello World</h1>
+</body>
diff --git a/development/examples/e1/web/scripts/bundle.js b/development/examples/e1/web/scripts/bundle.js
new file mode 100644
index 0000000..b5d19a8
--- /dev/null
+++ b/development/examples/e1/web/scripts/bundle.js
@@ -0,0 +1,5 @@
+(() => {
+  // src/main.js
+  console.log("Hello ME!?");
+})();
+//# sourceMappingURL=bundle.js.map
diff --git a/development/examples/e1/web/scripts/bundle.js.map b/development/examples/e1/web/scripts/bundle.js.map
new file mode 100644
index 0000000..e98b515
--- /dev/null
+++ b/development/examples/e1/web/scripts/bundle.js.map
@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["../../src/main.js"],
+  "sourcesContent": ["console.log('Hello ME!?');"],
+  "mappings": ";;AAAA,UAAQ,IAAI,YAAY;",
+  "names": []
+}
diff --git a/development/makefile/color.mk b/development/makefile/color.mk
new file mode 100644
index 0000000..2c3fe3d
--- /dev/null
+++ b/development/makefile/color.mk
@@ -0,0 +1,17 @@
+#############################################################################################
+#############################################################################################
+##
+## COLORS
+##
+#############################################################################################
+#############################################################################################
+
+BLACK        := $(shell tput -Txterm setaf 0)
+RED          := $(shell tput -Txterm setaf 1)
+GREEN        := $(shell tput -Txterm setaf 2)
+YELLOW       := $(shell tput -Txterm setaf 3)
+LIGHTPURPLE  := $(shell tput -Txterm setaf 4)
+PURPLE       := $(shell tput -Txterm setaf 5)
+BLUE         := $(shell tput -Txterm setaf 6)
+WHITE        := $(shell tput -Txterm setaf 7)
+RESET        := $(shell tput -Txterm sgr0)    
\ No newline at end of file
diff --git a/development/makefile/directories-standard.mk b/development/makefile/directories-standard.mk
new file mode 100644
index 0000000..aedb896
--- /dev/null
+++ b/development/makefile/directories-standard.mk
@@ -0,0 +1,47 @@
+#############################################################################################
+#############################################################################################
+##
+## DIRECTORIES
+##
+#############################################################################################
+#############################################################################################
+
+APPLICATION_PATH          ?=   $(PROJECT_ROOT)application/
+DEPLOYMENT_PATH           ?=   $(PROJECT_ROOT)deployment/
+DEVELOPMENT_PATH          ?=   $(PROJECT_ROOT)development/
+DOCUMENTATION_PATH        ?=   $(PROJECT_ROOT)documentation/
+REQUIREMENT_PATH          ?=   $(PROJECT_ROOT)requirement/
+CREDENTIALS_PATH          ?=   $(PROJECT_ROOT)credential/
+
+TUTORIALS_PATH            ?=   $(DOCUMENTATION_PATH)tutorial/
+DOCUMENTATION_CONFIG_PATH ?=   $(DOCUMENTATION_PATH)config/
+                          
+RESOURCE_PATH             ?=   $(APPLICATION_PATH)resource/
+SOURCE_PATH               ?=   $(APPLICATION_PATH)source/
+WEB_PATH                  ?=   $(APPLICATION_PATH)web/
+
+## SCRIPTS_PATH IS DEPRECATED					      
+SCRIPTS_PATH              ?=   $(DEVELOPMENT_PATH)script/
+
+DEVELOPMENT_SCRIPTS_PATH  ?=   $(DEVELOPMENT_PATH)script/
+BUILD_PATH                ?=   $(DEPLOYMENT_PATH)build/
+VENDOR_PATH               ?=   $(DEPLOYMENT_PATH)vendor/
+TEST_PATH                 ?=   $(DEVELOPMENT_PATH)test/
+
+DEPLOYMENT_SCRIPTS_PATH   ?=   $(DEPLOYMENT_PATH)script/
+
+PROJECT_DIRECTORIES :=  $(PROJECT_DIRECTORIES)  \
+	$(APPLICATION_PATH) \
+	$(RESOURCE_PATH) \
+	$(SOURCE_PATH) \
+	$(WEB_PATH) \
+	$(DEPLOYMENT_PATH) \
+	$(VENDOR_PATH) \
+	$(DEVELOPMENT_PATH) \
+	$(DEVELOPMENT_SCRIPTS_PATH) \
+	$(DEPLOYMENT_SCRIPTS_PATH) \
+	$(DOCUMENTATION_PATH) \
+	$(REQUIREMENT_PATH)  \
+	$(CREDENTIALS_PATH) \
+	$(BUILD_PATH)
+	
\ No newline at end of file
diff --git a/development/makefile/gitignore.mk b/development/makefile/gitignore.mk
new file mode 100644
index 0000000..4131f64
--- /dev/null
+++ b/development/makefile/gitignore.mk
@@ -0,0 +1,522 @@
+#############################################################################################
+#############################################################################################
+##
+## INSTALL .gitignore
+##
+#############################################################################################
+#############################################################################################
+
+define GITIGNOREDS
+# Created by https://www.toptal.com/developers/gitignore/api/intellij+iml,phpunit,git,vim,visualstudiocode,phpstorm,go,intellij+all,netbeans,dbeaver,node,yarn
+# Edit at https://www.toptal.com/developers/gitignore?templates=intellij+iml,phpunit,git,vim,visualstudiocode,phpstorm,go,intellij+all,netbeans,dbeaver,node,yarn
+
+### DBeaver ###
+# ide config file
+.dbeaver-data-sources*.xml
+
+### Git ###
+# Created by git for backups. To disable backups in Git:
+# $ git config --global mergetool.keepBackup false
+*.orig
+
+# Created by git when using merge tools for conflicts
+*.BACKUP.*
+*.BASE.*
+*.LOCAL.*
+*.REMOTE.*
+*_BACKUP_*.txt
+*_BASE_*.txt
+*_LOCAL_*.txt
+*_REMOTE_*.txt
+
+### Go ###
+# If you prefer the allow list template instead of the deny list, see community template:
+# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
+#
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+# Test binary, built with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+# Dependency directories (remove the comment below to include it)
+# vendor/
+
+# Go workspace file
+go.work
+
+### Go Patch ###
+/vendor/
+/Godeps/
+
+### Intellij+all ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij+all Patch ###
+# Ignore everything but code style settings and run configurations
+# that are supposed to be shared within teams.
+
+.idea/*
+
+!.idea/codeStyles
+!.idea/runConfigurations
+
+### Intellij+iml ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+
+# AWS User-specific
+
+# Generated files
+
+# Sensitive or high-churn files
+
+# Gradle
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+
+# Mongo Explorer plugin
+
+# File-based project format
+
+# IntelliJ
+
+# mpeltonen/sbt-idea plugin
+
+# JIRA plugin
+
+# Cursive Clojure plugin
+
+# SonarLint plugin
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+
+# Editor-based Rest Client
+
+# Android studio 3.1+ serialized cache file
+
+### Intellij+iml Patch ###
+# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
+
+*.iml
+modules.xml
+.idea/misc.xml
+*.ipr
+
+### NetBeans ###
+**/nbproject/private/
+**/nbproject/Makefile-*.mk
+**/nbproject/Package-*.bash
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+### Node ###
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+.pnpm-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional stylelint cache
+.stylelintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variable files
+.env
+.env.development.local
+.env.test.local
+.env.production.local
+.env.local
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# vuepress v2.x temp and cache directory
+.temp
+
+# Docusaurus cache and generated files
+.docusaurus
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
+
+### Node Patch ###
+# Serverless Webpack directories
+.webpack/
+
+# Optional stylelint cache
+
+# SvelteKit build / generate output
+.svelte-kit
+
+### PhpStorm ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+
+# AWS User-specific
+
+# Generated files
+
+# Sensitive or high-churn files
+
+# Gradle
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+
+# Mongo Explorer plugin
+
+# File-based project format
+
+# IntelliJ
+
+# mpeltonen/sbt-idea plugin
+
+# JIRA plugin
+
+# Cursive Clojure plugin
+
+# SonarLint plugin
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+
+# Editor-based Rest Client
+
+# Android studio 3.1+ serialized cache file
+
+### PhpStorm Patch ###
+# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
+
+# *.iml
+# modules.xml
+# .idea/misc.xml
+# *.ipr
+
+# Sonarlint plugin
+# https://plugins.jetbrains.com/plugin/7973-sonarlint
+.idea/**/sonarlint/
+
+# SonarQube Plugin
+# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
+.idea/**/sonarIssues.xml
+
+# Markdown Navigator plugin
+# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
+.idea/**/markdown-navigator.xml
+.idea/**/markdown-navigator-enh.xml
+.idea/**/markdown-navigator/
+
+# Cache file creation bug
+# See https://youtrack.jetbrains.com/issue/JBR-2257
+.idea/$CACHE_FILE$
+
+# CodeStream plugin
+# https://plugins.jetbrains.com/plugin/12206-codestream
+.idea/codestream.xml
+
+# Azure Toolkit for IntelliJ plugin
+# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
+.idea/**/azureSettings.xml
+
+### PHPUnit ###
+# Covers PHPUnit
+# Reference: https://phpunit.de/
+
+# Generated files
+.phpunit.result.cache
+.phpunit.cache
+
+# PHPUnit
+/app/phpunit.xml
+/phpunit.xml
+
+# Build data
+/build/
+
+### Vim ###
+# Swap
+[._]*.s[a-v][a-z]
+!*.svg  # comment out if you don't need vector files
+[._]*.sw[a-p]
+[._]s[a-rt-v][a-z]
+[._]ss[a-gi-z]
+[._]sw[a-p]
+
+# Session
+Session.vim
+Sessionx.vim
+
+# Temporary
+.netrwhist
+*~
+# Auto-generated tag files
+tags
+# Persistent undo
+[._]*.un~
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+!.vscode/*.code-snippets
+
+# Local History for Visual Studio Code
+.history/
+
+# Built Visual Studio Code Extensions
+*.vsix
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+.ionide
+
+# Support for Project snippet scope
+.vscode/*.code-snippets
+
+# Ignore code-workspaces
+*.code-workspace
+
+### yarn ###
+# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
+
+.yarn/*
+!.yarn/releases
+!.yarn/patches
+!.yarn/plugins
+!.yarn/sdks
+!.yarn/versions
+
+# if you are NOT using Zero-installs, then:
+# comment the following lines
+!.yarn/cache
+
+# and uncomment the following lines
+# .pnp.*
+
+endef
+
+export GITIGNOREDS
+.gitignore:
+	$(QUITE) $(ECHO) "$$GITIGNOREDS" >> $@
+
+
+
diff --git a/development/makefile/go.mk b/development/makefile/go.mk
new file mode 100644
index 0000000..2995536
--- /dev/null
+++ b/development/makefile/go.mk
@@ -0,0 +1,12 @@
+#############################################################################################
+#############################################################################################
+##
+## COMMANDS GO
+##
+#############################################################################################
+#############################################################################################
+
+# path and binaries
+GO               := go
+
+EXECUTABLES = $(EXECUTABLES:-) $(GO); 
diff --git a/development/makefile/jsdoc-json.mk b/development/makefile/jsdoc-json.mk
new file mode 100644
index 0000000..321ef66
--- /dev/null
+++ b/development/makefile/jsdoc-json.mk
@@ -0,0 +1,115 @@
+#############################################################################################
+#############################################################################################
+##
+## INSTALL jsdoc.json
+##
+#############################################################################################
+#############################################################################################
+
+define JSDOCJSON
+{
+  "tags": {
+    "allowUnknownTags": true
+  },
+  "source": {
+    "include": "$(SOURCE_PATH)",
+    "includePattern": "\\.js$$",
+    "excludePattern": ""
+  },
+  "plugins": [
+    "plugins/markdown",
+    "jsdoc-plantuml"
+  ],
+  "opts": {
+    "template": "node_modules/clean-jsdoc-theme",
+    "encoding": "utf8",
+    "destination": "$(BUILD_PATH)/docs/",
+    "recurse": true,
+    "verbose": true,
+    "theme_opts": {
+      "theme": "light",
+      "title": "$(COMPONENT_NAME)",
+      "meta": [
+        {
+          "name": "author",
+          "content": "schukai GmbH"
+        },
+        {
+          "name": "description",
+          "content": "javascript library for ..."
+        }
+      ],
+      "search": true,
+      "add_style_path": [
+        {
+          "href": "https://monsterjs.org/assets/prettify.css",
+          "crossorigin": "anonymous",
+          "rel": "stylesheet"
+        }
+      ],
+      "add_script_path": [
+        {
+          "src": "https://code.jquery.com/jquery-3.5.1.js",
+          "integrity": "sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=",
+          "crossorigin": "anonymous"
+        },
+      ],
+      "footer": "<a href='https://about.schukai.com/de/impressum/'>Imprint</a>",
+      "overlay_scrollbar": {
+        "options": {
+        }
+      },
+      "resizeable": {
+        "navbar": {
+          "min": "300",
+          "max": "600"
+        }
+      },
+      "codepen": {
+        "enable_for": [
+          "examples"
+        ],
+        "options": {
+          "title": "javascript library by schukai GmbH",
+          "description": "the example ...",
+          "editors": "0012"
+        }
+      },
+      "sections": [
+        "Tutorials",
+        "Namespaces",
+        "Classes",
+        "Modules",
+        "Externals",
+        "Events",
+        "Mixins",
+        "Interfaces",
+        "Global",
+        "Menu"
+      ]
+    }
+  },
+  "templates": {
+    "cleverLinks": true,
+    "monospaceLinks": false,
+    "default": {
+      "outputSourceFiles": false
+    }
+  },
+  "plantuml": {
+    "puml": {
+      "create": true,
+      "destination": "$(BUILD_PATH)/docs/puml"
+    },
+    "images": {
+      "create": true,
+      "destination": "$(BUILD_PATH)/docs/images",
+      "defaultFormat": "svg"
+    }
+  }
+}
+endef
+
+export JSDOCJSON
+$(DEPLOYMENT_PATH)jsdoc.json:
+	$(QUITE) $(ECHO) "$$JSDOCJSON" >> $@
\ No newline at end of file
diff --git a/development/makefile/jsdoc.mk b/development/makefile/jsdoc.mk
new file mode 100644
index 0000000..f565f53
--- /dev/null
+++ b/development/makefile/jsdoc.mk
@@ -0,0 +1,12 @@
+#############################################################################################
+#############################################################################################
+##
+## COMMANDS JSDOC
+##
+#############################################################################################
+#############################################################################################
+
+# path and binaries
+JSDOC         ?= $(NODE_MODULES_BIN_DIR)jsdoc
+
+EXECUTABLES = $(EXECUTABLES:-) $(JSDOC); 
\ No newline at end of file
diff --git a/development/makefile/license-agpl3.mk b/development/makefile/license-agpl3.mk
new file mode 100644
index 0000000..ebb06a7
--- /dev/null
+++ b/development/makefile/license-agpl3.mk
@@ -0,0 +1,13 @@
+#############################################################################################
+#############################################################################################
+##
+## COLORS
+##
+#############################################################################################
+#############################################################################################
+
+## License used in the project
+LICENSE_TEXT    ?= AGPL 3.0
+
+## Copyright holder of the project
+COPYRIGHT_TEXT  ?= © schukai GmbH, Released under the $(LICENSE_TEXT) License.
\ No newline at end of file
diff --git a/development/makefile/node.mk b/development/makefile/node.mk
new file mode 100644
index 0000000..346fe3b
--- /dev/null
+++ b/development/makefile/node.mk
@@ -0,0 +1,51 @@
+#############################################################################################
+#############################################################################################
+##
+## COMMANDS NODEJS
+##
+#############################################################################################
+#############################################################################################
+
+# path and binaries
+NODEJS            ?= node
+NODE              ?= node
+NPM               ?= pnpm
+
+EXECUTABLES = $(EXECUTABLES:-) $(PNPM); 
+
+NODE_PACKAGES := $(shell find $(PROJECT_ROOT) -type f -name 'package.json' -not -path '*/node_modules/*')
+NODE_MODULES := $(shell find $(PROJECT_ROOT) -type d -name 'node_modules' -prune)
+NODE_MODULES_MODIFIED := $(shell find $(PROJECT_ROOT) -type d -name 'node_modules' -prune -exec echo {}/.modified \;  )
+
+$(NODE_MODULES_MODIFIED): $(NODE_PACKAGES)
+	$(ECHOMARKER) "Updating node modules..."
+	$(QUIET) for p in $(NODE_PACKAGES); do \
+  		DIR=$$(dirname $$p); \
+		echo "Updating package: $${DIR}" ;\
+		$(NPM) install --prefix $${DIR}  ;\
+	done ; \
+	touch $(NODE_MODULES_MODIFIED)
+ 
+## Main Develpoment Node Repos 
+NODE_ROOT_DIR          ?= $(DEVELOPMENT_PATH)
+NODE_MODULES_DIR       ?= $(NODE_ROOT_DIR)node_modules/
+NODE_PACKAGE_PATH      ?= $(NODE_ROOT_DIR)package.json
+NODE_MODULES_BIN_DIR   ?= $(NODE_MODULES_DIR).bin/
+
+ESBUILD       ?= $(NODE_MODULES_BIN_DIR)esbuild
+WEBPACK       ?= $(NODE_MODULES_BIN_DIR)webpack
+BABEL         ?= $(NODE_MODULES_BIN_DIR)babel
+UGLIFYJS      ?= $(NODE_MODULES_BIN_DIR)uglifyjs
+C8            ?= $(NODE_MODULES_BIN_DIR)c8
+MOCHA         ?= $(NODE_MODULES_BIN_DIR)mocha
+
+PACKAGE_JSON ?= $(NODE_ROOT_DIR)package.json
+
+MJS_SOURCE_FILES                       := $(shell find $(SOURCE_PATH) -name '*.mjs')
+MJS_RELATIVE_SOURCE_FILES              := $(shell find $(SOURCE_PATH) -name '*.mjs' -exec realpath --relative-to $(PROJECT_ROOT) {} \;   )
+
+JS_SOURCE_FILES                       := $(shell find $(SOURCE_PATH) -name '*.js')
+JS_RELATIVE_SOURCE_FILES              := $(shell find $(SOURCE_PATH) -name '*.js' -exec realpath --relative-to $(PROJECT_ROOT) {} \;   )
+
+
+
diff --git a/development/makefile/output.mk b/development/makefile/output.mk
new file mode 100644
index 0000000..9aa5bb7
--- /dev/null
+++ b/development/makefile/output.mk
@@ -0,0 +1,54 @@
+#############################################################################################
+#############################################################################################
+##
+## COLORS
+##
+#############################################################################################
+#############################################################################################
+
+INFO    := $(GREEN)
+COMMENT := $(YELLOW)
+
+#############################################################################################
+#############################################################################################
+##
+## OUTPUT CONTROL AND STANDARD OUTPUTS
+##
+#############################################################################################
+#############################################################################################
+
+MARKER           := $(BLUE)[+]$(RESET)
+ERRORMARKER      := $(RED)[-]$(RESET)
+
+#############################################################################################
+#############################################################################################
+##
+## DEACTIVATE THE QUIET MODE BY OVERWRITING THE VALUE WITH SPACE
+##
+#############################################################################################
+#############################################################################################
+
+ifndef DEBUG
+    QUIET = @
+else
+    QUIET = 
+endif
+
+ifndef DONTOPENBROWSER
+    OPENBROWSER = false
+else
+    OPENBROWSER = true
+endif
+
+#############################################################################################
+#############################################################################################
+##
+## COMMANDS
+##
+#############################################################################################
+#############################################################################################
+
+ECHO             := @echo
+ECHOMARKER       := @echo "$(MARKER) $0"
+ECHOERRORMARKER  := @echo "$(ERRORMARKER) $0"
+
diff --git a/development/makefile/placeholder.mk b/development/makefile/placeholder.mk
new file mode 100644
index 0000000..c99024c
--- /dev/null
+++ b/development/makefile/placeholder.mk
@@ -0,0 +1,9 @@
+#############################################################################################
+#############################################################################################
+##
+## PLACEHOLDER
+##
+#############################################################################################
+#############################################################################################
+
+COMPONENT_SLUG := $(shell echo "$(COMPONENT_NAME)" | tr '[:upper:]' '[:lower:]')
\ No newline at end of file
diff --git a/development/makefile/s3.mk b/development/makefile/s3.mk
new file mode 100644
index 0000000..9569d7e
--- /dev/null
+++ b/development/makefile/s3.mk
@@ -0,0 +1,14 @@
+#############################################################################################
+#############################################################################################
+##
+## AMAZON S3
+##
+#############################################################################################
+#############################################################################################
+
+# path and binaries
+AWS ?= aws
+EXECUTABLES = $(EXECUTABLES:-) $(AWS) 
+
+## Set AWS profile 
+AWS_PROFILE ?= schukai
diff --git a/development/makefile/target-caddy.mk b/development/makefile/target-caddy.mk
new file mode 100644
index 0000000..4387423
--- /dev/null
+++ b/development/makefile/target-caddy.mk
@@ -0,0 +1,23 @@
+#############################################################################################
+#############################################################################################
+##
+## SERVER CADDY
+##
+#############################################################################################
+#############################################################################################
+
+CADDY_VENDOR_PATH    ?= $(VENDOR_PATH)caddy/
+CADDY_BIN            ?= $(CADDY_VENDOR_PATH)caddy
+CADDY_CONFIG         ?= $(CADDY_VENDOR_PATH)caddy.conf
+CADDY_PIDFILE		 ?= $(shell mktemp -d)/caddy.pid
+
+$(CADDY_BIN):
+	$(QUIET) $(MKDIR) -p $(CADDY_VENDOR_PATH)
+	$(QUIET) $(WGET) -O $(CADDY_BIN) "https://caddyserver.com/api/download?os=linux&arch=amd64&idempotency=75143981108035"
+	$(QUIET) $(CHMOD) u+x $(CADDY_BIN)
+
+.PHONY: run-caddy
+## run caddy webserver
+run-caddy: $(CADDY_BIN) 
+	$(QUIET) $(CADDY_BIN) run -config $(CADDY_CONFIG) -pidfile $(CADDY_PIDFILE) -watch
+
diff --git a/development/makefile/target-deploy-tool.mk b/development/makefile/target-deploy-tool.mk
new file mode 100644
index 0000000..bb18b06
--- /dev/null
+++ b/development/makefile/target-deploy-tool.mk
@@ -0,0 +1,20 @@
+#############################################################################################
+#############################################################################################
+##
+## DEPLOY TOOLS
+##
+#############################################################################################
+#############################################################################################
+
+
+UPLOAD_TOOL_URL ?= s3://download.schukai.com/tools/$(COMPONENT_SLUG)/
+
+.PHONY: deploy
+## compile and deploy to S3
+deploy: compile
+	$(QUIET) AWS_PROFILE=$(AWS_PROFILE) find $(BUILD_PATH) -iname $(COMPONENT_SLUG)-* -exec $(AWS) s3 cp {} $(UPLOAD_TOOL_URL) \;
+
+.PHONY: overview-to-s3
+## overview-to-s3
+overview-to-s3:
+	$(QUIET) AWS_PROFILE=$(AWS_PROFILE) $(AWS) s3 cp $(WEB_PATH)/index.html $(UPLOAD_TOOL_URL)
\ No newline at end of file
diff --git a/development/makefile/target-docman.mk b/development/makefile/target-docman.mk
new file mode 100644
index 0000000..e5c836e
--- /dev/null
+++ b/development/makefile/target-docman.mk
@@ -0,0 +1,39 @@
+
+#############################################################################################
+#############################################################################################
+##
+## DOCMAN-TARGETS
+##
+#############################################################################################
+#############################################################################################
+
+
+
+$(PROJECT_ROOT)deployment/build/manual.html: ~/.local/bin/docman
+	docman document html --config $(PROJECT_ROOT)documentation/config.yaml
+
+$(PROJECT_ROOT)deployment/build/manual.pdf: ~/.local/bin/docman
+	docman document pdf --config $(PROJECT_ROOT)documentation/config.yaml
+
+.PHONY: build-doc-pdf
+## creating the documentation in pdf format
+build-doc-pdf: $(PROJECT_ROOT)deployment/build/manual.pdf
+
+.PHONY: build-doc-html
+## creating the documentation in html format
+build-doc-html: $(PROJECT_ROOT)deployment/build/manual.html
+
+
+.PHONY: build-doc
+## creating the documentation in pdf and html format
+build-doc: build-doc-pdf build-doc-html
+
+
+~/.local/bin/docman:
+	wget -O ~/.local/bin/docman https://download.schukai.com/tools/docman/docman-linux-amd64
+	chmod u+x ~/.local/bin/docman
+
+
+.PHONY: install-docman
+install-docman: ~/.local/bin/docman
+
diff --git a/development/makefile/target-git.mk b/development/makefile/target-git.mk
new file mode 100644
index 0000000..7453d89
--- /dev/null
+++ b/development/makefile/target-git.mk
@@ -0,0 +1,47 @@
+#############################################################################################
+#############################################################################################
+##
+## GIT-TARGETS
+##
+#############################################################################################
+#############################################################################################
+
+EXECUTABLES = $(EXECUTABLES:-) uuidgen
+
+## Current Branch-GIT_TAG
+GIT_TAG := -
+
+## Git Commit GIT_MESSAGE for git-push
+GIT_MESSAGE := current status
+
+.PHONY: git-branch
+## create new branch (use GIT_TAG-Variable)
+git-branch:
+
+	$(QUIET) export BRANCH="b$(GIT_TAG)/$(shell uuidgen --random)" ; \
+	$(QUIET) $(GIT) checkout -b $${BRANCH} && \
+	RESULT=$$($(GIT) push origin $$BRANCH 2>&1) && \
+    RESULT2=$$($(GIT) branch --set-upstream-to=origin/$$BRANCH $$BRANCH) && \
+	GITLABURL=$$(echo "$$RESULT" | tr '\n' '\#' | grep -o 'remote\:\s*https:\/\/gitlab\.schukai\.com[^ ]*' | cut -d " " -f2-9 | sed -e 's/^[ \t]*//') && \
+	if $(OPENBROWSER) ; then google-chrome --profile-directory="Default" $$GITLABURL ; fi
+
+.PHONY: git-to-master
+## git checkout master, fetch and merge
+git-to-master:
+	$(QUIET) $(GIT) checkout master && $(GIT) fetch -pP && $(GIT) merge
+
+.PHONY: git-push-to-server
+## git push changes to server
+git-push-to-server:
+	$(QUIET) $(GIT) add -A
+	$(QUIET) $(GIT) commit -m"$(GIT_MESSAGE)"
+	$(QUIET) $(GIT) push
+
+.PHONY: git-push
+## git create branch and push changes to server
+git-push: git-branch git-push-to-server
+
+.PHONY: git-tag
+## git create version tag
+git-tag:
+	$(QUIET) $(GIT) tag -a "$(COMPONENT_VERSION)" -m "release $(COMPONENT_VERSION)"
diff --git a/development/makefile/target-go-build.mk b/development/makefile/target-go-build.mk
new file mode 100644
index 0000000..267cd95
--- /dev/null
+++ b/development/makefile/target-go-build.mk
@@ -0,0 +1,22 @@
+#############################################################################################
+#############################################################################################
+##
+## BUILD GO
+##
+#############################################################################################
+#############################################################################################
+
+.PHONY: compile
+## Compiling for every OS and Platform
+compile: next-patch-version
+	$(ECHOMARKER) "Compiling for every OS and Platform"
+	$(ECHO) "Version: $(PROJECT_VERSION)"
+	$(ECHO) "Build: $(PROJECT_BUILD_DATE)"
+ 
+	$(QUIET) cd  $(SOURCE_PATH) ; \
+			 GO111MODULE=on GOOS=linux GOARCH=arm $(GO) build -ldflags "-X main.version=$(PROJECT_VERSION) -X main.build=$(PROJECT_BUILD_DATE)" -o $(BUILD_PATH)$(COMPONENT_SLUG)-linux-arm ; \
+			 GOOS=linux GOARCH=amd64 $(GO) build -ldflags "-X main.version=$(PROJECT_VERSION) -X main.build=$(PROJECT_BUILD_DATE)" -o $(BUILD_PATH)$(COMPONENT_SLUG)-linux-amd64 ; \
+			 GOOS=linux GOARCH=arm64 $(GO) build -ldflags "-X main.version=$(PROJECT_VERSION) -X main.build=$(PROJECT_BUILD_DATE)" -o $(BUILD_PATH)$(COMPONENT_SLUG)-linux-arm64 ; \
+			 GOOS=linux GOARCH=386 $(GO) build -ldflags "-X main.version=$(PROJECT_VERSION) -X main.build=$(PROJECT_BUILD_DATE)" -o $(BUILD_PATH)$(COMPONENT_SLUG)-linux-386 ; \
+	         GOOS=windows GOARCH=amd64 $(GO) build -ldflags "-X main.version=$(PROJECT_VERSION) -X main.build=$(PROJECT_BUILD_DATE)" -o $(BUILD_PATH)$(COMPONENT_SLUG)-windows ; \
+ 			cd $(PROJECT_ROOT); 
diff --git a/development/makefile/target-go-fetch-licenses.mk b/development/makefile/target-go-fetch-licenses.mk
new file mode 100644
index 0000000..4bd753c
--- /dev/null
+++ b/development/makefile/target-go-fetch-licenses.mk
@@ -0,0 +1,26 @@
+#############################################################################################
+#############################################################################################
+##
+## GET LICENSES
+##
+#############################################################################################
+#############################################################################################
+
+GO_MOD_FILE := $(SOURCE_PATH)go.mod
+
+ifeq ($(shell test -e $(GO_MOD_FILE) && echo -n yes),yes)
+    GO_CURRENT_MODULE := $(shell cat $(GO_MOD_FILE) | head -n1 | cut -d" " -f2)
+	# go install github.com/google/go-licenses@latest
+	EXECUTABLES = $(EXECUTABLES:-) go-licenses;    
+endif
+
+.PHONY: go-fetch-licenses
+## Fetch licenses for all modules
+go-fetch-licenses:
+ifeq ($(GO_CURRENT_MODULE),)
+	$(QUIET) $(ECHOERRORMARKER) "no go.mod file found, skipping fetching licenses"
+else
+	$(ECHOMARKER) "Fetch licenses"
+	$(QUIET) cd $(SOURCE_PATH); go-licenses save $(GO_CURRENT_MODULE) $(GO_LICENSES_IGNORE_PACKAGES) --force --save_path $(DOCUMENTATION_PATH)licenses/ ; cd -
+endif
+
diff --git a/development/makefile/target-help.mk b/development/makefile/target-help.mk
new file mode 100644
index 0000000..abe1f92
--- /dev/null
+++ b/development/makefile/target-help.mk
@@ -0,0 +1,46 @@
+#############################################################################################
+#############################################################################################
+##
+## HELP-TARGETS
+##
+#############################################################################################
+#############################################################################################
+
+# @see .PHONY https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html#Phony-Targets
+.DEFAULT_GOAL := help
+
+.PHONY: print
+## Print Path	
+print:
+	$(ECHO) "THIS_MAKEFILE:      $(THIS_MAKEFILE)"
+	$(ECHO) "THIS_MAKEFILE_PATH: $(THIS_MAKEFILE_PATH)"
+	$(ECHO) "PROJECT_ROOT:       $(PROJECT_ROOT)"
+
+# Add a comment to the public targets so that it appears
+# in this help Use two # characters for a help comment
+.PHONY: help
+help:
+	@printf "${COMMENT}Usage:${RESET}\n"
+	@printf " make [target] [arg=\"val\"...]\n\n"
+	@printf "${COMMENT}Available targets:${RESET}\n"
+	@awk '/^[a-zA-Z\-\\_0-9\.@]+:/ { \
+		helpMessage = match(lastLine, /^## (.*)/); \
+		if (helpMessage) { \
+			helpCommand = substr($$1, 0, index($$1, ":")); \
+			helpMessage = substr(lastLine, RSTART + 3, RLENGTH); \
+			printf " ${INFO}%-22s${RESET} %s\n", helpCommand, helpMessage; \
+		} \
+	} \
+	{ lastLine = $$0 }' $(MAKEFILE_LIST)
+	@printf "\n${COMMENT}Available arguments:${RESET}\n\n"
+	@awk '/^(([a-zA-Z\-\\_0-9\.@]+)\s[?:]?=)/ { \
+		helpMessage = match(lastLine, /^## (.*)/); \
+		if (helpMessage) { \
+			helpMessage = substr(lastLine, RSTART + 3, RLENGTH); \
+			printf " ${INFO}%-22s${RESET} %s (Default: %s)\n", $$1, helpMessage, $$3; \
+		} \
+	} \
+	{ lastLine = $$0 }' $(MAKEFILE_LIST)
+
+
+
diff --git a/development/makefile/target-init-standard.mk b/development/makefile/target-init-standard.mk
new file mode 100644
index 0000000..7a69b0c
--- /dev/null
+++ b/development/makefile/target-init-standard.mk
@@ -0,0 +1,20 @@
+#############################################################################################
+#############################################################################################
+##
+## INIT-TARGETS
+##
+#############################################################################################
+#############################################################################################
+
+# @see .PHONY https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html#Phony-Targets
+.PHONY: init-standard
+
+## init standard project	
+init-standard: .gitignore
+	# The default directories are defined in the 
+	# directories-standard.mk file, but all other 
+	# targets can define directories as well.
+	$(ECHOMARKER) "Run init-standard"
+	$(foreach path,$(PROJECT_DIRECTORIES),\
+		$(shell $(MKDIR) -p $(path)))
+	$(ECHO) "Done"
diff --git a/development/makefile/target-jekyll.mk b/development/makefile/target-jekyll.mk
new file mode 100644
index 0000000..e69de29
diff --git a/development/makefile/target-jsdoc-build.mk b/development/makefile/target-jsdoc-build.mk
new file mode 100644
index 0000000..3328151
--- /dev/null
+++ b/development/makefile/target-jsdoc-build.mk
@@ -0,0 +1,23 @@
+
+#############################################################################################
+#############################################################################################
+##
+## JSDOC-TARGETS
+##
+#############################################################################################
+#############################################################################################
+
+FIXBROKENPLANTUML := $(NODE_MODULES_DIR)jsdoc-plantuml/fixBrokenNodeJS.js
+
+.PHONY: jsdoc-build
+## generate js api docs
+jsdoc-build: $(DOCUMENTATION_CONFIG_PATH)jsdoc.json  $(FIXBROKENPLANTUML).fixed
+	$(ECHOMARKER) "create api doc"
+	$(QUIET) $(NPM) --prefix $(NODE_ROOT_DIR) run build-doc
+
+
+$(FIXBROKENPLANTUML).fixed:
+	$(ECHOMARKER) "fix broken plantuml"
+	$(QUIET) chmod u+x $(FIXBROKENPLANTUML) 
+	$(QUIET) $(NODE) $(FIXBROKENPLANTUML)
+	$(QUIET) $(TOUCH) $(FIXBROKENPLANTUML).fixed
\ No newline at end of file
diff --git a/development/makefile/target-minerva.mk b/development/makefile/target-minerva.mk
new file mode 100644
index 0000000..e69de29
diff --git a/development/makefile/target-node-build.mk b/development/makefile/target-node-build.mk
new file mode 100644
index 0000000..9dde98e
--- /dev/null
+++ b/development/makefile/target-node-build.mk
@@ -0,0 +1,26 @@
+#############################################################################################
+#############################################################################################
+##
+## BUILD NODE
+##
+#############################################################################################
+#############################################################################################
+
+SPONGE   ?=   sponge
+
+EXECUTABLES = $(EXECUTABLES:-) $(SPONGE);
+
+.PHONY: node-build
+## Build Node Components
+node-build: $(NODE_MODULES_MODIFIED) $(NODE_PACKAGES)
+	$(ECHOMARKER) "Building Node Components"
+	$(ECHO) "Version: $(PROJECT_VERSION)"
+	$(ECHO) "Source Path: $(SOURCE_PATH)"
+	$(QUIET) $(JQ) '.version = "$(PROJECT_VERSION)"' $(PACKAGE_JSON) | $(SPONGE) $(PACKAGE_JSON)
+	$(QUIET) for p in $(NODE_PACKAGES); do \
+			$(JQ) '.version = "$(PROJECT_VERSION)"' $${p} | $(SPONGE) $${p}; \
+		done ; \
+	$(QUIET) $(NPM) --prefix $(NODE_ROOT_DIR) run build  
+		
+		
+	
diff --git a/development/makefile/target-node-test.mk b/development/makefile/target-node-test.mk
new file mode 100644
index 0000000..0a03f40
--- /dev/null
+++ b/development/makefile/target-node-test.mk
@@ -0,0 +1,20 @@
+#############################################################################################
+#############################################################################################
+##
+## BUILD NODE
+##
+#############################################################################################
+#############################################################################################
+
+.PHONY: node-test
+## Test JS Components
+node-test: $(NODE_MODULES_MODIFIED)
+	$(ECHOMARKER) "Test Node Components"
+	$(QUIET) $(NPM) --prefix $(NODE_ROOT_DIR) run test  
+
+.PHONY: node-web-test
+## Test JS Components
+node-web-test: $(NODE_MODULES_MODIFIED)
+	$(ECHOMARKER) "Test Node Components"
+	$(QUIET) $(NPM) --prefix $(NODE_ROOT_DIR) run web-test  
+	
diff --git a/development/makefile/target-npm-publish.mk b/development/makefile/target-npm-publish.mk
new file mode 100644
index 0000000..41b1f54
--- /dev/null
+++ b/development/makefile/target-npm-publish.mk
@@ -0,0 +1,32 @@
+#############################################################################################
+#############################################################################################
+##
+## NPM
+##
+#############################################################################################
+#############################################################################################
+
+.PHONY: npm-publish-major
+## release major version of package
+npm-publish-major: node-test
+	$(ECHOMARKER) "release major version"
+	$(QUIET) $(MAKE) next-major-version
+	$(QUIET) $(MAKE) node-build
+	$(QUIET) $(NPM) --prefix $(NODE_ROOT_DIR) run publish
+
+.PHONY: npm-publish-minor
+## release minor version of package
+npm-publish-minor: node-test
+	$(ECHOMARKER) "release minor version"
+	$(QUIET) $(MAKE) next-minor-version
+	$(QUIET) $(MAKE) node-build
+	$(QUIET) $(NPM) --prefix $(NODE_ROOT_DIR) run publish
+
+.PHONY: npm-publish-patch
+## release patch version of package
+npm-publish-patch: node-test
+	$(ECHOMARKER) "release patch version"
+	$(QUIET) $(MAKE) next-patch-version
+	$(QUIET) $(MAKE) node-build
+	$(QUIET) $(NPM) --prefix $(NODE_ROOT_DIR) run publish
+
diff --git a/development/makefile/target-update-makefiles.mk b/development/makefile/target-update-makefiles.mk
new file mode 100644
index 0000000..5a1c408
--- /dev/null
+++ b/development/makefile/target-update-makefiles.mk
@@ -0,0 +1,23 @@
+#############################################################################################
+#############################################################################################
+##
+## INIT-TARGETS
+##
+#############################################################################################
+#############################################################################################
+
+# @see .PHONY https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html#Phony-Targets
+.PHONY: update-makefiles
+
+## update standard makefiles
+update-makefiles:
+	$(QUIET) $(eval TEMPD := $(shell mktemp -d))
+	$(QUIET) $(GIT) clone --depth=1  https://gitlab.schukai.com/schukai/utilities/makefile.git/ "$(TEMPD)" > /dev/null
+	$(QUIET) $(CP) -rv $(TEMPD)/makefiles/* $(MAKEFILE_IMPORT_PATH)
+	$(QUIET) $(CP) -rv $(TEMPD)/Makefile $(PROJECT_ROOT)Makefile.example
+	$(QUIET) $(RM) -rf $(TEMPD)
+
+
+
+
+
diff --git a/development/makefile/target-variable.mk b/development/makefile/target-variable.mk
new file mode 100644
index 0000000..93f99c0
--- /dev/null
+++ b/development/makefile/target-variable.mk
@@ -0,0 +1,12 @@
+#############################################################################################
+#############################################################################################
+##
+## VARIABLES-TARGETS
+##
+#############################################################################################
+#############################################################################################
+
+.PHONY: variables
+## Print all variables
+variables:
+	@$(foreach v, $(.VARIABLES), $(if $(filter file,$(origin $(v))), $(info $(INFO)$(v)$(RESET)=$($(v))$(RESET))))
\ No newline at end of file
diff --git a/development/makefile/terminal-check.mk b/development/makefile/terminal-check.mk
new file mode 100644
index 0000000..5db23c8
--- /dev/null
+++ b/development/makefile/terminal-check.mk
@@ -0,0 +1,13 @@
+#############################################################################################
+#############################################################################################
+##
+## TERMINAL CHECK
+##
+#############################################################################################
+#############################################################################################
+
+
+
+# Executable Programs the Installed be have to
+K := $(foreach exec,$(EXECUTABLES),\
+        $(if $(shell which $(exec)),some string,$(error "Missing $(exec) in PATH; please install")))
\ No newline at end of file
diff --git a/development/makefile/terminal.mk b/development/makefile/terminal.mk
new file mode 100644
index 0000000..fa2fb14
--- /dev/null
+++ b/development/makefile/terminal.mk
@@ -0,0 +1,42 @@
+#############################################################################################
+#############################################################################################
+##
+## COMMANDS
+##
+#############################################################################################
+#############################################################################################
+
+# Use bash instead of sh
+## Sets the shell used
+SHELL            =  bash
+
+# path and binaries
+AWK              ?= awk
+CP               ?= cp
+CD               ?= cd
+KILL             ?= kill
+MV               ?= mv
+RM               ?= rm
+MKDIR            ?= mkdir
+SED              ?= sed
+FIND             ?= find
+SORT             ?= sort
+TOUCH            ?= touch
+WGET             ?= wget
+CHMOD            ?= chmod
+RSYNC            ?= rsync
+XARGS            ?= xargs
+GREP             ?= grep
+MAKE             ?= make
+GIT              ?= git
+LN               ?= ln
+TOUCH    	     ?= touch
+TEST             ?= test
+JQ			     ?= jq
+
+
+
+EXECUTABLES = $(EXECUTABLES:-) $(JQ) $(AWK) $(CP) $(KILL) $(MV) $(SED) $(FIND) $(SORT) $(TOUCH) $(WGET) $(CHMOD) $(RSYNC) $(XARGS) $(GREP) $(MAKE) $(GIT)
+
+
+    
\ No newline at end of file
diff --git a/development/makefile/version.mk b/development/makefile/version.mk
new file mode 100644
index 0000000..da81bea
--- /dev/null
+++ b/development/makefile/version.mk
@@ -0,0 +1,40 @@
+#############################################################################################
+#############################################################################################
+##
+## VERSIONS
+##
+#############################################################################################
+#############################################################################################
+
+VERSION_BIN 	     := version
+EXECUTABLES = $(EXECUTABLES:-) $(VERSION_BIN)
+
+RELEASE_FILE ?= $(PROJECT_ROOT)release.json
+ 
+ifeq ("$(wildcard $(RELEASE_FILE))","")
+  $(shell echo '{"version":"0.1.0"}' > $(RELEASE_FILE))
+endif
+
+PROJECT_VERSION ?= $(shell cat $(RELEASE_FILE) | jq -r .version)
+PROJECT_BUILD_DATE ?= $(shell $(VERSION_BIN) date)
+
+.PHONY: next-patch-version
+## create next patch version
+next-patch-version:
+	$(ECHOMARKER) "Creating next version"
+	$(QUIET) $(VERSION_BIN) patch --path $(RELEASE_FILE) --selector "version"
+	$(QUIET) $(eval PROJECT_VERSION := $(shell cat $(RELEASE_FILE) | jq -r .version))
+
+.PHONY: next-minor-version
+## create next minor version
+next-minor-version:
+	$(ECHOMARKER) "Creating next minor version"
+	$(QUIET) $(VERSION_BIN) minor --path $(RELEASE_FILE) --selector "version"
+	$(QUIET) $(eval PROJECT_VERSION := $(shell cat $(RELEASE_FILE) | jq -r .version))
+
+.PHONY: next-major-version
+## create next major version
+next-major-version:
+	$(ECHOMARKER) "Creating next minor version"
+	$(QUIET) $(VERSION_BIN) major --path $(RELEASE_FILE) --selector "version"
+	$(QUIET) $(eval PROJECT_VERSION := $(shell cat $(RELEASE_FILE) | jq -r .version))
diff --git a/project.mk b/project.mk
new file mode 100644
index 0000000..8fc2bcb
--- /dev/null
+++ b/project.mk
@@ -0,0 +1,4 @@
+
+## Project directory in which the Makefiles should be located
+MAKEFILE_IMPORT_PATH=$(PROJECT_ROOT)development/makefile/
+
diff --git a/release.json b/release.json
new file mode 100644
index 0000000..d2bad7d
--- /dev/null
+++ b/release.json
@@ -0,0 +1 @@
+{"version":"0.1.0"}
-- 
GitLab