From 0959c17c95e7356a0f43ecff9ffb78643ce06e40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Engl=C3=B6f=20Ytterstr=C3=B6m?= Date: Fri, 18 Oct 2024 11:49:26 +0200 Subject: [PATCH] Extract CV build pipeline from madr/19 project --- .gitignore | 2 + assets/cv-anders-englof-ytterstrom.pdf | Bin 0 -> 47566 bytes assets/cv.css | 246 +++++ index.js | 34 + layouts/cv.hbs | 156 +++ package-lock.json | 1230 ++++++++++++++++++++++++ package.json | 17 + src/index.md | 237 +++++ 8 files changed, 1922 insertions(+) create mode 100644 .gitignore create mode 100644 assets/cv-anders-englof-ytterstrom.pdf create mode 100644 assets/cv.css create mode 100644 index.js create mode 100644 layouts/cv.hbs create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/index.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f378cbb --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +pub diff --git a/assets/cv-anders-englof-ytterstrom.pdf b/assets/cv-anders-englof-ytterstrom.pdf new file mode 100644 index 0000000000000000000000000000000000000000..72bb0a00cccba62e20920d8248aac0d34d176811 GIT binary patch literal 47566 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 dd { + margin-left: 0; +} +.contact > dt { + position: absolute; + left: -9999em; +} +.skillset { + display: grid; + gap: 0.5em 1em; + grid-template-columns: auto 1fr; +} +.skillset > dt { + font-weight: bold; +} +.skillset > dd { + margin-left: 0; +} +/* +Left for good measure, could have been gold if +the upcoming Container queries was a thing. + +@media (min-width: 80em) { + .skillset { + grid-template-columns: 1fr; + } + .skillset > dt { + transform: translateY(0.2em); + } +} +*/ +.resume { + max-width: 70em; + margin: 0 auto; + display: grid; + grid-template-columns: 1fr; + grid-template-areas: + "name" + "about" + "skills" + "work" + "education" + "projects" + "courses" + "personal"; + gap: 0; +} +@media (min-width: 40em) { + .resume { + grid-template-columns: 2fr 1fr; + grid-template-areas: + "name name" + "skills about" + "work work" + "education courses" + "projects personal"; + gap: 2em; + } +} +.name { + grid-area: name; + display: flex; + gap: 1em; + place-items: center; + text-align: center; + flex-direction: column; +} +.photo { + grid-area: photo; +} +.work { + grid-area: work; +} +.courses { + grid-area: courses; +} +.personal { + grid-area: personal; +} +.about { + grid-area: about; + background: #f1f1f1; + border-radius: 0.2em; + padding: 1em; + color: #111; + display: flex; + justify-content: space-between; + flex-direction: column; + align-items: center; +} +.education { + grid-area: education; +} +.projects { + grid-area: projects; +} +.skills { + grid-area: skills; +} + +.event { + display: grid; + gap: 0.5em 0.5em; + margin: 2em 0; + line-height: 1; +} + +.event--aside { + margin: 1em 0; +} + +.event__title { + margin: 0; +} +.event__position { + font-variant: small-caps; +} +.event__content { + line-height: 1.5; + padding-top: 0.5em; + grid-column: 1 / 3; +} +.event__aside { + text-align: right; + font-style: italic; +} + +@page { + padding: 0; + margin: 0; + size: A4 portrait; +} + +@media print { + body { + padding: 1cm; + } + + [href$="pdf"] { + display: none; + visibility: hidden; + } +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..24a7a91 --- /dev/null +++ b/index.js @@ -0,0 +1,34 @@ +var Metalsmith = require("metalsmith"); +var htmlMinifier = require("metalsmith-html-minifier"); +var layouts = require("metalsmith-layouts"); +var markdown = require("metalsmith-markdown-remarkable"); +var permalinks = require("@metalsmith/permalinks"); +var static = require("metalsmith-static"); + +Metalsmith(__dirname) + .source("./src") + .destination("./pub") + .use( + markdown({ + html: true, + typographer: false, + }), + ) + .use(permalinks()) + .use( + layouts({ + engine: "handlebars", + }), + ) + .use(htmlMinifier()) + .use( + static({ + src: "./assets", + dest: "./", + }), + ) + .build(function (err, _files) { + if (err) { + throw err; + } + }); diff --git a/layouts/cv.hbs b/layouts/cv.hbs new file mode 100644 index 0000000..fca6cb6 --- /dev/null +++ b/layouts/cv.hbs @@ -0,0 +1,156 @@ + + + + + {{title}} | {{name}} + + + + + + + + +
+
+
+
+

{{name}}

+
{{subtitle}}
+
+
+ +
+
+
+ {{{contents}}} +
+ + Download as PDF + +
+
+

Skills

+
+ {{#each skills}} +
{{@key}}
+
{{.}}
+ {{/each}} +
+
+
+

Experience

+
+ {{#each work}} +
+

{{employer}}, {{type}}

+
{{location}}
+
{{position}}
+
{{date}}
+
+
    + {{#each responsibilies}} +
  • {{.}}
  • + {{/each}} +
+
+
+ {{/each}} +
+
+
+

Education

+
+ {{#each education}} +
+

{{institution}}

+
{{location}}
+
{{graduation}}
+
{{date}}
+
+ {{fields}} +
+
+ {{/each}} +
+
+
+

Projects

+
+ {{#each projects}} +
+

{{name}}

+ +
{{context}}
+
{{date}}
+
+
    + {{#each responsibilies}} +
  • {{.}}
  • + {{/each}} +
+
+
+ {{/each}} +
+
+
+

Courses, Conferences & Certifications

+
    + {{#each courses}} +
  • {{.}}
  • + {{/each}} +
+ +
+
+

Personal Projects

+
+ {{#each personal}} +
+

{{@key}}

+ +
+

{{.}}

+
+
+ {{/each}} +
+
+
+ + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1b6958f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1230 @@ +{ + "name": "madr-se-19", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "madr-se-19", + "devDependencies": { + "@metalsmith/permalinks": "^2.2.0", + "handlebars": "^4.7.7", + "metalsmith": "^2.1.0", + "metalsmith-html-minifier": "^3.0.3", + "metalsmith-layouts": "^1.4.1", + "metalsmith-markdown-remarkable": "^1.0.2", + "metalsmith-static": "0.0.5" + } + }, + "node_modules/@metalsmith/permalinks": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@metalsmith/permalinks/-/permalinks-2.5.1.tgz", + "integrity": "sha512-kWQi2JyRZMsaAIp5AHXSPqDL8nQsjIGF5oa3drSSZGkBviETdDiOvucwH0QZX0qkyTQKb4zZ0a3V4/qG2z7RXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "moment": "^2.29.1", + "regexparam": "^2.0.1", + "slugify": "^1.6.5" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "metalsmith": "^2.5.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/autolinker": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", + "integrity": "sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "gulp-header": "^1.7.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "license": "ISC", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/consolidate": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha512-PZFskfj64QnpKVK9cPdY36pyWEhZNM+srRVqtwMiVTlnViSoZcvX35PpBhhUcyLTHXYvz7pZRmxvsqwzJqg9kA==", + "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.1.1" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.10.0.tgz", + "integrity": "sha512-jaIHyMh8Vr7kbIVjLAFhI9BAvKckNU9uRXBt45OEUx8CTG2GjzOh5vWxxIQ5e2UK1kI4Jsm9DmqOf3IceaEvWg==", + "dev": true, + "dependencies": { + "jsonfile": "^1.2.0", + "mkdirp": "^0.5.0", + "ncp": "^0.5.1", + "rimraf": "^2.2.8" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gulp-header": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", + "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", + "deprecated": "Removed event-stream from gulp-header", + "dev": true, + "license": "MIT", + "dependencies": { + "concat-with-sourcemaps": "*", + "lodash.template": "^4.4.0", + "through2": "^2.0.0" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier/node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-minifier/node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/html-minifier/node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonfile": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.2.0.tgz", + "integrity": "sha512-9Re1pI74qhRL7j94lp/Y69OqCR+XkEMvjunFo70Dcr6kT5vmRcfyfdyZrxmm7j6yLySBRVooiUy32FvI4lcNTg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.clonedeepwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", + "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/metalsmith": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/metalsmith/-/metalsmith-2.6.3.tgz", + "integrity": "sha512-nql0eDbeDdYY3cz0uDVmwQ/E9XDBAHBf5p3lz+IwZAlUvz72DAd5+F+vl7Fot7I+yQDVK59uB0CL9S+Ts7ELsw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "commander": "^10.0.1", + "debug": "^4.3.4", + "gray-matter": "^4.0.3", + "is-utf8": "~0.2.0", + "lodash.clonedeepwith": "^4.5.0", + "micromatch": "^4.0.5", + "stat-mode": "^1.0.0", + "ware": "^1.3.0" + }, + "bin": { + "metalsmith": "bin/metalsmith" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/metalsmith-html-minifier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/metalsmith-html-minifier/-/metalsmith-html-minifier-3.0.3.tgz", + "integrity": "sha512-ML2B2TotnTAgfgGbJqhu7DaC6EvzeiOkeRwHEUcrU4a3vBT/SiinXLitTU3xs2L7FjjNqj9OeGJsglTSfXJZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "html-minifier": "^3.0.0", + "lodash.defaultsdeep": "^4.1.0", + "multimatch": "^2.1.0" + } + }, + "node_modules/metalsmith-layouts": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/metalsmith-layouts/-/metalsmith-layouts-1.8.1.tgz", + "integrity": "sha512-zy4LM1q1zwOmlq/i8WISKF6InqhxjDkJv24XeLy6lqRr39Sy3R8tKLUppzC+VBKaixds/XnDOvuEeYDgzZDpNQ==", + "deprecated": "This package is no longer maintained and has moved to the @metalsmith org; Please migrate to the following package: @metalsmith/layouts", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^1.3.0", + "consolidate": "^0.14.0", + "debug": "^2.2.0", + "extend": "^3.0.0", + "fs-readdir-recursive": "^1.0.0", + "is-utf8": "^0.2.0", + "lodash.omit": "^4.0.2", + "multimatch": "^2.0.0" + } + }, + "node_modules/metalsmith-layouts/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "license": "MIT" + }, + "node_modules/metalsmith-layouts/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metalsmith-layouts/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/metalsmith-markdown-remarkable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/metalsmith-markdown-remarkable/-/metalsmith-markdown-remarkable-1.0.2.tgz", + "integrity": "sha512-xFdm3NE/exQoA/Kx1h4Qb59+eVwLeCpGlatLelz1zSQoEsoXnrztIsEvB0udLrAVzsiJWAO3K7v8J1evjbT6Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "remarkable": "^1.7.4" + } + }, + "node_modules/metalsmith-static": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/metalsmith-static/-/metalsmith-static-0.0.5.tgz", + "integrity": "sha512-WuGTzUpqCdt5avWIq09Nc6Q8jhlJ6896iBj9x0IauHvWPYFK4xlski84yHhZcJPAXTeMWN68219bAOxWhvaHHA==", + "dev": true, + "dependencies": { + "debug": "~0.7.4", + "fs-extra": "~0.10.0", + "ncp": "~0.5.0" + } + }, + "node_modules/metalsmith-static/node_modules/debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha512-0mzK8ymiWdehTBiJh0vClAzGyQbdtyWqzSVx//EK4N/D+599RFlGfTAsKw2zMSABtDG9C6Ul2+t8f2Lbdjf5mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ncp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.5.1.tgz", + "integrity": "sha512-l+pJxuLlzwp11Dy72MJgCPNwIbXdv6imaACLiEMb2TIDyr54qz+nAZeD5qDlJefveaJ+R9Ug6KuozCxRpQXO0Q==", + "dev": true, + "license": "MIT", + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexparam": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.2.tgz", + "integrity": "sha512-A1PeDEYMrkLrfyOwv2jwihXbo9qxdGD3atBYQA9JJgreAx8/7rC6IUkWOw2NQlOxLp2wL0ifQbh1HuidDfYA6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remarkable": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", + "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.10", + "autolinker": "~0.28.0" + }, + "bin": { + "remarkable": "bin/remarkable.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true, + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ware": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", + "integrity": "sha512-Y2HUDMktriUm+SR2gZWxlrszcgtXExlhQYZ8QJNYbl22jum00KIUcHJ/h/sdAXhWTJcbSkiMYN9Z2tWbWYSrrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "wrap-fn": "^0.1.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-fn": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", + "integrity": "sha512-xDLdGx0M8JQw9QDAC9s5NUxtg9MI09F6Vbxa2LYoSoCvzJnx2n81YMIfykmXEGsUvuLaxnblJTzhSOjUOX37ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "co": "3.1.0" + } + }, + "node_modules/wrap-fn/node_modules/co": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", + "integrity": "sha512-CQsjCRiNObI8AtTsNIBDRMQ4oMR83CzEswHYahClvul7gKk+lDQiOKv+5qh7LQWf5sh6jkZNispz/QlsZxyNgA==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..02401b0 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "madr-se-19", + "private": true, + "scripts": { + "build": "node index.js", + "start": "node dev.js" + }, + "devDependencies": { + "@metalsmith/permalinks": "^2.2.0", + "handlebars": "^4.7.7", + "metalsmith": "^2.1.0", + "metalsmith-html-minifier": "^3.0.3", + "metalsmith-layouts": "^1.4.1", + "metalsmith-markdown-remarkable": "^1.0.2", + "metalsmith-static": "0.0.5" + } +} diff --git a/src/index.md b/src/index.md new file mode 100644 index 0000000..b266cbc --- /dev/null +++ b/src/index.md @@ -0,0 +1,237 @@ +--- +skip: true +title: cv +layout: cv.hbs +name: Anders Englöf Ytterström +ogdesc: Anders Englöf Ytterström - Frontend Engineer, Full Stack Developer, Web standardista +titles: Frontend Engineer, Full Stack Developer, Web standardista +address: BalladvĂ€gen 3, 784 43 BorlĂ€nge, Sweden +email: yttan@fastmail.se +github: madr +website: madr.se +work: + - employer: PlaymakerAI + type: Data analytics SaaS + date: ⁠Nov 2023–now + location: Remote position + position: Full Stack Engineer + responsibilies: + - Part of a team consisting of Data scientists and Machine learning experts. + - DevOps, Backend programming, Frontend engineering. + - Python, NumPy, Pandas, Scikit-learn, React, MaterialUI + + - employer: Stratsys + type: Process management platform (SaaS) + date: ⁠Mar 2022–Oct 2023 + location: Remote position + position: Senior Frontend Architect + responsibilies: + - Part of a team consisting of Frontend architects and UX designers. + - Responsible for the design system, frontend DX and Microfrontend toolchain and architecture. + - Writing Web components with full ARIA compability, according to the spec. + - QA and manual testing with screen readers (NVDA, VoiceOver). + + - employer: Iteam + type: Technical Innovation agency + date: ⁠Sep 2021–Mar 2022 + location: Remote position + position: Full Stack Developer + responsibilies: + - All source code are released by a FOSS license. + - Backend programming in Node.js, TypeScript, Express and Next.js. + - Frontend development in React, Jotai, Formik, Styleguidist and Figma. + - Code labs and skill sharing. + + - employer: Kundo + type: Customer service company (SaaS) + date: Mar 2017–Sep 2021 + location: Stockholm, Sweden + position: Full Stack Developer + responsibilies: + - T-shaped frontend developer focusing on WCAG 2.0 AA, design and mentoring. + - "Roles besides development: Team Lead, Tech Lead and Security administrator (briefly)." + - Backend programming in Django and Phoenix, with RabbitMQ as broker/RPC and Celery as job queue. + + - employer: Adeprimo + type: Digital Fullservice agency + date: Oct 2007–Feb 2017 + location: Östersund, Sweden + position: Systems developer + responsibilies: + - "T-shaped Systems developer focusing on frontend and backend web development. Fields: Media, Destination, Tourism." + - High demand on customer experience and context switching. + - Distributed, remote-first teams with members located in Vaasa (Finland), Örebro (Sweden) and Östersund (Sweden). + - Consulting for startups based in Östersund and Åre, Sweden. + - Polopoly, Python, PHP, Sass, jQuery, Wordpress, SilverStripe, .NET. + + - employer: Pierce + type: Ecommerce (Motocross, MC and Snowmobile accessories) + date: Mar–Jul 2015 + location: Åre, Sweden + position: Web developer + responsibilies: + - Development and maintainence for 24mx.se, XLMoto.se och sledstore.se. + - .NET, C#, Azure. + + - employer: VĂ€stsvensk tidningsdistribution (VTD) + type: Distribution + date: Jul–Aug 2007 + location: AlingsĂ„s, Sweden + position: Newspaper carrier + responsibilies: + - Temporary summer position. Delivering Göteborgs-Posten to 300 households by foot. It rained every night. + + - employer: Moment Marketing + type: Startup + date: Sep 2006–Apr 2007 + location: Stockholm, Sweden + position: Web designer + responsibilies: + - Frontend development assistance. Employment by the hour. +education: + - institution: Media and Communication Science, Mid Sweden University + date: 2004–2007 + location: Sundsvall, Sweden + graduation: Degree of Bachelor of Arts (incomplete) + fields: Web design, Computer science, Computer engineering, Programming (Java, C) + + - institution: Staffanskolan secondary school + date: 2001–2004 + location: Söderhamn, Sweden + graduation: Student degree + fields: Media programme, vocational, media production, graphical communication + +skills: + Programming languages: HTML, CSS (Sass), Python, JavaScript (TypeScript), Elixir, Rust, PHP + Development process: CI/CD, Automated testing, Mentoring, Mob programming, Pair programming + Web Backend Frameworks: Django, Flask, Phoenix (LiveView), Express + Web Frontend: React, Redux, Vue, Svelte, Lit, OOCSS, BEM, Living styleguides + Build systems: Webpack, Parcel, esbuild + Content management: Wordpress, Joomla + Testing: pytest, Jest, Lighthouse, Axe, VoiceOver, Voice Assistant, NVDA, Cypress, WebDriverIO, Web Test Runner + Deployment: AWS, Docker (Podman), Kubernetes, Ansible, Terraform, Azure DevOps + "Services & Infrastructure": Nameko, RabbitMQ, Celery, Kibana, Prometheus + Databases: MySQL, Postgres, Elasticsearch, GraphQL, Influx, Timescale + Version control: Git, Subversion + Operating systems: Linux, Mac OS, Windows + Other skills: Inclusive communication, Accessibility compliance, Technical writing + Languages: Swedish (native), English (fluent) + +projects: + - name: OneUX Component library + context: Senior Frontend Architect, Stratsys + date: "2022-2023" + responsibilies: + - Implement a reusable set of components as Web components (Custom element with Shadow DOM). + - Data-driven state over DOM State. + - Deployed by the MicroFrontend concept and practices. + - Fully accessible, with keyboard navigation and mouse gestures, according to the ARIA Authoring Practices guide. + - E2E/Integration tests in a set of real, headless browsers. + - Packaged as part of a NPM package and a Design system for internal frontend developers. + - Atomic Design, Microfrontends, Storybook, Custom Elements, Design Systems, Style Guides, Web Components, Lit, Vue.js, ARIA Authoring Practices guides (APG). + + - name: Slussen FastAPI data adapter, Sveriges AlmĂ€nnytta + context: Full Stack Developer, Iteam + date: "Okt–Dec 2021" + responsibilies: + - "Turn AllmĂ€nnyttan FastAPI from blob XML to compact JSON." + - The adapter was used to create a POC to joyfully report a fault of an rental object. + - Design sprint together with the stake holders. + - All code was open sourced. + - TypeScript, FastAPI, Express, React, MIT. + + - name: SEO-friendly embed of knowledgebase + context: Full Stack Developer, Kundo + date: "Mar 2020–Mar 2021" + responsibilies: + - Embedded a knowledgebase on any site using a simple embed snippet, whereas the knowledgebase is embedded using fetch(). + - Navigation between guides and text search included, all crawlable by googlebot. + - SPA-compliance. + - TypeScript, Jest, Google Search Console. + + - name: Accessibility Statement + context: Full Stack Developer, Kundo + date: "Sep–Dec 2019" + responsibilies: + - Compliance of the EU Directive on the Accessibility of Public Sector Websites. + - Axe, W3C validators, Lighthouse, manual accessibility testing. + + - name: Kubernetes migration + context: Full Stack Developer, Kundo + date: "Jan 2019–Dec 2020" + responsibilies: + - Migrating an AWS production environment (several service-modules in different programming languages, message queues and micro services) to Kubernetes, along with all in-house DevOps tooling. + - "Goals: keep one command deploys to production, keep Kibana logging, supervision of all services." + - Terraform, Ansible, Docker, Helm, Prometheus, Kubectl, Minikube. + + - name: Facebook Opengraph client + context: Full Stack Developer, Kundo + date: "Sep 2017–Mar 2019" + responsibilies: + - "Integrating customer support questions posted on Facebook Pages and Messenger into the Dashboard." + - "Needed to be done asyncronously to not tamper with API credibility." + - "Python, Django, MyPy, Protobuf, RabbitMQ, Phoenix Presence+Channels, React + Redux" + + - name: Security & GDPR accountable + context: Full Stack Developer, Kundo + date: "Sep 2017–Feb 2019" + responsibilies: + - Accountable for several projects to fulfil the GDPR directive up to May 25th, 2018 and onwards. + - Accountable for security processes and planning for the technical platform. + + - name: Engcon pricelist + context: Interface Developer, Consultant + date: Nov 2016–Feb 2017 + responsibilies: + - Prototyp-driven development of a digital version of a printed pricelist, focusing on effiency and MVP. + - Vue, Django, Twitter Bootstrap + + - name: Wide Ideas + context: Full stack Developer, Consultant + date: "Aug 2011–Feb 2017" + responsibilies: + - Development of an idea management platform. + - Handled DevOps, automation of workflows, development of web interface, and backend programming. + - PHP, Pligg, Python, Flask, MongoDB, Elastic Search + + - name: Östersundstidningar redesign + context: Interface Developer + date: "Mar–May 2011" + responsibilies: + - Complete redesign of 3 sites with the same locked (and oldfashioned) HTML. + - An Object-oriented CSS architecture (OOCSS) was used to create a design system and KSS-powered styleguide utilizing Sass mixins. + + - name: Mktwebb + context: Interface Developer + date: "Oct 2007–Aug 2009" + responsibilies: + - Shared technical solution for a publication platform for 40 newspapers across Sweden, with Polopoly as CMS. + - Technological ownership and mentoring others to write JavaScript. + - All HTML and CSS written in collaboration with backend programmers, UX researchers and designers. + +personal: + Advent of code: Every December since 2016, I challenge myself (and sometimes other collegues) to solve AOC puzzles in a programming language of my choice. + Tajm.me: As a consultant, time tracking is a crucial part of every day work, and using bad time tracking software sucks. For 5 years, I scratched my own itch. Django, DRF and Web standards at its core. Several experimental client side solutions built with D3, React, Vue, Android, iOS and GTK+. (Archived, 2012–2017) + "Baslyft, bĂ€rs & burgare": "My first Progressive Web App, with support to work fully offline once installed on a device. It's a simple app for logging reps, sets and PB's in the gym, with some nice tools built-in: 1RM calculator and KG-LBS converter. Touch-oriented design patterns, React, Redux, localStorage, ServiceWorker and other nifty Web API:s. (On hold, Sep 2019–)" + BrĂŒtal Legend: A site to track progress of owning vinyl copies os songs licensed in an epic video game. Occasionally used as a real-world example to teach TypeScript, React and Redux concepts to collegues. (On hold) + Utsökt: A simple bookmarking and read list service, with integration to RSS feeds, Pocket and Slack. Inspired by the old, more minimal version of Instapaper. Elixir, Phoenix LiveViews. (In progress) + Smed: "A pluggable static site generator, inspired by Metalsmith. The goal is to replace my own sites in Metalsmith, and to learn Rust. (In progress)" +courses: + - ElixirConf EU, Warshawa (2020, postponed due to the Coronavirus pandemic) + - Att leda utan att vara chef, Företagsakademin (2019) + - Modern React with Redux, Udemy (2017) + - Ethical Programming from Scratch, Udemy (2018) + - Android Developer Nanodegree, Udacity (2017) + - PyConf, Stockholm (2017) + - Nordic.JS, Stockholm (2014) + - TiConf, Amsterdam (2014) + - FFConf, Brighton (2012) + - DevSum, Stockholm (2012) + - Certificed Scrum Master Course, Crisp AB (2010) +--- + +**Anders Englöf Ytterström**, Web Developer with 16 years of passion. I strive to constantly come up with new ways of improving both products and processes for all participants in projects I am part of. + +I prefer my coffee black, just like my metal, and preferably drip brewed by hand. + +I also aim to be a [roadie, not a rockstar](https://www.linkedin.com/pulse/20140816105034-167544180-you-don-t-want-a-rock-star), as well as defending [boring tech](https://mcfunley.com/choose-boring-technology).