diff --git a/package-lock.json b/package-lock.json
index 4f3cb39d..40456c13 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -432,9 +432,9 @@
}
},
"node_modules/@eslint/eslintrc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
- "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz",
+ "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
@@ -455,9 +455,9 @@
}
},
"node_modules/@eslint/js": {
- "version": "8.52.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz",
- "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==",
+ "version": "8.53.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz",
+ "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -695,9 +695,9 @@
}
},
"node_modules/@sveltejs/kit": {
- "version": "1.27.2",
- "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.2.tgz",
- "integrity": "sha512-2w2VbPpK8DI3QCSVa2UNAv5sKNks1LT8GsEdpk41ffOyO2znGx2ZwcRWacsqlvh3d9lncZuDdANvCbTbuKvy3Q==",
+ "version": "1.27.3",
+ "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.3.tgz",
+ "integrity": "sha512-pd7qwX6ww5noA0/FLk45B0aKUeOXWR+pfZsGTrv3dRmj3lTmnki9UTmTdWzHJGrje+BBkGUZHfgGrsSOQQBQpQ==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
@@ -796,16 +796,16 @@
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz",
- "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz",
+ "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==",
"dev": true,
"dependencies": {
"@eslint-community/regexpp": "^4.5.1",
- "@typescript-eslint/scope-manager": "6.9.1",
- "@typescript-eslint/type-utils": "6.9.1",
- "@typescript-eslint/utils": "6.9.1",
- "@typescript-eslint/visitor-keys": "6.9.1",
+ "@typescript-eslint/scope-manager": "6.10.0",
+ "@typescript-eslint/type-utils": "6.10.0",
+ "@typescript-eslint/utils": "6.10.0",
+ "@typescript-eslint/visitor-keys": "6.10.0",
"debug": "^4.3.4",
"graphemer": "^1.4.0",
"ignore": "^5.2.4",
@@ -831,15 +831,15 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz",
- "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz",
+ "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==",
"dev": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "6.9.1",
- "@typescript-eslint/types": "6.9.1",
- "@typescript-eslint/typescript-estree": "6.9.1",
- "@typescript-eslint/visitor-keys": "6.9.1",
+ "@typescript-eslint/scope-manager": "6.10.0",
+ "@typescript-eslint/types": "6.10.0",
+ "@typescript-eslint/typescript-estree": "6.10.0",
+ "@typescript-eslint/visitor-keys": "6.10.0",
"debug": "^4.3.4"
},
"engines": {
@@ -859,13 +859,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz",
- "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz",
+ "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.9.1",
- "@typescript-eslint/visitor-keys": "6.9.1"
+ "@typescript-eslint/types": "6.10.0",
+ "@typescript-eslint/visitor-keys": "6.10.0"
},
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -876,13 +876,13 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz",
- "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz",
+ "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/typescript-estree": "6.9.1",
- "@typescript-eslint/utils": "6.9.1",
+ "@typescript-eslint/typescript-estree": "6.10.0",
+ "@typescript-eslint/utils": "6.10.0",
"debug": "^4.3.4",
"ts-api-utils": "^1.0.1"
},
@@ -903,9 +903,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz",
- "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz",
+ "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==",
"dev": true,
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -916,13 +916,13 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz",
- "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz",
+ "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.9.1",
- "@typescript-eslint/visitor-keys": "6.9.1",
+ "@typescript-eslint/types": "6.10.0",
+ "@typescript-eslint/visitor-keys": "6.10.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@@ -943,17 +943,17 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz",
- "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz",
+ "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
"@types/json-schema": "^7.0.12",
"@types/semver": "^7.5.0",
- "@typescript-eslint/scope-manager": "6.9.1",
- "@typescript-eslint/types": "6.9.1",
- "@typescript-eslint/typescript-estree": "6.9.1",
+ "@typescript-eslint/scope-manager": "6.10.0",
+ "@typescript-eslint/types": "6.10.0",
+ "@typescript-eslint/typescript-estree": "6.10.0",
"semver": "^7.5.4"
},
"engines": {
@@ -968,12 +968,12 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz",
- "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz",
+ "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==",
"dev": true,
"dependencies": {
- "@typescript-eslint/types": "6.9.1",
+ "@typescript-eslint/types": "6.10.0",
"eslint-visitor-keys": "^3.4.1"
},
"engines": {
@@ -1519,15 +1519,15 @@
}
},
"node_modules/eslint": {
- "version": "8.52.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz",
- "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==",
+ "version": "8.53.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz",
+ "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.2",
- "@eslint/js": "8.52.0",
+ "@eslint/eslintrc": "^2.1.3",
+ "@eslint/js": "8.53.0",
"@humanwhocodes/config-array": "^0.11.13",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@@ -1573,6 +1573,18 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/eslint-compat-utils": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
+ "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
"node_modules/eslint-config-prettier": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz",
@@ -1586,16 +1598,17 @@
}
},
"node_modules/eslint-plugin-svelte": {
- "version": "2.34.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.34.0.tgz",
- "integrity": "sha512-4RYUgNai7wr0v+T/kljMiYSjC/oqwgq5i+cPppawryAayj4C7WK1ixFlWCGmNmBppnoKCl4iA4ZPzPtlHcb4CA==",
+ "version": "2.35.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.0.tgz",
+ "integrity": "sha512-3WDFxNrkXaMlpqoNo3M1ZOQuoFLMO9+bdnN6oVVXaydXC7nzCJuGy9a0zqoNDHMSRPYt0Rqo6hIdHMEaI5sQnw==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@jridgewell/sourcemap-codec": "^1.4.14",
"debug": "^4.3.1",
+ "eslint-compat-utils": "^0.1.2",
"esutils": "^2.0.3",
- "known-css-properties": "^0.28.0",
+ "known-css-properties": "^0.29.0",
"postcss": "^8.4.5",
"postcss-load-config": "^3.1.4",
"postcss-safe-parser": "^6.0.0",
@@ -1753,9 +1766,9 @@
"dev": true
},
"node_modules/fast-glob": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
- "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
"dev": true,
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
@@ -2164,9 +2177,9 @@
}
},
"node_modules/known-css-properties": {
- "version": "0.28.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz",
- "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==",
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
+ "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
"dev": true
},
"node_modules/levn": {
@@ -2380,9 +2393,9 @@
"dev": true
},
"node_modules/nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"dev": true,
"funding": [
{
diff --git a/src/lib/customers/comet-de.json b/src/lib/customers/comet-de.json
deleted file mode 100644
index 0229a375..00000000
--- a/src/lib/customers/comet-de.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "name": "Comet",
- "title": "bespinian unterstützt CI Tech Sensors beim Aufbau eines zentralen Notendaten-Managements",
- "customer": "CI Tech Sensors AG entwickelt und produziert Banknoten-Sensoren, welche weltweit in Bankomaten, Einzahlungsautomaten und Zählmaschinen zum Einsatz kommen. CI Tech Sensors ist ein Tochterunternehmen von Diebold-Nixdorf und ein langjähriger Entwicklungspartner von Giesecke+Devirent. CI Tech Sensors beschäftigt rund 100 Mitarbeiter an ihrem Standort in Burgdorf in der Schweiz.",
- "background": "Zur Entwicklung von Banknoten-Sensoren sind grosse Mengen an Banknoten-Daten erforderlich. Eine zentrale Rolle spielen dabei Bilddaten, etwa zum Adaptieren von Erkennungs-Algorithmen und zum anschliessenden Validieren der von den Kunden geforderten Erkennungsraten. Neben Bilddaten werden auch verschiedene Metadaten zu Banknoten benötigt, zum Beispiel Serien- und Emissions-Nummern, Qualitäts-Bewertungen sowie technische Hintergrundinformationen zum Ort und zum Gerät, mit dem die Notendaten aufgenommen wurden.",
- "goal": "Ziel des Projektes war es, alle Banknoten-Daten in eine zentrale Verwaltung zu überführen und diese allen Prozessen und Tools von CI Tech Sensors zentral zur Verfügung zu stellen. Neue Banknoten-Daten sollten bei der Aufnahme in die Verwaltung auf Gültigkeit überprüft und anschliessend redundanzfrei abgelegt werden. Jeder Banknoten-Datensatz sollte in der Verwaltung eindeutig adressierbar sein. Zudem sollten alle Banknoten-Daten unveränderbar abgelegt werden, um eine strenge Reproduzierbarkeit aller Prozessschritte bei der Entwicklung und bei der Validierung von Banknoten-Sensoren zu garantieren.",
- "contribution": {
- "intro": "bespinian hatte eine Schlüsselrolle in den folgenden Themen.",
- "topics": [
- {
- "title": "Microservice-Architektur",
- "body": "In regelmässigen Architektur-Workshops hat bespinian zusammen mit CI Tech Sensors eine Microservice-Architektur entworfen. Mit der schrittweisen Einführung von klar abgegrenzten und wohldefinierten Services in die Prozesslandschaft konnte das zentrale Notendaten-Management eingeführt werden, ohne das Kerngeschäft von CI Tech Sensors zu beeinträchtigen. Neben der Architekturarbeit hat bespinian auch bei der hands-on Implementation der Microservices Verantwortung übernommen."
- },
- {
- "title": "Kubernetes-Infrastruktur",
- "body": "Alle Microservices des Notendaten-Managements von CI Tech Sensors werden auf Kubernetes-Infrastruktur betrieben. Hierbei hat bespinian den Lead für die Konfiguration der Kubernetes-Umgebungen und für das automatisierte Deployment der Services übernommen. In einer Mischung aus Schulung, Code-Reviews und Pair-Engineering hat bespinian sichergestellt, dass das Team von CI Tech Sensors das nötige Kubernetes Know-how aufbauen konnte, um die Services betreiben und weiterentwickeln zu können."
- },
- {
- "title": "Monitoring und Alerting",
- "body": "Die Microservices des zentralen Notendaten-Managements nehmen naturgemäss eine kritische Rolle im Kerngeschäft von CI Tech Sensors ein. Neben der operativen Überwachung der Services spielten auch fachliche Kenngrössen eine wichtige Rolle (z. B. Anzahl defekter Noten-Daten). bespinian erarbeitete zusammen mit CI Tech Sensors ein Konzept für Monitoring und Alerting basierend auf Prometheus und Grafana und übernahm den Lead bei der Implementation der Monitoring-Infrastruktur und Dashboards. Zudem hat bespinian sichergestellt, dass das Team von CI Tech Sensors sein Know-how der eingesetzten Technologien aufbauen konnte, sodass das Monitoring und Alerting zusammen mit den Microservices wachsen konnte."
- },
- {
- "title": "Übergang zum DevOps-Ansatz",
- "body": "Der Einsatz von Kubernetes und die Entwicklung einer zentralisierten, hochverfügbaren Microservice-Architektur machten den Schritt zu einem DevOps-Ansatz im Entwicklungsteam von CI Tech Sensors unumgänglich. bespinian unterstützte CI Tech Sensors bei diesem Schritt durch Coaching und Beratung der im Prozess involvierten Teams und durch das Etablieren der nötigen Tools und Abläufe."
- }
- ]
- },
- "technologies": [
- "Python / Flask",
- "PostgreSQL",
- "Redis",
- "MongoDB",
- "Kubernetes",
- "Prometheus / Grafana / Alertmanager",
- "Elasticsearch / Kibana"
- ],
- "quote": {
- "body": "Mit ihrer überzeugenden Mischung aus hands-on Engineering, Coaching und Beratung ist bespinian der ideale Partner und Begleiter auf unserer Reise in die Welt von Container, Microservices und DevOps.",
- "stakeholder": {
- "name": "Lukas Burger",
- "role": "Leiter Software-Entwicklung"
- }
- }
-}
diff --git a/src/lib/customers/comet-en.json b/src/lib/customers/comet-en.json
deleted file mode 100644
index 3c71dd50..00000000
--- a/src/lib/customers/comet-en.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "name": "Comet",
- "title": "bespinian and Comet create the revolutionary IoT device health monitor BLOX",
- "customer": "Comet Group develops and produces x-ray and CT systems that enable non destructive testing of materials and industry products. These devices are used in electronics, the aerospace and the automotive industries worldwide. Comet is a Swiss company based in Flamatt employing more than 1700 people around the globe. They are a leading tech company driving innovation in the x-ray and radio frequency areas.",
- "background": "The x-ray and CT machines Comet has deployed with their customers worldwide require regular maintenance. Knowing what exactly is going on within these devices and how they are being used is crucial for efficiently working with them. With targeted data visualization and preventive alerts, one can recognize usage patterns, detect incorrect usage and prevent outages. That is why Comet wanted to innovate in this space and create a tool for ",
- "goal": "Ziel des Projektes war es, alle Banknoten-Daten in eine zentrale Verwaltung zu überführen und diese allen Prozessen und Tools von CI Tech Sensors zentral zur Verfügung zu stellen. Neue Banknoten-Daten sollten bei der Aufnahme in die Verwaltung auf Gültigkeit überprüft und anschliessend redundanzfrei abgelegt werden. Jeder Banknoten-Datensatz sollte in der Verwaltung eindeutig adressierbar sein. Zudem sollten alle Banknoten-Daten unveränderbar abgelegt werden, um eine strenge Reproduzierbarkeit aller Prozessschritte bei der Entwicklung und bei der Validierung von Banknoten-Sensoren zu garantieren.",
- "contribution": {
- "intro": "bespinian played a key role in the following areas:",
- "topics": [
- {
- "title": "Microservice-Architektur",
- "body": "In regelmässigen Architektur-Workshops hat bespinian zusammen mit CI Tech Sensors eine Microservice-Architektur entworfen. Mit der schrittweisen Einführung von klar abgegrenzten und wohldefinierten Services in die Prozesslandschaft konnte das zentrale Notendaten-Management eingeführt werden, ohne das Kerngeschäft von CI Tech Sensors zu beeinträchtigen. Neben der Architekturarbeit hat bespinian auch bei der hands-on Implementation der Microservices Verantwortung übernommen."
- },
- {
- "title": "Kubernetes-Infrastruktur",
- "body": "Alle Microservices des Notendaten-Managements von CI Tech Sensors werden auf Kubernetes-Infrastruktur betrieben. Hierbei hat bespinian den Lead für die Konfiguration der Kubernetes-Umgebungen und für das automatisierte Deployment der Services übernommen. In einer Mischung aus Schulung, Code-Reviews und Pair-Engineering hat bespinian sichergestellt, dass das Team von CI Tech Sensors das nötige Kubernetes Know-how aufbauen konnte, um die Services betreiben und weiterentwickeln zu können."
- },
- {
- "title": "Monitoring und Alerting",
- "body": "Die Microservices des zentralen Notendaten-Managements nehmen naturgemäss eine kritische Rolle im Kerngeschäft von CI Tech Sensors ein. Neben der operativen Überwachung der Services spielten auch fachliche Kenngrössen eine wichtige Rolle (z. B. Anzahl defekter Noten-Daten). bespinian erarbeitete zusammen mit CI Tech Sensors ein Konzept für Monitoring und Alerting basierend auf Prometheus und Grafana und übernahm den Lead bei der Implementation der Monitoring-Infrastruktur und Dashboards. Zudem hat bespinian sichergestellt, dass das Team von CI Tech Sensors sein Know-how der eingesetzten Technologien aufbauen konnte, sodass das Monitoring und Alerting zusammen mit den Microservices wachsen konnte."
- },
- {
- "title": "Übergang zum DevOps-Ansatz",
- "body": "Der Einsatz von Kubernetes und die Entwicklung einer zentralisierten, hochverfügbaren Microservice-Architektur machten den Schritt zu einem DevOps-Ansatz im Entwicklungsteam von CI Tech Sensors unumgänglich. bespinian unterstützte CI Tech Sensors bei diesem Schritt durch Coaching und Beratung der im Prozess involvierten Teams und durch das Etablieren der nötigen Tools und Abläufe."
- }
- ]
- },
- "technologies": [
- "Python / Flask",
- "Svelte",
- "Terraform",
- "AWS Lambda",
- "Amazon DynamoDB",
- "Amazon S3",
- "Amazon CloudFront"
- ],
- "quote": {
- "body": "Merp derp.",
- "stakeholder": {
- "name": "Pascal Corbat",
- "role": "Leiter Software-Entwicklung"
- }
- }
-}
diff --git a/src/lib/customers/comet-group-de.json b/src/lib/customers/comet-group-de.json
new file mode 100644
index 00000000..ea932490
--- /dev/null
+++ b/src/lib/customers/comet-group-de.json
@@ -0,0 +1,46 @@
+{
+ "name": "Comet",
+ "title": "bespinian und Comet entwickeln den IoT-Healthmonitor BLOX",
+ "customer": "Die Comet Group ist ein Schweizer Unternehmen mit Sitz in Flamatt, das weltweit mehr als 1700 Mitarbeitende beschäftigt. Sie ist ein führendes Technologieunternehmen, das Innovationen in der Röntgen- und Hochfrequenzbranche vorantreibt. Der Geschäftsbereich Comet X-ray entwickelt und produziert Röntgenmodule, die eine zerstörungsfreie Prüfung von Materialien und Industriekomponenten ermöglichen. Die geprüften Teile stammen aus der Luft- und Raumfahrt, der Automobilindustrie, der Batterieindustrie, der Halbleiterindustrie und anderen Märkten.",
+ "background": "Die Röntgenmodule, die Comet bei seinen Kunden weltweit einsetzt, müssen regelmässig gewartet werden. Zu wissen, was genau in diesen Geräten vor sich geht und wie sie genutzt werden, ist entscheidend für eine effiziente Arbeit mit ihnen. Mit gezielter Datenvisualisierung und präventiven Alerts lassen sich Muster, Abweichungen und Lücken erkennen, falsche Nutzung aufdecken und Ausfälle verhindern. Aus diesem Grund wollte Comet in diesem Bereich innovativ sein und ein solches Tool namens BLOX für sich und seine Kunden entwickeln.",
+ "goal": "Das Ziel von BLOX ist es, Comet und seinen Kunden das Gesamtbild zu vermitteln. Durch die transparente und übersichtliche Darstellung der Metriken und Daten jedes Geräts in einer leicht verständlichen Art und Weise, die zeigt, wie das Gerät verwendet wurde. Die Benutzer können dann mögliche Probleme des Geräts untersuchen, indem sie in verschiedene Diagramme mit einer Vielzahl von Metriken eintauchen. Sie erhalten auch Warnungen und Hinweise, wenn das System ungewöhnliche Muster und unerwartete Systemzustände feststellt. bespinian und Comet entwickeln BLOX in enger Zusammenarbeit und sind sehr zufrieden damit, dass das Tool bereits einen grossen Nutzen bringt.",
+ "contribution": {
+ "intro": "bespinian hatte eine Schlüsselrolle in den folgenden Themen.",
+ "topics": [
+ {
+ "title": "Infrastruktursetup",
+ "body": "bespinian richtete die Infrastruktur von BLOX ein, indem wir mehrere separate Umgebungen in AWS mit Terraform bereitstellten. Diese Infrastruktur musste belastbar, einfach zu warten und kosteneffizient sein. Durch die Wahl von hochgradigen Serverless-Technologien wie AWS Lambda, Amazon DynamoDB oder Amazon S3 für verschiedene Teile der Anwendung konnte ein Grossteil des Infrastruktursetups und der -wartung an den Cloud-Anbieter delegiert werden. Durch die Verwendung von Infrastruktur als Code können wir problemlos mehrere Umgebungen verwalten und sicherstellen, dass sie gleichwertig sind."
+ },
+ {
+ "title": "Backend-Entwicklung",
+ "body": "Das Backend von BLOX ist das Herzstück der Anwendung, in dem sich die gesamte Logik befindet. Es ist in Python geschrieben, weil diese Sprache Comet gut bekannt ist, von AWS Lambda vollumfänglich unterstützt ist und uns die Flexibilität bietet, kleine iterative Änderungen durchzuführen. Das ist wichtig, denn die Business-Logik, wie die Logs und Metriken von Geräten interpretiert werden, ist mit sehr komplex. Durch die Verwendung von sauber strukturiertem und getesteten Code ist diese Komplexität jedoch gut dokumentiert und im BLOX-Backend-Code automatisiert."
+ },
+ {
+ "title": "Frontend-Entwicklung",
+ "body": "Für das Frontend, das in den Webbrowsern der Nutzer:innen dargestellt wird, haben wir uns für Svelte und Svelte Kit entschieden. Beides sind relativ neue, aber mächtige Technologien, die es uns ermöglichen, eine sichere und leistungsfähige Browseranwendung zu erstellen, die einfach zu bedienen und leicht zugänglich ist. Für das Hosting dieser Anwendung wurde eine Kombination aus S3 und CloudFront gewählt. Auf diese Weise wird BLOX auf sehr kosteneffiziente Weise bereitgestellt und ist für Comet und seine Kunden rund um den Globus zugänglich."
+ },
+ {
+ "title": "Monitoring und Alerting",
+ "body": "Da die gesamte Infrastruktur bei einem grossen Cloud-Anbieter gehostet wird, ist es ein einfacher Ansatz, die von diesem bereitgestellten Überwachungs-, Alarmierungs- und Loggingtools zu nutzen. In diesem Fall haben wir uns für Amazon CloudWatch entschieden, das die Logs des BLOX-Backends sammelt und Alerts auslöst, wenn etwas schiefläuft. Durch die Verwendung dieser Tools können wir sicherstellen, dass die Überwachungs- und Alarmierungsinfrastruktur selbst immer verfügbar ist und einen umfassenden Funktionssatz bietet."
+ }
+ ]
+ },
+ "technologies": [
+ "Python / Flask",
+ "Svelte / SvelteKit",
+ "uPlot",
+ "Terraform",
+ "AWS Lambda",
+ "Amazon DynamoDB",
+ "Amazon S3",
+ "Amazon CloudFront",
+ "Amazon CloudWatch"
+ ],
+ "quote": {
+ "body": "Die Expertise von bespinian im Bereich Cloud-Native hat unsere Reise von Unterbrüchen zu Durchbrüchen bei Röntgenmodulen ermöglicht. Die sehr flexible Implementierung des BLOX-Healthmonitorings war der Schlüssel dazu, dass unsere Kunden von der reaktiven zur präventiven Maintenance übergehen konnten.",
+ "stakeholder": {
+ "name": "Pascal Corbat",
+ "role": "Product manager software"
+ }
+ }
+}
diff --git a/src/lib/customers/comet-group-en.json b/src/lib/customers/comet-group-en.json
new file mode 100644
index 00000000..cc2e7568
--- /dev/null
+++ b/src/lib/customers/comet-group-en.json
@@ -0,0 +1,46 @@
+{
+ "name": "Comet",
+ "title": "bespinian and Comet create the IoT health monitor BLOX",
+ "customer": "Comet Group is a Swiss company based in Flamatt employing more than 1700 people around the globe. They are a leading tech company driving innovation in the X-ray and radio frequency business. The division Comet X-ray develops and produces X-ray modules that enable non-destructive testing of materials and industry components. The inspected parts come from the aerospace, automotive, battery, semiconductors and other markets.",
+ "background": "The X-ray modules, Comet has deployed with their customers worldwide, require regular maintenance. Knowing what exactly is going on within these devices and how they are being used is crucial for efficiently working with them. With targeted data visualization and preventive alerts, one can recognize patterns, drifts, gaps and detect incorrect usage and prevent outages. That is why Comet wanted to innovate in this space and create such a tool called BLOX for them and their customers.",
+ "goal": "The goal of BLOX is to give Comet and their customers the big picture. Bringing in the transparancy and overview of displaying the metrics and data of each device in a way that is easy to understand and shows how the device has been used. Users can then investigate potential issues of the device by diving into different charts of a variety of metrics. They also receive warnings and alerts when the system detects unusual patterns and unexpected system states. bespinian and Comet are building BLOX in a tight collaboration and are very happy with how the tool already brings great value.",
+ "contribution": {
+ "intro": "bespinian played a key role in the following areas:",
+ "topics": [
+ {
+ "title": "Infrastructure Setup",
+ "body": "bespinian set up the infrastructure of BLOX by provisioning multiple separate environments into AWS using Terraform. Said infrastructure needed to be resilient, easy to maintain and cost-efficient. By choosing highly managed serverless technologies like AWS Lambda, Amazon DynamoDB or Amazon S3 for different parts of the application, much of the infrastructure setup and maintenance work could have been delegated to the cloud provider. Using infrastructure as code allows us to easily maintain multiple environments and make sure that we have parity among them."
+ },
+ {
+ "title": "Backend Development",
+ "body": "The backend of BLOX is the heart of the application and where all the business logic lies. It is written in Python because that's a well-known language to Comet, a first-class citizen on AWS Lambda, and provides us with the flexibility of performing small iterative changes. This is important because the business logic of how the logs and metrics from devices is interpreted is rather involved and complex at times. However, by using neatly structured and tested code, this complexity is well documented and automated in the BLOX backend code."
+ },
+ {
+ "title": "Frontend Development",
+ "body": "For the frontend rendered in users' web browsers, we decided to go for Svelte and Svelte Kit. Both are rather new but powerful technologies, which allow us to build a secure and performant browser application which is easy to use and easily accessible. For the hosting of this application, a combination of S3 and CloudFront was chosen. By doing so, BLOX is served in a very cost-efficient way and accessible to Comet and their customers around the globe."
+ },
+ {
+ "title": "Monitoring and Alerting",
+ "body": "Since the whole infrastructure is hosted on a large-scale cloud provider, it is a simple approach to use the monitoring, alerting, and logging tools they provide. In this case, we decided to go for Amazon CloudWatch, which collects the logs of the BLOX backend and triggers alerts if something goes wrong. By using these provided tools, we can make sure, the monitoring and alerting infrastructure itself is always available and provides a comprehensive feature set."
+ }
+ ]
+ },
+ "technologies": [
+ "Python / Flask",
+ "Svelte / SvelteKit",
+ "uPlot",
+ "Terraform",
+ "AWS Lambda",
+ "Amazon DynamoDB",
+ "Amazon S3",
+ "Amazon CloudFront",
+ "Amazon CloudWatch"
+ ],
+ "quote": {
+ "body": "bespinian’s expertise in cloud-native empowered our journey from breakdowns to breakthroughs in X-ray modules. The very agile implementation of the BLOX health monitoring was key to enable our customers to move from reactive to preventive maintenance.",
+ "stakeholder": {
+ "name": "Pascal Corbat",
+ "role": "Product manager software"
+ }
+ }
+}
diff --git a/src/lib/images/comet-group.webp b/src/lib/images/comet-group.webp
new file mode 100644
index 00000000..e533a1bc
Binary files /dev/null and b/src/lib/images/comet-group.webp differ
diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts
deleted file mode 100644
index 189f71e2..00000000
--- a/src/routes/+layout.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const prerender = true;
diff --git a/src/routes/Customers.svelte b/src/routes/Customers.svelte
index a4a7fa86..72f4c12c 100644
--- a/src/routes/Customers.svelte
+++ b/src/routes/Customers.svelte
@@ -5,6 +5,7 @@
import swisscom from '$lib/images/swisscom.webp';
import txGroup from '$lib/images/tx-group.webp';
import ciTechSensors from '$lib/images/citechsensors.webp';
+ import cometGroup from '$lib/images/comet-group.webp';
import swissSignGroup from '$lib/images/swisssigngroup.svg';
import emmi from '$lib/images/emmi.webp';
import legalI from '$lib/images/legal-i.webp';
@@ -25,6 +26,7 @@
{ name: 'Xovis', logo: xovis, link: '/customers/xovis' },
{ name: 'TX Group', logo: txGroup, link: 'https://tx.group' },
{ name: 'CI Tech Sensors', logo: ciTechSensors, link: '/customers/citech-sensors' },
+ { name: 'Comet Group', logo: cometGroup, link: '/customers/comet-group' },
{ name: 'SwissSign Group', logo: swissSignGroup, link: '/customers/swisssign-group' },
{ name: 'Emmi', logo: emmi, link: 'https://group.emmi.com' },
{ name: 'legal-i', logo: legalI, link: 'https://legal-i.ch' },
diff --git a/src/routes/customers/[slug]/+page.ts b/src/routes/customers/[slug]/+page.ts
index 6e52e216..c92f0468 100644
--- a/src/routes/customers/[slug]/+page.ts
+++ b/src/routes/customers/[slug]/+page.ts
@@ -8,6 +8,9 @@ import swisssignLogo from '$lib/images/swisssigngroup.svg';
import xovisEn from '$lib/customers/xovis-en.json';
import xovisDe from '$lib/customers/xovis-de.json';
import xovisLogo from '$lib/images/xovis.svg';
+import cometGroupEn from '$lib/customers/comet-group-en.json';
+import cometGroupDe from '$lib/customers/comet-group-de.json';
+import cometGroupLogo from '$lib/images/comet-group.webp';
import type { PageLoad } from './$types';
export const load: PageLoad = ({ params }) => {
@@ -36,6 +39,14 @@ export const load: PageLoad = ({ params }) => {
logo: xovisLogo
}
};
+ case 'comet-group':
+ return {
+ customer: {
+ en: cometGroupEn,
+ de: cometGroupDe,
+ logo: cometGroupLogo
+ }
+ };
}
throw error(404, 'Not found');
diff --git a/svelte.config.js b/svelte.config.js
index 0a445902..03ea688a 100644
--- a/svelte.config.js
+++ b/svelte.config.js
@@ -8,10 +8,9 @@ const config = {
preprocess: vitePreprocess(),
kit: {
- adapter: adapter(),
- prerender: {
- entries: ['*', '/customers/citech-sensors', '/customers/swisssign-group', '/customers/xovis']
- },
+ adapter: adapter({
+ fallback: 'index.html'
+ }),
csp: {
directives: {
'default-src': ['self'],