diff --git a/packages/app-shell/.npmignore b/packages/app-shell/.npmignore
new file mode 100644
index 0000000000000000000000000000000000000000..bd8138ceb1b9d6026edec0d20ac4be9940d5cf73
--- /dev/null
+++ b/packages/app-shell/.npmignore
@@ -0,0 +1,5 @@
+node_modules
+.idea
+npm-debug.log
+package-lock.json
+index.html
diff --git a/packages/app-shell/README.md b/packages/app-shell/README.md
index f70ee1d755ae3eb84f4c621c750b063f614884ca..c7c23e5bc77b72b2cbbc3329f331a970dbb9ee22 100644
--- a/packages/app-shell/README.md
+++ b/packages/app-shell/README.md
@@ -3,10 +3,17 @@
 A web component for building SPAs consisting of one topic with multiple
 activities. Handles login, language selection, activity switching, menus etc.
 
+You can install these component via npm:
+
+```bash
+npm i @dbp-toolkit/app-shell
+```
+
 ## Usage
 
 ```html
 <dbp-app-shell src="/example.topic.metadata.json"></dbp-app-shell>
+<script type="module" src="node_modules/@dbp-toolkit/app-shell/dist/dbp-app-shell.js"></script>
 ```
 
 ## Attributes
@@ -83,6 +90,9 @@ yarn run watch
 
 # run tests
 yarn test
+
+# build local packages in dist directory
+yarn run build
 ```
 
 Jump to <http://localhost:8002> and you should get a Single Sign On login page.
diff --git a/packages/app-shell/package.json b/packages/app-shell/package.json
index 05a3426f1021e7a04cd8311a424b647c43d7ba02..ae825cd9cbfab1c1074c3dc0f991ad0478023337 100644
--- a/packages/app-shell/package.json
+++ b/packages/app-shell/package.json
@@ -1,9 +1,9 @@
 {
   "name": "@dbp-toolkit/app-shell",
-  "version": "0.1.0",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/app-shell",
+  "version": "0.1.1",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
-  "private": true,
   "devDependencies": {
     "@rollup/plugin-commonjs": "^16.0.0",
     "@rollup/plugin-json": "^4.1.0",
@@ -45,7 +45,7 @@
     "watch": "npm run watch-local",
     "watch-local": "rollup -c --watch",
     "test": "npm run build-test && karma start --singleRun",
-    "publish": "can-npm-publish --verbose 2>&1 && npm run build && echo 'Todo: Publish' || true",
+    "publish": "can-npm-publish --verbose 2>&1 && npm run build && npm publish --access public || true",
     "lint": "eslint ."
   }
 }
diff --git a/packages/auth/package.json b/packages/auth/package.json
index 29f4ca2c4140f5f33cc6b8bc74ce59ee3831a9a2..ed3a352ee50c55e19015536e875c876c18e3b4c6 100644
--- a/packages/auth/package.json
+++ b/packages/auth/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/auth",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/auth",
   "version": "0.1.0",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
diff --git a/packages/check-in-place-select/package.json b/packages/check-in-place-select/package.json
index 1dd6d56e48f91b8e4dae9a93d4be179c6a0fcbbe..d8c5dd8df1c4292722a6342997394b8d5ba55744 100644
--- a/packages/check-in-place-select/package.json
+++ b/packages/check-in-place-select/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/check-in-place-select",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/check-in-place-select",
   "version": "0.1.0",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
@@ -45,6 +46,6 @@
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
     "test": "npm run build-test && karma start --singleRun",
-    "publish": "can-npm-publish --verbose 2>&1 && npm run build && echo 'Todo: Publish' || true"
+    "publish": "can-npm-publish --verbose 2>&1 && npm run build && npm publish --access public || true"
   }
 }
diff --git a/packages/common/package.json b/packages/common/package.json
index 8bdd51cda6f458dcb5626fa2f06492741779d0c8..818adbd6a88fc53f7bd2e5cc4f3e04fe7634825b 100644
--- a/packages/common/package.json
+++ b/packages/common/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/common",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/common",
   "version": "0.1.0",
   "module": "index.js",
   "license": "LGPL-2.1-or-later",
@@ -29,7 +30,7 @@
     "test": "npm run build-test && karma start --singleRun",
     "watch": "rollup -c --watch",
     "lint": "eslint .",
-    "publish": "can-npm-publish --verbose 2>&1 && npm run build && echo 'Todo: Publish' || true"
+    "publish": "can-npm-publish --verbose 2>&1 && npm run build && npm publish --access public || true"
   },
   "dependencies": {
     "@open-wc/scoped-elements": "^1.3.2",
diff --git a/packages/data-table-view/package.json b/packages/data-table-view/package.json
index e290527a08f8eff97c14c532947de95506b89768..4391d7ef827baf4782d8d1839e0c56a32c12f698 100644
--- a/packages/data-table-view/package.json
+++ b/packages/data-table-view/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/data-table-view",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/data-table-view",
   "version": "0.1.0",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
@@ -51,6 +52,6 @@
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
     "test": "npm run build-test && karma start --singleRun",
-    "publish": "can-npm-publish --verbose 2>&1 && npm run build && echo 'Todo: Publish' || true"
+    "publish": "can-npm-publish --verbose 2>&1 && npm run build && npm publish --access public || true"
   }
 }
diff --git a/packages/file-handling/package.json b/packages/file-handling/package.json
index d110b4721ac20b5f2c91321ad1d1e982c3e25a50..efe8f27abe0a6efa712eef68f1e0a00351c22ed9 100644
--- a/packages/file-handling/package.json
+++ b/packages/file-handling/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/file-handling",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/file-handling",
   "version": "0.1.5",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
@@ -46,6 +47,6 @@
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
     "test": "npm run build-test && karma start --singleRun",
-    "publish": "can-npm-publish --verbose 2>&1 && npm run build && echo 'Todo: Publish' || true"
+    "publish": "can-npm-publish --verbose 2>&1 && npm run build && npm publish --access public || true"
   }
 }
diff --git a/packages/knowledge-base-web-page-element-view/package.json b/packages/knowledge-base-web-page-element-view/package.json
index afa3acf156aa2cee93db2e8c3be35ce1cef0f396..240bd1b45d008aff21f0ec301213f0796a062b13 100644
--- a/packages/knowledge-base-web-page-element-view/package.json
+++ b/packages/knowledge-base-web-page-element-view/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/knowledge-base-web-page-element-view",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/knowledge-base-web-page-element-view",
   "version": "0.1.0",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
@@ -44,6 +45,6 @@
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
     "test": "npm run build-test && karma start --singleRun",
-    "publish": "can-npm-publish --verbose 2>&1 && npm run build && echo 'Todo: Publish' || true"
+    "publish": "can-npm-publish --verbose 2>&1 && npm run build && npm publish --access public || true"
   }
 }
diff --git a/packages/language-select/package.json b/packages/language-select/package.json
index a8332ac2c0462a0b1ac937997aeeacf8d5846529..6982e780536b7358fdd55e354b07739de6995c9e 100644
--- a/packages/language-select/package.json
+++ b/packages/language-select/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/language-select",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/language-select",
   "version": "0.1.0",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
@@ -40,6 +41,6 @@
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
     "test": "npm run build-test && karma start --singleRun",
-    "publish": "can-npm-publish --verbose 2>&1 && npm run build && echo 'Todo: Publish' || true"
+    "publish": "can-npm-publish --verbose 2>&1 && npm run build && npm publish --access public || true"
   }
 }
diff --git a/packages/matomo/package.json b/packages/matomo/package.json
index cd8c2e1ba35b5ab62af59e116b0751450c4618ac..54636cbc2a515f60b1cef9a3fd2ef6d0812d30b8 100644
--- a/packages/matomo/package.json
+++ b/packages/matomo/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/matomo",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/matomo",
   "version": "0.1.0",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
diff --git a/packages/notification/package.json b/packages/notification/package.json
index 364beaf6191f8185ce3ddb3401aa2a0407dfc0cc..ade4e99e15df707207999f45656bad723eaeee8f 100644
--- a/packages/notification/package.json
+++ b/packages/notification/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/notification",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/notification",
   "version": "0.1.0",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
@@ -41,6 +42,6 @@
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
     "test": "npm run build-test && karma start --singleRun",
-    "publish": "can-npm-publish --verbose 2>&1 && npm run build && echo 'Todo: Publish' || true"
+    "publish": "can-npm-publish --verbose 2>&1 && npm run build && npm publish --access public || true"
   }
 }
diff --git a/packages/person-profile/package.json b/packages/person-profile/package.json
index 2101c5716d4d1957dd901366835798a613d8570a..1d69218f62a660713da766362d4c38e2e0150ee2 100644
--- a/packages/person-profile/package.json
+++ b/packages/person-profile/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/person-profile",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/person-profile",
   "version": "0.1.0",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
@@ -44,6 +45,6 @@
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
     "test": "npm run build-test && karma start --singleRun",
-    "publish": "can-npm-publish --verbose 2>&1 && npm run build && echo 'Todo: Publish' || true"
+    "publish": "can-npm-publish --verbose 2>&1 && npm run build && npm publish --access public || true"
   }
 }
diff --git a/packages/person-select/package.json b/packages/person-select/package.json
index ab4ee3f9c02f62cb58d2e43287507701151f26c6..27af5e92b8ab45cfeb433ca31531879846159087 100644
--- a/packages/person-select/package.json
+++ b/packages/person-select/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/person-select",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/person-select",
   "version": "0.1.0",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
@@ -45,6 +46,6 @@
     "watch-local": "rollup -c --watch",
     "watch-dev": "rollup -c --watch --environment BUILD:development",
     "test": "npm run build-test && karma start --singleRun",
-    "publish": "can-npm-publish --verbose 2>&1 && npm run build && echo 'Todo: Publish' || true"
+    "publish": "can-npm-publish --verbose 2>&1 && npm run build && npm publish --access public || true"
   }
 }
diff --git a/packages/qr-code-scanner/README.md b/packages/qr-code-scanner/README.md
index 29961b5f1bfffd4499bc2baa62026acfc77a8dc4..ad33771ed9786ef2aa5be93e80025ef40d430925 100644
--- a/packages/qr-code-scanner/README.md
+++ b/packages/qr-code-scanner/README.md
@@ -32,6 +32,10 @@ after loaded. This attribute is also used to stop the QR code reader or if you d
 - `'code-detected'`: Outgoing Event which is fired if a QR code is detected. The data of the detected QR code is in `event.detail`.
 - `'scan-started`: Fired after the first image is drawn. Can be used to scrolling or other layout dependent tasks.
 
+## Assets
+
+- `qr-scanner/qr-scanner-worker.*` -> `dist/local/@dbp-toolkit/qr-code-scanner/`
+
 ## Local development
 
 ```bash
diff --git a/packages/qr-code-scanner/package.json b/packages/qr-code-scanner/package.json
index 0da40e15a6d58f965cb9c70cc13bbcab70ba5905..87d12104e3ab19925f2405243801ef51d431b45e 100644
--- a/packages/qr-code-scanner/package.json
+++ b/packages/qr-code-scanner/package.json
@@ -1,5 +1,6 @@
 {
   "name": "@dbp-toolkit/qr-code-scanner",
+  "homepage": "https://gitlab.tugraz.at/dbp/web-components/toolkit/-/tree/master/packages/qr-code-scanner",
   "version": "0.1.0",
   "main": "src/index.js",
   "license": "LGPL-2.1-or-later",
@@ -47,6 +48,6 @@
     "watch-dev": "rollup -c --watch --environment BUILD:development",
     "test": "npm run build-test && karma start --singleRun",
     "lint": "eslint .",
-    "publish": "can-npm-publish --verbose 2>&1 && npm run build && echo 'Todo: Publish' || true"
+    "publish": "can-npm-publish --verbose 2>&1 && npm run build && npm publish --access public || true"
   }
 }
diff --git a/packages/qr-code-scanner/src/dbp-qr-code-scanner-demo.js b/packages/qr-code-scanner/src/dbp-qr-code-scanner-demo.js
index f397a1b340c468da2aa5c9bf5fab0f8003c21d5c..4b8bd63a9cd19c061033a41eda7c5e5246159706 100644
--- a/packages/qr-code-scanner/src/dbp-qr-code-scanner-demo.js
+++ b/packages/qr-code-scanner/src/dbp-qr-code-scanner-demo.js
@@ -57,7 +57,7 @@ export class QrCodeScannerDemo extends ScopedElementsMixin(LitElement) {
                 <div class="container">
                     <div class="columns is-centered">
                         <div class="column">
-                            <dbp-qr-code-scanner show-output lang="${this.lang}"></dbp-qr-code-scanner>
+                            <dbp-qr-code-scanner @code-detected="${(e) => console.log(e)}" @scan-started="${(e) => console.log(e)}" show-output lang="${this.lang}"></dbp-qr-code-scanner>
                         </div>
                     </div>
                 </div>