├── .github └── workflows │ └── build-image.yaml ├── 404.html ├── Dockerfile ├── about └── index.html ├── app.js ├── archives └── index.html ├── assets ├── css │ ├── style.css │ └── style.css.map ├── img │ └── favicons │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── apple-touch-icon.png │ │ ├── browserconfig.xml │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ ├── mstile-150x150.png │ │ └── site.webmanifest ├── index.html └── js │ ├── data │ ├── search.json │ └── swcache.js │ └── dist │ ├── categories.min.js │ ├── commons.min.js │ ├── misc.min.js │ ├── page.min.js │ └── post.min.js ├── build-image.yaml ├── categories ├── apple │ └── index.html ├── business │ └── index.html ├── coc │ └── index.html ├── development │ └── index.html ├── docker │ └── index.html ├── emulation │ └── index.html ├── gaming │ └── index.html ├── github │ └── index.html ├── homeserver │ └── index.html ├── https │ └── index.html ├── index.html ├── letsencrypt │ └── index.html ├── mac │ └── index.html ├── network │ └── index.html ├── node │ └── index.html ├── remote │ └── index.html ├── software │ └── index.html ├── tls │ └── index.html ├── tor │ └── index.html └── virtualisation │ └── index.html ├── docs └── assets │ └── css │ └── style.css ├── feed.xml ├── index.html ├── norobots └── index.html ├── posts ├── from-local-to-cloud-to-browser-based-development │ └── index.html ├── gaming-on-apple-silicon │ └── index.html ├── how-to-create-a-tls-certificate │ └── index.html ├── how-to-host-a-tor-hidden-service │ └── index.html ├── how-to-optimize-clash-of-clans │ └── index.html ├── index.html ├── my-remote-desktop-setup │ └── index.html ├── my-ultimate-homeserver-setup │ └── index.html ├── tailscale-is-great │ └── index.html └── this-happens-to-every-business-idea-i-have │ └── index.html ├── profile_picture.jpg ├── redirects.json ├── robots.txt ├── sitemap.xml ├── sw.js ├── tags └── index.html └── unregister.js /.github/workflows/build-image.yaml: -------------------------------------------------------------------------------- 1 | name: Build Blog Image 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | push: 7 | branches: 8 | - main 9 | 10 | env: 11 | REGISTRY: ghcr.io 12 | IMAGE_NAME: ${{ github.repository }} 13 | 14 | jobs: 15 | image: 16 | runs-on: ubuntu-latest 17 | permissions: 18 | contents: read 19 | packages: write 20 | steps: 21 | - name: Checkout repository 22 | uses: actions/checkout@v4 23 | - name: Log in to the Container registry 24 | uses: docker/login-action@v3 25 | with: 26 | registry: ${{ env.REGISTRY }} 27 | username: ${{ github.actor }} 28 | password: ${{ secrets.GITHUB_TOKEN }} 29 | - name: Extract metadata (tags, labels) for Docker 30 | id: meta 31 | uses: docker/metadata-action@v5 32 | with: 33 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 34 | - name: Build and push Docker image 35 | uses: docker/build-push-action@v5 36 | with: 37 | push: true 38 | tags: ${{ steps.meta.outputs.tags }} 39 | -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | 404: Page not found | Simons Blog
Home 404: Page not found
404: Page not found
Cancel
2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:stable-alpine 2 | RUN mkdir /usr/share/nginx/html/blog 3 | COPY . /usr/share/nginx/html/blog 4 | -------------------------------------------------------------------------------- /about/index.html: -------------------------------------------------------------------------------- 1 | About | Simons Blog
Home Impressum
Impressum
Cancel

Impressum

Hi, my name is Simon Haas and I am a homeserver enthusiast :)

Simon Haas

Tirolerstraße 23

95448 Bayreuth

info@simonhaas.eu

2 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const $notification = $('#notification'); const $btnRefresh = $('#notification .toast-body>button'); if ('serviceWorker' in navigator) { /* Registering Service Worker */ navigator.serviceWorker.register('/blog/sw.js') .then(registration => { /* in case the user ignores the notification */ if (registration.waiting) { $notification.toast('show'); } registration.addEventListener('updatefound', () => { registration.installing.addEventListener('statechange', () => { if (registration.waiting) { if (navigator.serviceWorker.controller) { $notification.toast('show'); } } }); }); $btnRefresh.click(() => { if (registration.waiting) { registration.waiting.postMessage('SKIP_WAITING'); } $notification.toast('hide'); }); }); let refreshing = false; /* Detect controller change and refresh all the opened tabs */ navigator.serviceWorker.addEventListener('controllerchange', () => { if (!refreshing) { window.location.reload(); refreshing = true; } }); } 2 | -------------------------------------------------------------------------------- /assets/img/favicons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimonHaas/blog/d621a5ae9e02bc4ad4b4325f0a62ce000d2e38bc/assets/img/favicons/android-chrome-192x192.png -------------------------------------------------------------------------------- /assets/img/favicons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimonHaas/blog/d621a5ae9e02bc4ad4b4325f0a62ce000d2e38bc/assets/img/favicons/android-chrome-512x512.png -------------------------------------------------------------------------------- /assets/img/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimonHaas/blog/d621a5ae9e02bc4ad4b4325f0a62ce000d2e38bc/assets/img/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /assets/img/favicons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | #da532c 2 | -------------------------------------------------------------------------------- /assets/img/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimonHaas/blog/d621a5ae9e02bc4ad4b4325f0a62ce000d2e38bc/assets/img/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /assets/img/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimonHaas/blog/d621a5ae9e02bc4ad4b4325f0a62ce000d2e38bc/assets/img/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /assets/img/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimonHaas/blog/d621a5ae9e02bc4ad4b4325f0a62ce000d2e38bc/assets/img/favicons/favicon.ico -------------------------------------------------------------------------------- /assets/img/favicons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimonHaas/blog/d621a5ae9e02bc4ad4b4325f0a62ce000d2e38bc/assets/img/favicons/mstile-150x150.png -------------------------------------------------------------------------------- /assets/img/favicons/site.webmanifest: -------------------------------------------------------------------------------- 1 | { "name": "Simons Blog", "short_name": "Simons Blog", "description": "An open source blog about stuff I am interested in.", "icons": [ { "src": "/blog/assets/img/favicons/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/blog/assets/img/favicons/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" }], "start_url": "/blog/index.html", "theme_color": "#2a1e6b", "background_color": "#ffffff", "display": "fullscreen" } 2 | -------------------------------------------------------------------------------- /assets/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Redirecting… 5 | 6 | 7 | 8 | 9 |

Redirecting…

10 | Click here if you are not redirected. 11 | 12 | -------------------------------------------------------------------------------- /assets/js/data/swcache.js: -------------------------------------------------------------------------------- 1 | const resource = [ /* --- CSS --- */ '/blog/assets/css/style.css', /* --- PWA --- */ '/blog/app.js', '/blog/sw.js', /* --- HTML --- */ '/blog/index.html', '/blog/404.html', '/blog/categories/', '/blog/tags/', '/blog/archives/', '/blog/about/', /* --- Favicons & compressed JS --- */ '/blog/assets/img/favicons/android-chrome-192x192.png', '/blog/assets/img/favicons/android-chrome-512x512.png', '/blog/assets/img/favicons/apple-touch-icon.png', '/blog/assets/img/favicons/favicon-16x16.png', '/blog/assets/img/favicons/favicon-32x32.png', '/blog/assets/img/favicons/favicon.ico', '/blog/assets/img/favicons/mstile-150x150.png', '/blog/assets/js/dist/categories.min.js', '/blog/assets/js/dist/commons.min.js', '/blog/assets/js/dist/misc.min.js', '/blog/assets/js/dist/page.min.js', '/blog/assets/js/dist/post.min.js' ]; /* The request url with below domain will be cached */ const allowedDomains = [ 'www.simonhaas.eu', 'fonts.gstatic.com', 'fonts.googleapis.com', 'cdn.jsdelivr.net', 'polyfill.io' ]; /* Requests that include the following path will be banned */ const denyUrls = [ ]; 2 | -------------------------------------------------------------------------------- /assets/js/dist/categories.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Chirpy v5.6.1 (https://github.com/cotes2020/jekyll-theme-chirpy/) 3 | * © 2019 Cotes Chung 4 | * MIT Licensed 5 | */ 6 | !function(){"use strict";var o=$(".mode-toggle");function t(o,t){if(!(o instanceof t))throw new TypeError("Cannot call a class as a function")}function e(o,t){for(var e=0;e0}},{key:"topbarLocked",value:function(){return!0===o.topbarIsLocked}},{key:"unlockTopbar",value:function(){o.topbarIsLocked=!1}},{key:"getTopbarHeight",value:function(){return _.outerHeight()}},{key:"orientationLocked",value:function(){return!0===o.orientationIsLocked}},{key:"lockOrientation",value:function(){o.orientationIsLocked=!0}},{key:"unLockOrientation",value:function(){o.orientationIsLocked=!1}}]),o}();r(H,"scrollUpCount",0),r(H,"topbarIsLocked",!1),r(H,"orientationIsLocked",!1);var M,N=$("#search-input"),R=H.getTopbarHeight(),q=0;function A(){0!==$(window).scrollTop()&&(H.lockOrientation(),H.hideTopbar())}function Y(){var o=screen.orientation;o?o.onchange=function(){var t=o.type;"landscape-primary"!==t&&"landscape-secondary"!==t||A()}:$(window).on("orientationchange",(function(){$(window).width()<$(window).height()&&A()})),$(window).on("scroll",(function(){M||(M=!0)})),setInterval((function(){M&&(!function(){var o=$(window).scrollTop();if(!(Math.abs(q-o)<=R)){if(o>q)H.hideTopbar(),N.is(":focus")&&N.trigger("blur");else if(o+$(window).height()<$(document).height()){if(H.hasScrollUpTask())return;H.topbarLocked()?H.unlockTopbar():H.orientationLocked()?H.unLockOrientation():H.showTopbar()}q=o}}(),M=!1)}),250)}var z=$(".collapse");$(".code-header>button").children().attr("class"),$(window).on("scroll",(function(){$(window).scrollTop()>50&&"none"===$("#sidebar-trigger").css("display")?$("#back-to-top").fadeIn():$("#back-to-top").fadeOut()})),$("#back-to-top").on("click",(function(){return $("body,html").animate({scrollTop:0},800),!1})),$('[data-toggle="tooltip"]').tooltip(),0!==o.length&&o.off().on("click",(function(o){var t=$(o.target),e=t.prop("tagName")==="button".toUpperCase()?t:t.parent();modeToggle.flipMode(),e.trigger("blur")})),$("#sidebar-trigger").on("click",s.toggle),$("#mask").on("click",s.toggle),function(){if(0!==u.length&&!u.hasClass("dynamic-title")&&!f.is(":hidden")){var o=u.text().trim(),t=!1,e=0;($("#page-category").length||$("#page-tag").length)&&/\s/.test(o)&&(o=o.replace(/[0-9]/g,"").trim()),u.offset().top<$(window).scrollTop()&&f.text(o),new IntersectionObserver((function(n){if(t){var r=$(window).scrollTop(),a=e0}},{key:"topbarLocked",value:function(){return!0===o.topbarIsLocked}},{key:"unlockTopbar",value:function(){o.topbarIsLocked=!1}},{key:"getTopbarHeight",value:function(){return H.outerHeight()}},{key:"orientationLocked",value:function(){return!0===o.orientationIsLocked}},{key:"lockOrientation",value:function(){o.orientationIsLocked=!0}},{key:"unLockOrientation",value:function(){o.orientationIsLocked=!1}}]),o}();r(M,"scrollUpCount",0),r(M,"topbarIsLocked",!1),r(M,"orientationIsLocked",!1);var N,R=$("#search-input"),q=M.getTopbarHeight(),A=0;function Y(){0!==$(window).scrollTop()&&(M.lockOrientation(),M.hideTopbar())}function z(){var o=screen.orientation;o?o.onchange=function(){var e=o.type;"landscape-primary"!==e&&"landscape-secondary"!==e||Y()}:$(window).on("orientationchange",(function(){$(window).width()<$(window).height()&&Y()})),$(window).on("scroll",(function(){N||(N=!0)})),setInterval((function(){N&&(!function(){var o=$(window).scrollTop();if(!(Math.abs(A-o)<=q)){if(o>A)M.hideTopbar(),R.is(":focus")&&R.trigger("blur");else if(o+$(window).height()<$(document).height()){if(M.hasScrollUpTask())return;M.topbarLocked()?M.unlockTopbar():M.orientationLocked()?M.unLockOrientation():M.showTopbar()}A=o}}(),N=!1)}),250)}$(window).on("scroll",(function(){$(window).scrollTop()>50&&"none"===$("#sidebar-trigger").css("display")?$("#back-to-top").fadeIn():$("#back-to-top").fadeOut()})),$("#back-to-top").on("click",(function(){return $("body,html").animate({scrollTop:0},800),!1})),$('[data-toggle="tooltip"]').tooltip(),0!==o.length&&o.off().on("click",(function(o){var e=$(o.target),t=e.prop("tagName")==="button".toUpperCase()?e:e.parent();modeToggle.flipMode(),t.trigger("blur")})),$("#sidebar-trigger").on("click",s.toggle),$("#mask").on("click",s.toggle),function(){if(0!==u.length&&!u.hasClass("dynamic-title")&&!f.is(":hidden")){var o=u.text().trim(),e=!1,t=0;($("#page-category").length||$("#page-tag").length)&&/\s/.test(o)&&(o=o.replace(/[0-9]/g,"").trim()),u.offset().top<$(window).scrollTop()&&f.text(o),new IntersectionObserver((function(n){if(e){var r=$(window).scrollTop(),i=t0}},{key:"topbarLocked",value:function(){return!0===t.topbarIsLocked}},{key:"unlockTopbar",value:function(){t.topbarIsLocked=!1}},{key:"getTopbarHeight",value:function(){return P.outerHeight()}},{key:"orientationLocked",value:function(){return!0===t.orientationIsLocked}},{key:"lockOrientation",value:function(){t.orientationIsLocked=!0}},{key:"unLockOrientation",value:function(){t.orientationIsLocked=!1}}]),t}();r(V,"scrollUpCount",0),r(V,"topbarIsLocked",!1),r(V,"orientationIsLocked",!1);var A,H=$("#search-input"),M=V.getTopbarHeight(),N=0;function R(){0!==$(window).scrollTop()&&(V.lockOrientation(),V.hideTopbar())}function _(){var t=screen.orientation;t?t.onchange=function(){var e=t.type;"landscape-primary"!==e&&"landscape-secondary"!==e||R()}:$(window).on("orientationchange",(function(){$(window).width()<$(window).height()&&R()})),$(window).on("scroll",(function(){A||(A=!0)})),setInterval((function(){A&&(!function(){var t=$(window).scrollTop();if(!(Math.abs(N-t)<=M)){if(t>N)V.hideTopbar(),H.is(":focus")&&H.trigger("blur");else if(t+$(window).height()<$(document).height()){if(V.hasScrollUpTask())return;V.topbarLocked()?V.unlockTopbar():V.orientationLocked()?V.unLockOrientation():V.showTopbar()}N=t}}(),A=!1)}),250)}$(".collapse");$(".code-header>button").children().attr("class");var q=function(){function t(){e(this,t)}return n(t,null,[{key:"attrTimestamp",get:function(){return"data-ts"}},{key:"attrDateFormat",get:function(){return"data-df"}},{key:"locale",get:function(){return $("html").attr("lang").substring(0,2)}},{key:"getTimestamp",value:function(e){return Number(e.attr(t.attrTimestamp))}},{key:"getDateFormat",value:function(e){return e.attr(t.attrDateFormat)}}]),t}();$(window).on("scroll",(function(){$(window).scrollTop()>50&&"none"===$("#sidebar-trigger").css("display")?$("#back-to-top").fadeIn():$("#back-to-top").fadeOut()})),$("#back-to-top").on("click",(function(){return $("body,html").animate({scrollTop:0},800),!1})),$('[data-toggle="tooltip"]').tooltip(),0!==t.length&&t.off().on("click",(function(t){var e=$(t.target),o=e.prop("tagName")==="button".toUpperCase()?e:e.parent();modeToggle.flipMode(),o.trigger("blur")})),$("#sidebar-trigger").on("click",s.toggle),$("#mask").on("click",s.toggle),function(){if(0!==u.length&&!u.hasClass("dynamic-title")&&!f.is(":hidden")){var t=u.text().trim(),e=!1,o=0;($("#page-category").length||$("#page-tag").length)&&/\s/.test(t)&&(t=t.replace(/[0-9]/g,"").trim()),u.offset().top<$(window).scrollTop()&&f.text(t),new IntersectionObserver((function(n){if(e){var r=$(window).scrollTop(),a=o0}},{key:"topbarLocked",value:function(){return!0===t.topbarIsLocked}},{key:"unlockTopbar",value:function(){t.topbarIsLocked=!1}},{key:"getTopbarHeight",value:function(){return R.outerHeight()}},{key:"orientationLocked",value:function(){return!0===t.orientationIsLocked}},{key:"lockOrientation",value:function(){t.orientationIsLocked=!0}},{key:"unLockOrientation",value:function(){t.orientationIsLocked=!1}}]),t}();r(V,"scrollUpCount",0),r(V,"topbarIsLocked",!1),r(V,"orientationIsLocked",!1);var A,N=$("#search-input"),D=V.getTopbarHeight(),M=0;function q(){0!==$(window).scrollTop()&&(V.lockOrientation(),V.hideTopbar())}function z(){var t=screen.orientation;t?t.onchange=function(){var e=t.type;"landscape-primary"!==e&&"landscape-secondary"!==e||q()}:$(window).on("orientationchange",(function(){$(window).width()<$(window).height()&&q()})),$(window).on("scroll",(function(){A||(A=!0)})),setInterval((function(){A&&(!function(){var t=$(window).scrollTop();if(!(Math.abs(M-t)<=D)){if(t>M)V.hideTopbar(),N.is(":focus")&&N.trigger("blur");else if(t+$(window).height()<$(document).height()){if(V.hasScrollUpTask())return;V.topbarLocked()?V.unlockTopbar():V.orientationLocked()?V.unLockOrientation():V.showTopbar()}M=t}}(),A=!1)}),250)}$(".collapse");var B=".code-header>button",J="fas fa-check",Y="timeout",F="data-title-succeed",G="data-original-title",K=2e3;function Q(t){if($(t)[0].hasAttribute(Y)){var e=$(t).attr(Y);if(Number(e)>Date.now())return!0}return!1}function W(t){$(t).attr(Y,Date.now()+K)}function X(t){$(t).removeAttr(Y)}var Z,_=$(B).children().attr("class");$(window).on("scroll",(function(){$(window).scrollTop()>50&&"none"===$("#sidebar-trigger").css("display")?$("#back-to-top").fadeIn():$("#back-to-top").fadeOut()})),$("#back-to-top").on("click",(function(){return $("body,html").animate({scrollTop:0},800),!1})),$('[data-toggle="tooltip"]').tooltip(),0!==t.length&&t.off().on("click",(function(t){var e=$(t.target),o=e.prop("tagName")==="button".toUpperCase()?e:e.parent();modeToggle.flipMode(),o.trigger("blur")})),$("#sidebar-trigger").on("click",c.toggle),$("#mask").on("click",c.toggle),function(){if(0!==u.length&&!u.hasClass("dynamic-title")&&!f.is(":hidden")){var t=u.text().trim(),e=!1,o=0;($("#page-category").length||$("#page-tag").length)&&/\s/.test(t)&&(t=t.replace(/[0-9]/g,"").trim()),u.offset().top<$(window).scrollTop()&&f.text(t),new IntersectionObserver((function(n){if(e){var r=$(window).scrollTop(),a=o0}},{key:"topbarLocked",value:function(){return!0===t.topbarIsLocked}},{key:"unlockTopbar",value:function(){t.topbarIsLocked=!1}},{key:"getTopbarHeight",value:function(){return V.outerHeight()}},{key:"orientationLocked",value:function(){return!0===t.orientationIsLocked}},{key:"lockOrientation",value:function(){t.orientationIsLocked=!0}},{key:"unLockOrientation",value:function(){t.orientationIsLocked=!1}}]),t}();r(Y,"scrollUpCount",0),r(Y,"topbarIsLocked",!1),r(Y,"orientationIsLocked",!1);var F,N=$("#search-input"),U=Y.getTopbarHeight(),j=0;function A(){0!==$(window).scrollTop()&&(Y.lockOrientation(),Y.hideTopbar())}function M(){var t=screen.orientation;t?t.onchange=function(){var e=t.type;"landscape-primary"!==e&&"landscape-secondary"!==e||A()}:$(window).on("orientationchange",(function(){$(window).width()<$(window).height()&&A()})),$(window).on("scroll",(function(){F||(F=!0)})),setInterval((function(){F&&(!function(){var t=$(window).scrollTop();if(!(Math.abs(j-t)<=U)){if(t>j)Y.hideTopbar(),N.is(":focus")&&N.trigger("blur");else if(t+$(window).height()<$(document).height()){if(Y.hasScrollUpTask())return;Y.topbarLocked()?Y.unlockTopbar():Y.orientationLocked()?Y.unLockOrientation():Y.showTopbar()}j=t}}(),F=!1)}),250)}$(".collapse");var D=".code-header>button",H="fas fa-check",J="timeout",q="data-title-succeed",z="data-original-title",B=2e3;function G(t){if($(t)[0].hasAttribute(J)){var e=$(t).attr(J);if(Number(e)>Date.now())return!0}return!1}function Q(t){$(t).attr(J,Date.now()+B)}function W(t){$(t).removeAttr(J)}var X=$(D).children().attr("class");var Z=function(){function t(){e(this,t)}return n(t,null,[{key:"attrTimestamp",get:function(){return"data-ts"}},{key:"attrDateFormat",get:function(){return"data-df"}},{key:"locale",get:function(){return $("html").attr("lang").substring(0,2)}},{key:"getTimestamp",value:function(e){return Number(e.attr(t.attrTimestamp))}},{key:"getDateFormat",value:function(e){return e.attr(t.attrDateFormat)}}]),t}();var tt,et,ot=(tt=!1,function(){var t=tt;return tt||(tt=!0),t}),nt=function(){function t(t){return $(t).attr("content")}function e(e){var o=t(e);return void 0!==o&&!1!==o}return{getProxyMeta:function(){return t("meta[name=pv-proxy-endpoint]")},getLocalMeta:function(){return t("meta[name=pv-cache-path]")},hasProxyMeta:function(){return e("meta[name=pv-proxy-endpoint]")},hasLocalMeta:function(){return e("meta[name=pv-cache-path]")}}}(),rt=function(){var t={KEY_PV:"pv",KEY_PV_SRC:"pv_src",KEY_CREATION:"pv_created_date"},e="same-origin",o="cors";function n(t){return localStorage.getItem(t)}function r(t,e){localStorage.setItem(t,e)}function a(e,o){r(t.KEY_PV,e),r(t.KEY_PV_SRC,o),r(t.KEY_CREATION,(new Date).toJSON())}return{keysCount:function(){return Object.keys(t).length},hasCache:function(){return null!==localStorage.getItem(t.KEY_PV)},getCache:function(){return JSON.parse(localStorage.getItem(t.KEY_PV))},saveLocalCache:function(t){a(t,e)},saveProxyCache:function(t){a(t,o)},isExpired:function(){var e=new Date(n(t.KEY_CREATION));return e.setHours(e.getHours()+1),Date.now()>=e.getTime()},isFromLocal:function(){return n(t.KEY_PV_SRC)===e},isFromProxy:function(){return n(t.KEY_PV_SRC)===o},newerThan:function(t){return rt.getCache().totalsForAllResults["ga:pageviews"]>t.totalsForAllResults["ga:pageviews"]},inspectKeys:function(){if(localStorage.length===rt.keysCount())for(var e=0;ea&&function(t,e,o){if(t0)$(".post-preview").each((function(){var t=$(this).find("a").attr("href");at(o,t,$(this).find(".pageviews"),e)}));else if($(".post").length>0){var n=window.location.pathname;at(o,n,$("#pv"),e)}}}function ct(){nt.hasProxyMeta()&&$.ajax({type:"GET",url:nt.getProxyMeta(),dataType:"jsonp",success:function(t){it(t),rt.saveProxyCache(JSON.stringify(t))},error:function(t,e,o){console.log("Failed to load pageviews from proxy server: "+o)}})}function lt(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return fetch(nt.getLocalMeta()).then((function(t){return t.json()})).then((function(e){t&&rt.isFromProxy()&&rt.newerThan(e)||(it(e),rt.saveLocalCache(JSON.stringify(e)))}))}$(window).on("scroll",(function(){$(window).scrollTop()>50&&"none"===$("#sidebar-trigger").css("display")?$("#back-to-top").fadeIn():$("#back-to-top").fadeOut()})),$("#back-to-top").on("click",(function(){return $("body,html").animate({scrollTop:0},800),!1})),$('[data-toggle="tooltip"]').tooltip(),0!==t.length&&t.off().on("click",(function(t){var e=$(t.target),o=e.prop("tagName")==="button".toUpperCase()?e:e.parent();modeToggle.flipMode(),o.trigger("blur")})),$("#sidebar-trigger").on("click",l.toggle),$("#mask").on("click",l.toggle),function(){if(0!==u.length&&!u.hasClass("dynamic-title")&&!f.is(":hidden")){var t=u.text().trim(),e=!1,o=0;($("#page-category").length||$("#page-tag").length)&&/\s/.test(t)&&(t=t.replace(/[0-9]/g,"").trim()),u.offset().top<$(window).scrollTop()&&f.text(t),new IntersectionObserver((function(n){if(e){var r=$(window).scrollTop(),a=o apple | Simons Blog
Home Categories apple
Category
Cancel
2 | -------------------------------------------------------------------------------- /categories/coc/index.html: -------------------------------------------------------------------------------- 1 | coc | Simons Blog
Home Categories coc
Category
Cancel
2 | -------------------------------------------------------------------------------- /categories/emulation/index.html: -------------------------------------------------------------------------------- 1 | emulation | Simons Blog
Home Categories emulation
Category
Cancel
2 | -------------------------------------------------------------------------------- /categories/gaming/index.html: -------------------------------------------------------------------------------- 1 | gaming | Simons Blog
Home Categories gaming
Category
Cancel
2 | -------------------------------------------------------------------------------- /categories/github/index.html: -------------------------------------------------------------------------------- 1 | github | Simons Blog
Home Categories github
Category
Cancel
2 | -------------------------------------------------------------------------------- /categories/https/index.html: -------------------------------------------------------------------------------- 1 | https | Simons Blog
Home Categories https
Category
Cancel
2 | -------------------------------------------------------------------------------- /categories/mac/index.html: -------------------------------------------------------------------------------- 1 | mac | Simons Blog
Home Categories mac
Category
Cancel
2 | -------------------------------------------------------------------------------- /categories/network/index.html: -------------------------------------------------------------------------------- 1 | network | Simons Blog
Home Categories network
Category
Cancel
2 | -------------------------------------------------------------------------------- /categories/node/index.html: -------------------------------------------------------------------------------- 1 | node | Simons Blog
Home Categories node
Category
Cancel
2 | -------------------------------------------------------------------------------- /categories/remote/index.html: -------------------------------------------------------------------------------- 1 | remote | Simons Blog
Home Categories remote
Category
Cancel
2 | -------------------------------------------------------------------------------- /categories/tls/index.html: -------------------------------------------------------------------------------- 1 | tls | Simons Blog
Home Categories tls
Category
Cancel
2 | -------------------------------------------------------------------------------- /categories/tor/index.html: -------------------------------------------------------------------------------- 1 | tor | Simons Blog
Home Categories tor
Category
Cancel
2 | -------------------------------------------------------------------------------- /feed.xml: -------------------------------------------------------------------------------- 1 | https://www.simonhaas.eu/blog/Simons BlogAn open source blog about stuff I am interested in. 2025-05-30T12:25:13+02:00 Simon Haas https://www.simonhaas.eu/blog/ Jekyll © 2025 Simon Haas /blog/assets/img/favicons/favicon.ico /blog/assets/img/favicons/favicon-96x96.png Tailscale is great2025-05-27T00:00:00+02:00 2025-05-30T12:24:28+02:00 https://www.simonhaas.eu/blog/posts/tailscale-is-great/ Simon Haas Tailscale is great. I use it on basically every device I can put it on. With it I do not have to wory about which device is in which network or hosted on which cloud provider, I do not have to wory about firewall rules and port forwarding (for stuff only I use) and do not have to wory about hosting and maintaining my own VPN server - and the best part: Tailscale is free for personal use. Tail... My remote desktop I can access from anywhere via a browser2025-05-27T00:00:00+02:00 2025-05-30T11:58:07+02:00 https://www.simonhaas.eu/blog/posts/my-remote-desktop-setup/ Simon Haas I have a Windows Desktop at home which I can access from anywhere in the world just via a browser. This gives me the ability to access a familiar desktop environment with all my personal data and all my programs from wherever I am. I use kasm which on one site can do a lot more than I require and on the other site includes (almost) everything I need. You can install kasm on a linux machine lik... How to host a tor hidden service2025-03-25T00:00:00+01:00 2025-05-28T16:56:55+02:00 https://www.simonhaas.eu/blog/posts/how-to-host-a-tor-hidden-service/ Simon Haas You can access this very same blog as a hidden service at http://simonja4fdp3lxdjeis5qjuugqe3wtbstlr2w7gmzsrnhhkpctmbgead.onion Hosting a website as a hidden service via the tor network is easy. With my setup you can host arbitrary webservices on the tor network just like you would do on the clearnet. I use docker compose with one service to run tor and nginx proxy manager to easily manage mu... Gaming on Apple Silicon - an overview2024-05-23T13:00:00+02:00 2024-05-23T16:41:34+02:00 https://www.simonhaas.eu/blog/posts/gaming-on-apple-silicon/ Simon Haas Apple Mac computers are not known to be great gaming machines but make no mistake, the M-series Apple Silicon chips are more powerfull than you think. Benchmarks do not tell the full story. You have to experience it yourself to fully understand the innovation these processors are. This blog post is supposed to be a high level overview to see how you can play which game on your Apple Silicon Ma... From local to cloud back to local development2024-02-15T09:22:00+01:00 2024-02-15T09:22:00+01:00 https://www.simonhaas.eu/blog/posts/from-local-to-cloud-to-browser-based-development/ Simon Haas Technology is changing continuously. This is how your coding workflow might evolve. It is a simplified version of my journey which certainly was and is not as straight forward as described here. This post focuses on web development with node.js and github for your code hosting. Local development At first you start like everyone by installing everything you need locally. You install node.js,... 2 | -------------------------------------------------------------------------------- /norobots/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Redirecting… 5 | 6 | 7 | 8 | 9 |

Redirecting…

10 | Click here if you are not redirected. 11 | 12 | -------------------------------------------------------------------------------- /posts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Redirecting… 5 | 6 | 7 | 8 | 9 |

Redirecting…

10 | Click here if you are not redirected. 11 | 12 | -------------------------------------------------------------------------------- /profile_picture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimonHaas/blog/d621a5ae9e02bc4ad4b4325f0a62ce000d2e38bc/profile_picture.jpg -------------------------------------------------------------------------------- /redirects.json: -------------------------------------------------------------------------------- 1 | {"/norobots/":"https://www.simonhaas.eu/blog/404.html","/assets/":"https://www.simonhaas.eu/blog/404.html","/posts/":"https://www.simonhaas.eu/blog/404.html"} -------------------------------------------------------------------------------- /robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | 3 | Disallow: /norobots/ 4 | 5 | Sitemap: https://www.simonhaas.eu/blog/sitemap.xml 6 | -------------------------------------------------------------------------------- /sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://www.simonhaas.eu/blog/posts/how-to-create-a-tls-certificate/ 5 | 2022-06-05T11:04:43+02:00 6 | 7 | 8 | https://www.simonhaas.eu/blog/posts/my-ultimate-homeserver-setup/ 9 | 2022-06-22T13:33:34+02:00 10 | 11 | 12 | https://www.simonhaas.eu/blog/posts/how-to-optimize-clash-of-clans/ 13 | 2023-11-28T15:03:47+01:00 14 | 15 | 16 | https://www.simonhaas.eu/blog/posts/this-happens-to-every-business-idea-i-have/ 17 | 2024-01-19T21:17:00+01:00 18 | 19 | 20 | https://www.simonhaas.eu/blog/posts/from-local-to-cloud-to-browser-based-development/ 21 | 2024-02-15T09:22:00+01:00 22 | 23 | 24 | https://www.simonhaas.eu/blog/posts/gaming-on-apple-silicon/ 25 | 2024-05-23T16:41:34+02:00 26 | 27 | 28 | https://www.simonhaas.eu/blog/posts/how-to-host-a-tor-hidden-service/ 29 | 2025-05-28T16:56:55+02:00 30 | 31 | 32 | https://www.simonhaas.eu/blog/posts/my-remote-desktop-setup/ 33 | 2025-05-30T11:58:07+02:00 34 | 35 | 36 | https://www.simonhaas.eu/blog/posts/tailscale-is-great/ 37 | 2025-05-30T12:24:28+02:00 38 | 39 | 40 | https://www.simonhaas.eu/blog/categories/ 41 | 2025-05-30T12:25:13+02:00 42 | 43 | 44 | https://www.simonhaas.eu/blog/tags/ 45 | 2025-05-30T12:25:13+02:00 46 | 47 | 48 | https://www.simonhaas.eu/blog/archives/ 49 | 2025-05-30T12:25:13+02:00 50 | 51 | 52 | https://www.simonhaas.eu/blog/about/ 53 | 2025-05-30T12:25:13+02:00 54 | 55 | 56 | https://www.simonhaas.eu/blog/ 57 | 58 | 59 | https://www.simonhaas.eu/blog/categories/homeserver/ 60 | 61 | 62 | https://www.simonhaas.eu/blog/categories/letsencrypt/ 63 | 64 | 65 | https://www.simonhaas.eu/blog/categories/tls/ 66 | 67 | 68 | https://www.simonhaas.eu/blog/categories/https/ 69 | 70 | 71 | https://www.simonhaas.eu/blog/categories/docker/ 72 | 73 | 74 | https://www.simonhaas.eu/blog/categories/coc/ 75 | 76 | 77 | https://www.simonhaas.eu/blog/categories/software/ 78 | 79 | 80 | https://www.simonhaas.eu/blog/categories/business/ 81 | 82 | 83 | https://www.simonhaas.eu/blog/categories/development/ 84 | 85 | 86 | https://www.simonhaas.eu/blog/categories/github/ 87 | 88 | 89 | https://www.simonhaas.eu/blog/categories/node/ 90 | 91 | 92 | https://www.simonhaas.eu/blog/categories/apple/ 93 | 94 | 95 | https://www.simonhaas.eu/blog/categories/mac/ 96 | 97 | 98 | https://www.simonhaas.eu/blog/categories/gaming/ 99 | 100 | 101 | https://www.simonhaas.eu/blog/categories/emulation/ 102 | 103 | 104 | https://www.simonhaas.eu/blog/categories/virtualisation/ 105 | 106 | 107 | https://www.simonhaas.eu/blog/categories/tor/ 108 | 109 | 110 | https://www.simonhaas.eu/blog/categories/remote/ 111 | 112 | 113 | https://www.simonhaas.eu/blog/categories/network/ 114 | 115 | 116 | -------------------------------------------------------------------------------- /sw.js: -------------------------------------------------------------------------------- 1 | self.importScripts('/blog/assets/js/data/swcache.js'); const cacheName = 'chirpy-20250530.122514'; function verifyDomain(url) { for (const domain of allowedDomains) { const regex = RegExp(`^http(s)?:\/\/${domain}\/`); if (regex.test(url)) { return true; } } return false; } function isExcluded(url) { for (const item of denyUrls) { if (url === item) { return true; } } return false; } self.addEventListener('install', event => { event.waitUntil( caches.open(cacheName).then(cache => { return cache.addAll(resource); }) ); }); self.addEventListener('activate', event => { event.waitUntil( caches.keys().then(keyList => { return Promise.all( keyList.map(key => { if (key !== cacheName) { return caches.delete(key); } }) ); }) ); }); self.addEventListener('message', (event) => { if (event.data === 'SKIP_WAITING') { self.skipWaiting(); } }); self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request).then(response => { if (response) { return response; } return fetch(event.request).then(response => { const url = event.request.url; if (event.request.method !== 'GET' || !verifyDomain(url) || isExcluded(url)) { return response; } /* see: */ let responseToCache = response.clone(); caches.open(cacheName).then(cache => { /* console.log('[sw] Caching new resource: ' + event.request.url); */ cache.put(event.request, responseToCache); }); return response; }); }) ); }); 2 | -------------------------------------------------------------------------------- /tags/index.html: -------------------------------------------------------------------------------- 1 | Tags | Simons Blog
Home Tags
Tags
Cancel
2 | -------------------------------------------------------------------------------- /unregister.js: -------------------------------------------------------------------------------- 1 | if ('serviceWorker' in navigator) { navigator.serviceWorker.getRegistrations().then((registrations) => { for (let reg of registrations) { reg.unregister(); } }); } 2 | --------------------------------------------------------------------------------