1<!DOCTYPE html> 2<html> 3<head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>bassistance.de » CV / Resume</title> 6 <meta name="generator" content="WordPress 7.1.2"> 7 <meta name="keywords" content=""> 8 <meta name="description" content="Jörn Zaefferer's personal blog about music, software and anything else."> 9 10 <meta name="viewport" content="width=device-width, minimum-scale=1, maximum-scale=1"> 11 12 <link href='https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,700,400' rel='stylesheet' type='text/css'> 13 <link rel="stylesheet" href="https://bassistance.de/wp-content/themes/tonus/style.css"> 14 15 <link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="https://bassistance.de/feed/"> 16 <link rel="pingback" href="https://bassistance.de/xmlrpc.php"> 17 18 <meta name='robots' content='max-image-preview:large' /> 19<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://bassistance.de/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fbassistance.de%2Fabout%2Fresume%2F" /> 20<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://bassistance.de/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fbassistance.de%2Fabout%2Fresume%2F&format=xml" /> 21<style id="wp-img-auto-sizes-contain-inline-css"> 22img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 23/*# sourceURL=wp-img-auto-sizes-contain-inline-css */ 24</style> 25<style id="wp-emoji-styles-inline-css"> 26 27 img.wp-smiley, img.emoji { 28 display: inline !important; 29 border: none !important; 30 box-shadow: none !important; 31 height: 1em !important; 32 width: 1em !important; 33 margin: 0 0.07em !important; 34 vertical-align: -0.1em !important; 35 background: none !important; 36 padding: 0 !important; 37 } 38/*# sourceURL=wp-emoji-styles-inline-css */ 39</style> 40<style id="wp-block-library-inline-css"> 41:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;
41--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}} 42 43/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */ 44</style> 45<style id="wp-block-heading-inline-css"> 46h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background,h4:where(.wp-block-heading).has-background,h5:where(.wp-block-heading).has-background,h6:where(.wp-block-heading).has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg} 47/*# sourceURL=https://bassistance.de/wp-includes/blocks/heading/style.min.css */ 48</style> 49<style id="wp-block-list-inline-css"> 50ol,ul{box-sizing:border-box}:root :where(.wp-block-list.has-background){padding:1.25em 2.375em} 51/*# sourceURL=https://bassistance.de/wp-includes/blocks/list/style.min.css */ 52</style> 53<style id="wp-block-paragraph-inline-css"> 54.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg} 55/*# sourceURL=https://bassistance.de/wp-includes/blocks/paragraph/style.min.css */ 56</style> 57<style id="wp-block-separator-inline-css"> 58@charset "UTF-8";.wp-block-separator{border:none;border-top:2px solid}:root :where(.wp-block-separator.is-style-dots){height:auto;line-height:1;text-align:center}:root :where(.wp-block-separator.is-style-dots):before{color:currentColor;content:"···";font-family:serif;font-size:1.5em;letter-spacing:2em;padding-left:2em}.wp-block-separator.is-style-dots{background:none!important;border:none!important}
59/*# sourceURL=https://bassistance.de/wp-includes/blocks/separator/style.min.css */ 60</style> 61 62<style id="classic-theme-styles-inline-css"> 63/*! This file is auto-generated */ 64.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} 65/*# sourceURL=/wp-includes/css/classic-themes.min.css */ 66</style> 67 68<style id="global-styles-inline-css"> 69:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
69--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
69.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 70/*# sourceURL=global-styles-inline-css */ 71</style> 72 73<link rel="https://api.w.org/" href="https://bassistance.de/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://bassistance.de/wp-json/wp/v2/pages/1899" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://bassistance.de/xmlrpc.php?rsd" /> 74<meta name="generator" content="WordPress 7.1.2" /> 75<link rel="canonical" href="https://bassistance.de/about/resume/" /> 76<link rel='shortlink' href='https://bassistance.de/?p=1899' /> 77<style id="wp-custom-css"> 78figure.wp-block-image { 79 display: inline-block; 80} 81 82figure.wp-block-image a { 83 display: inline-block; 84} 85 86figure.wp-block-image a img { 87 border: none; 88 margin: 0; 89} 90 91figure.wp-block-image figcaption { 92 font-size: 14px; 93 text-align: center; 94} 95</style> 96</head> 97<body id="home" class="log"> 98 <div id="container"> 99 <div id="header"> 100 <h1><a href="/" title="Home">bassistance.de</a></h1> 101 <div id="subtitle"> 102 <!-- Here's the tagline --> 103 Jörn Zaefferer on Bass, Geeks and Rock'n'Roll </div> 104 </div> 105 106 <div id="navmenu"> 107 <a href="/">Blog</a> 108 </div> 109 110<div id="maincol"><!-- The main content column begins --> 111<div class="col"> 112 113 <div class="entry"> 114 <div class="entrybody" id="post-1899"> 115 <h1>CV / Resume</h1> 116 117<h2 class="wp-block-heading">Jörn Zaefferer<br>Sofware Engineer</h2> 118 119 120 121<p class="wp-block-paragraph">With over 17 years of building frontend applications, I’m an expert for leading development teams that create and operate content on the web and mobile.</p> 122 123 124 125<p class="wp-block-paragraph">I am based in Köln (Cologne), Germany; I work from home.<br>Contact me <a href="/cdn-cgi/l/email-protection#a5cfcac0d7cb8bdfc4c0c3c3c0d7c0d7e5c2c8c4ccc98bc6cac8">via E-Mail.</a></p> 126 127 128 129<p class="wp-block-paragraph">Below you find lists of skills, work and other experience. I’ve also written down some <a href="#expectations">expectations</a>.</p> 130 131 132 133<h3 class="wp-block-heading">Skills</h3> 134 135 136 137<ul class="wp-block-list"> 138<li>building web and mobile applications with JavaScript (web, React-Native)</li> 139 140 141 142<li>optimizing applications for performance, accessibility, usability and internalization</li> 143 144 145 146<li>operating and observing services (nodejs, Docker, Sentry)</li> 147 148 149 150<li>designing and optimizing team processes for fast iterations, flow and continuous delivery (Kanban; Team Topologies)</li> 151 152 153 154<li>publishing and managing open-source projects on GitHub</li> 155 156 157 158<li>strong technical writing (documentation, ADRs)</li> 159 160 161 162<li>recruiting engineers for agile product teams</li> 163 164 165 166<li>Fluent in English and German, some Bulgarian</li> 167</ul> 168 169 170 171<h3 class="wp-block-heading">Professional Experience</h3> 172 173 174 175<p class="wp-block-paragraph"><strong>tonies GmbH, Düsseldorf</strong><br>Staff Engineer<br><small>April 2023 – today </small><br>These days I’m working on the mytonies-app (<a href="https://apps.apple.com/de/app/mytonies/id1504496868">iOS</a>, <a href="https://play.google.com/store/apps/details?id=com.tonies.app&hl=de">Android</a>), built with React Native. We’re doing continuous delivery with weekly releases and heavy use of feature flags (via ConfigCat). We use Bitrise for running our Jest and Detox tests and deploying builds to the App and Play stores.</p> 176 177 178 179<p class="wp-block-paragraph">Engineering Manager<br><small>January 2021 – March 2023</small><br>Technical leadership and manager for a group of engineers, first for the team working on mytonies-web (see below), later the mytonies app (see above). A big part of this was recruiting, where I also helped document and refine our process.</p> 180 181 182 183<p class="wp-block-paragraph">
183Senior Software Developer, Frontend Tech Lead<br><small>April 2020 – December 2020 </small><br>At first I worked on <a href="https://my.tonies.com/">mytonies-web</a>, where tonies customers can set up and customize their Toniebox, upload content to their Creative Tonies and shop for more digital content, a feature I helped launch in the summer of 2020, along with the market launch in the US. Part of this was also replacing LaunchDarkly, who’s business model and architecture no longer matched our needs, with ConfigCat, which has proofed to be an excellent choice for a feature flag service in the following years.</p> 184 185 186 187<p class="wp-block-paragraph"><strong>sloppy.io GmbH, Köln</strong><br>Head of Development<br><small>May 2015 – March 2020</small><br>What started as a frontend engineering position turned into the Head of Development, where I was responsible for all software development efforts. This included the React-based single-page web application for composing, deploying, maintaining and monitoring Docker containers. My role was expanded to the backend that integrates all container hosting, user management and subscription services. On top came various additional services, for example for automatically creating and renewing customer SSL certificates using Let’s Encrypt. This was rounded off with customer and operations support.</p> 188 189 190 191<p class="wp-block-paragraph"><strong>Freelance consulting developer</strong><br>Consulting for over 20 clients, including SoundCloud, Software Freedom Conservancy, jQuery Foundation, adesso, Wimdu, eBay, AOK, CloudControl, AutoScout24, Denkwerk, Pixelpark, Sevenval<br><small>Dec 2010 – Apr 2015</small><br>The end of my time as a Java developer and the start of my freelance career. The first year kicked off with projects for SoundCloud (building their then-new mobile site) and the Software Freedom Conservancy (working on a grid component for jQuery UI). A common theme for these and future projects were single-page applications (SPA), back when very few libraries and frameworks existed to build entire applications in the browser. Backbone and requirejs were early tools of choice.</p> 192 193 194 195<p class="wp-block-paragraph">Between 2011 and 2015 I spent half my time contracting with the jQuery Foundation, working on open source projects such as jQuery UI, QUnit and Globalize (more details under ‘Open-Source JavaScript libraries’ below). I twice participated in Google’s Summer of Code, mentoring students working on projects related to QUnit.</p> 196 197 198 199<p class="wp-block-paragraph"><strong>maxence integration technologies GmbH, Köln</strong><br>Senior Consultant<br><small>Feb 2007 – Nov 2010</small><br>Developing web and desktop applications in Java for clients in banking and insurance. My first Dev Lead position for an attempt at a “replace Excel” in-house product.</p> 200 201 202 203<p class="wp-block-paragraph"><strong>TimeToAct GmbH, Köln</strong><br>Consultant<br><small>Apr 2006 – Jan 2007</small><br>After finishing my study at the bib International College in Bergisch Gladbach, this was the start of my professional career, mostly developing web applications in Java. JavaScript mattered very little in these projects, yet in that time I started using and contributing to jQuery in my free time, and expanded that until 2011 (see above).</p> 204 205 206 207<h3 class="wp-block-heading">Volunteering and extraprofessional experience</h3> 208 209 210 211<p class="wp-block-paragraph"><strong>Väter in Köln</strong> – Vätercafe<br><small>January 2023 – today</small></p> 212 213 214 215<p class="wp-block-paragraph">I’m volunteering for the organization of brunches for dads and their kids, usually groups of 4 to 8 dads with one or two kids each. Saturday morning is more accessible for working dads than those comparable meetups during the week.</p> 216 217 218 219<p class="wp-block-paragraph"><strong>ADFC Köln</strong><br>Radverkehrsgruppe<br><small>Apr 2019 – today</small><br>Making the city more bicycle friendly. The most important format is the “Runder Tisch Radverkehr”, where I’m consulting with others from ADFC, directly to both the local district politicians (Bezirksvertretung Kalk) and the municipality (Verwaltung, Büro de
219s Radverkehrsbeauftragten).</p> 220 221 222 223<p class="wp-block-paragraph"><strong>JavaScript User Group Köln</strong><br>Co-organizer<br><small>2011 – 2014</small><br>My personal highlight was the meetup in <a href="https://github.com/cologne-js/cologne-js/blob/a42ec881baad30ffe44b5bdbf95c34da09eb68e8/events/2012-12-11.yml">December 2012</a>, when Felix Geisendörfer did a live demo of nodecopters, including a big quad drone. Probably the biggest audience we ever had.</p> 224 225 226 227<p class="wp-block-paragraph"><strong>Open-Source JavaScript libraries</strong><br>Developer, project manager, team lead<br><small>2006 – 2016</small><br>I was one of the first <a href="https://github.com/jquery/jquery/graphs/contributors">contributors to jQuery</a> and started developing various jQuery Plugins early on. Some were later turned into components of <a href="https://jqueryui.com/">jQuery UI</a>, where I was Dev Lead for several years. The <a href="https://jqueryvalidation.org/">jQuery Validation plugin</a> is still popular these days, running on one 1m+ websites. I created <a href="https://qunitjs.com/">QUnit</a>, a JavaScript testing library, and shaped Globalize, a library for dealing with internalization, which in turn paved the way for distributing <a href="https://github.com/unicode-cldr/cldr-json">CLDR to JavaScript developers</a>.</p> 228 229 230 231<p class="wp-block-paragraph"><strong>jQuery Foundation</strong> (now the <a href="https://openjsf.org/">OpenJS Foundation</a>)<br>Board of Directors<br><small>2009 – 2015</small><br>What started as a tiny open-source JavaScript library became one of the most popular libraries on the web. In 2009 the jQuery Foundation was formed, originally as a project of the Software Freedom Conservancy (SFC). When the board of directors was formed, I got to be on the original board and served there until 2015, including the transition to a standalone Foundation, independent of the SFC.</p> 232 233 234 235<hr class="wp-block-separator has-css-opacity"/> 236 237 238 239<h2 class="wp-block-heading" id="expectations">Expectations</h2> 240 241 242 243<p class="wp-block-paragraph">Beyond software development, I like to be involved with technical architecture, recruitment, company culture, mentoring and coaching. I love pair programming, to share knowledge (in both directions), skip separate code review steps and collect data on developer tooling that needs improvements. I am looking for a role as a senior/staff engineer or engineering manager.</p> 244 245 246 247<h4 class="wp-block-heading">Culture</h4> 248 249 250 251<p class="wp-block-paragraph">An open and diverse environment is critical to me. In my experience, autonomous people and cross functional-teams working through consensus and helping each other, bring the best results.</p> 252 253 254 255<h4 class="wp-block-heading">Work-life balance</h4> 256 257 258 259<p class="wp-block-paragraph">I am okay with putting in a few extra hours on rare occasions, or getting paged at night when a critical system is failing. But regular over-time is not something I do, and must be addressed if recurring. I value flexible working hours and want to primarily work from home.</p> 260 261 262 263<h4 class="wp-block-heading">Shared Vision</h4> 264 265 266 267<p class="wp-block-paragraph">I work and contribute more effectively when the company shares as much of their long-term intentions as possible. It prevents misunderstandings, leads to better technical decisions, and encourages a trusting work environment.</p> 268 </div> 269 </div> 270 271  <div id="commentblock"> 272 <div class="comment-track"> 273 </div> 274 </div> 275 <br /><br /><br /><br /> 276 277 278 279 280</div> 281</div><!-- The main content column ends --> 282<!-- begin sidebar --> 283<div id="navcol"> 284 285 <div id="searchdiv"> 286 <form id="searchform" method="get" action=""><div> 287 <label for="s">Search: </label><input title="Enter search term and hit enter to start searching" type="text" name="s" id="s" value="search" size="15" /></div> 288 </form> 289 </div> 290 291 <ul id="sidebar"> 292 <li id="pages-2" class="widget widget_pages"><h2 class="widgettitle">Projects</h2> 293 294 <ul> 295 <li class="page_item page-item-1899 current_page_item"><a href="https://bassistance.de/about/resume/" aria-current="page">CV / Resume</a></li> 296<li class="page_item page-item-1209"><a href="https://bassistance.de/about/talk-checklist/">Talk Checklist</a></li> 297<li class="page_item page-item-111"><a href="https://bassistance.de/jquery-plugins/jquery-plugin-accordion/">jQuery plugin: Accordion</a></li> 298<li class="page_item page-item-170"><a href="https://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/">jQuery plugin: Autocomplete</a></li> 299<li class="page_item page-item-520"><a href="https://bassistance.de/jquery-plugins/jquery-plugin-message/">jQuery plugin: Message</a></li> 300<li class="page_item page-item-482"><a href="https://bassistance.de/jquery-plugins/jquery-plugin-password-validation/">jQuery plugin: Password Validation</a></li> 301<li class="page_item page-item-494"><a href="https://bassistance.de/jquery-plugins/jquery-plugin-prettydate/">jQuery plugin: Prettydate</a></li> 302<li class="page_item page-item-108"><a href="https://bassistance.de/jquery-plugins/jquery-plugin-tooltip/">jQuery plugin: Tooltip</a></li> 303<li class="page_item page-item-142"><a href="https://bassistance.de/jquery-plugins/jquery-plugin-treeview/">jQuery plugin: Treeview</a></li> 304<li class="page_item page-item-146"><a href="https://bassistance.de/jquery-plugins/jquery-plugin-validation/">jQuery plugin: Validation</a></li> 305<li class="page_item page-item-296"><a href="https://bassistance.de/wordpress-plugins/wordpress-plugin-comment-validation/">WordPress Plugin: Comment Validation</a></li> 306<li class="page_item page-item-307"><a href="https://bassistance.de/wordpress-plugins/wordpress-plugin-youtube/">WordPress Plugin: Youtube</a></li> 307 </ul> 308 309 </li> 310 311 <li id="recent-posts-2" class="widget widget_recent_entries"> 312 <h2 class="widgettitle">What I wrote</h2> 313 314 <ul> 315 <li> 316 <a href="https://bassistance.de/2026/02/15/nice-maps/">Favorite Maps</a> 317 </li> 318 <li> 319 <a href="https://bassistance.de/2026/02/01/bogenschiesen-zu-hause-trainieren/">BogenschieÃen zu Hause trainieren</a> 320 </li> 321 <li> 322 <a href="https://bassistance.de/2026/02/01/training-archery-at-home/">
322Training archery at home</a> 323 </li> 324 <li> 325 <a href="https://bassistance.de/2026/01/11/how-enjoy-digital-music-in-2026/">How I enjoy digital music in 2026</a> 326 </li> 327 <li> 328 <a href="https://bassistance.de/2025/09/13/verkehrsbeunruhigung-in-koln-kalk/">Verkehrsbeunruhigung in Köln-Kalk</a> 329 </li> 330 </ul> 331 332 </li> 333<li id="categories-105004941" class="widget widget_categories"><h2 class="widgettitle">Categories</h2> 334<form action="https://bassistance.de" method="get"><label class="screen-reader-text" for="cat">Categories</label><select name='cat' id='cat' class='postform'> 335 <option value='-1'>Select Category</option> 336 <option class="level-0" value="49">Archery (4)</option> 337 <option class="level-0" value="1">Common (155)</option> 338 <option class="level-0" value="25">Design (4)</option> 339 <option class="level-0" value="40">Freelancing (1)</option> 340 <option class="level-0" value="28">Game Programming (1)</option> 341 <option class="level-0" value="33">Games (2)</option> 342 <option class="level-0" value="8">Getting Started (8)</option> 343 <option class="level-0" value="27">Git (3)</option> 344 <option class="level-0" value="32">Guest Post (4)</option> 345 <option class="level-0" value="15">Java (11)</option> 346 <option class="level-0" value="9">jQuery (74)</option> 347 <option class="level-0" value="26">jQuery UI (3)</option> 348 <option class="level-0" value="39">Linkbait (2)</option> 349 <option class="level-0" value="30">Meta (1)</option> 350 <option class="level-0" value="3">Music (36)</option> 351 <option class="level-0" value="6">Online Comics (6)</option> 352 <option class="level-0" value="16">Plugin Parade (4)</option> 353 <option class="level-0" value="46">Programming (2)</option> 354 <option class="level-0" value="31">Public Notebook (2)</option> 355 <option class="level-0" value="21">Scala (1)</option> 356 <option class="level-0" value="10">Shorties (14)</option> 357 <option class="level-0" value="48">til (3)</option> 358 <option class="level-0" value="42">Travel (1)</option> 359 <option class="level-0" value="29">WebGL (2)</option> 360 <option class="level-0" value="13">Wii (3)</option> 361 <option class="level-0" value="4">Worth Reading (21)</option> 362 <option class="level-0" value="5">Worth Watching (27)</option> 363</select> 364</form>
vendor: 108 bytes, line 364
364<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
364<script> 365( ( dropdownId ) => { 366 const dropdown = document.getElementById( dropdownId ); 367 function onSelectChange() { 368 setTimeout( () => { 369 if ( 'escape' === dropdown.dataset.lastkey ) { 370 return; 371 } 372 if ( dropdown.value && parseInt( dropdown.value ) > 0 && dropdown instanceof HTMLSelectElement ) { 373 dropdown.parentElement.submit(); 374 } 375 }, 250 ); 376 } 377 function onKeyUp( event ) { 378 if ( 'Escape' === event.key ) { 379 dropdown.dataset.lastkey = 'escape'; 380 } else { 381 delete dropdown.dataset.lastkey; 382 } 383 } 384 function onClick() { 385 delete dropdown.dataset.lastkey; 386 } 387 dropdown.addEventListener( 'keyup', onKeyUp ); 388 dropdown.addEventListener( 'click', onClick ); 389 dropdown.addEventListener( 'change', onSelectChange ); 390})( "cat" ); 391 392//# sourceURL=WP_Widget_Categories%3A%3Awidget 393</script>
393 394</li> 395 <li> 396 <h2>Subscribe to posts</h2> 397 <a href="https://bassistance.de/feed/" title="RSS Feed for all articles" class="feedlink"> 398 RSS Feed 399 </a> 400 </li> 401 </ul> 402 403</div> 404<!-- end sidebar --><!-- begin footer --> 405 <div id="footer"> 406 Copyright Jörn Zaefferer 407 </div> 408</div>
409<script type="speculationrules"> 410{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/tonus/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 411</script>
vendor: 1 bytes, line 411
411
412<script id="wp-emoji-settings" type="application/json"> 413{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://bassistance.de/wp-includes/js/wp-emoji-release.min.js?ver=7.1.2"}} 414</script>
vendor: 1 bytes, line 414
414
415<script type="module"> 416/*! This file is auto-generated */ 417var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))}); 418//# sourceURL=https://bassistance.de/wp-includes/js/wp-emoji-loader.min.js 419</script>
419 420
421<script src="https://bassistance.de/wp-content/themes/tonus/scripts/bassistance.js"></script>
vendor: 1 bytes, line 421
421
422<script src="https://bassistance.de/wp-content/themes/tonus/scripts/jquery.fitvids.js"></script>
vendor: 1 bytes, line 422
422
423<script> 424jQuery(document).ready(function($){ 425 $(".entry").fitVids(); 426}); 427</script>
vendor: 1 bytes, line 427
427
428<script> 429 var _gaq = _gaq || []; 430 _gaq.push(['_setAccount', 'UA-2623402-1']); 431 _gaq.push(['_setDomainName', '.bassistance.de']); 432 _gaq.push(['_trackPageview']); 433 434 (function() { 435 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 436 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 437 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 438 })(); 439</script>
439 440 441<!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 441-442
441 442<script async src="https://www.googletagmanager.com/gtag/js?id=
442G-S44S1HJQLW
vendor: 12 bytes, line 442
442"></script>
443<script> 444
vendor: 134 bytes, lines 444-448
444window.dataLayer = window.dataLayer || []; 445 function gtag(){dataLayer.push(arguments);} 446 gtag('js', new Date()); 447 448 gtag('config', '
448G-S44S1HJQLW
vendor: 4 bytes, line 448
448');
449</script>
449 450 451</body> 452</html> 453 454<!-- 455Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin 456 457 458Served from: bassistance.de @ 2026-10-02 03:16:35 by W3 Total Cache 459-->
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.