PageSourceSearch

https://bassistance.de/about/resume/

html bassistance.de collected 2026-10-02 02:16:36 UTC 41,964 bytes, 459 lines download raw bytes

1<!DOCTYPE html>
2<html>
3<head>
4	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5	<title>bassistance.de &raquo; 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&#038;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&#039;n&#039;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&#8217;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&#8217;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&nbsp;GmbH,&nbsp;Düsseldorf</strong><br>Staff Engineer<br><small>April 2023 &#8211; today </small><br>These days I&#8217;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&amp;hl=de">Android</a>), built with React Native. We&#8217;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 &#8211; 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 &#8211; 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&#8217;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&nbsp;GmbH,&nbsp;Köln</strong><br>Head of Development<br><small>May 2015 &#8211; 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&#8217;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 &#8211; 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 &#8216;Open-Source&nbsp;JavaScript&nbsp;libraries&#8217; below). I twice participated in Google&#8217;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,&nbsp;Köln</strong><br>Senior Consultant<br><small>Feb 2007 &#8211; 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 &#8220;replace Excel&#8221; 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 &#8211; 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> &#8211; Vätercafe<br><small>January 2023 &#8211; today</small></p>
212
213
214
215<p class="wp-block-paragraph">I&#8217;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&nbsp;Köln</strong><br>Radverkehrsgruppe<br><small>Apr 2019 &#8211; today</small><br>Making the city more bicycle friendly. The most important format is the &#8220;Runder Tisch Radverkehr&#8221;, where I&#8217;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&nbsp;User&nbsp;Group&nbsp;Köln</strong><br>Co-organizer<br><small>2011 &#8211; 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&nbsp;JavaScript&nbsp;libraries</strong><br>Developer, project manager, team lead<br><small>2006 &#8211; 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&nbsp;Foundation</strong> (now the <a href="https://openjsf.org/">OpenJS Foundation</a>)<br>Board of Directors<br><small>2009 &#8211; 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&nbsp;&nbsp;(4)</option>
337	<option class="level-0" value="1">Common&nbsp;&nbsp;(155)</option>
338	<option class="level-0" value="25">Design&nbsp;&nbsp;(4)</option>
339	<option class="level-0" value="40">Freelancing&nbsp;&nbsp;(1)</option>
340	<option class="level-0" value="28">Game Programming&nbsp;&nbsp;(1)</option>
341	<option class="level-0" value="33">Games&nbsp;&nbsp;(2)</option>
342	<option class="level-0" value="8">Getting Started&nbsp;&nbsp;(8)</option>
343	<option class="level-0" value="27">Git&nbsp;&nbsp;(3)</option>
344	<option class="level-0" value="32">Guest Post&nbsp;&nbsp;(4)</option>
345	<option class="level-0" value="15">Java&nbsp;&nbsp;(11)</option>
346	<option class="level-0" value="9">jQuery&nbsp;&nbsp;(74)</option>
347	<option class="level-0" value="26">jQuery UI&nbsp;&nbsp;(3)</option>
348	<option class="level-0" value="39">Linkbait&nbsp;&nbsp;(2)</option>
349	<option class="level-0" value="30">Meta&nbsp;&nbsp;(1)</option>
350	<option class="level-0" value="3">Music&nbsp;&nbsp;(36)</option>
351	<option class="level-0" value="6">Online Comics&nbsp;&nbsp;(6)</option>
352	<option class="level-0" value="16">Plugin Parade&nbsp;&nbsp;(4)</option>
353	<option class="level-0" value="46">Programming&nbsp;&nbsp;(2)</option>
354	<option class="level-0" value="31">Public Notebook&nbsp;&nbsp;(2)</option>
355	<option class="level-0" value="21">Scala&nbsp;&nbsp;(1)</option>
356	<option class="level-0" value="10">Shorties&nbsp;&nbsp;(14)</option>
357	<option class="level-0" value="48">til&nbsp;&nbsp;(3)</option>
358	<option class="level-0" value="42">Travel&nbsp;&nbsp;(1)</option>
359	<option class="level-0" value="29">WebGL&nbsp;&nbsp;(2)</option>
360	<option class="level-0" value="13">Wii&nbsp;&nbsp;(3)</option>
361	<option class="level-0" value="4">Worth Reading&nbsp;&nbsp;(21)</option>
362	<option class="level-0" value="5">Worth Watching&nbsp;&nbsp;(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.