Biocatalysis Scientist
Primogene GmbH
Leipzig, Germany
Functional nutrition tailored to individual needs
About Us
Primogene is an innovative biotech company developing advanced bioprocesses for the production of functional ingredients. We support human health through all stages of life and across industries including nutrition, pharma, and personal care.
About The Role
As a Biocatalysis Scientist, your primary responsibility is the design, establishment, and optimization of enzyme-based reaction systems, with a strong focus on multi-enzyme cascades. You will work hands-on on building and improving robust, high-performing enzymatic reactions and cascade systems. Your role is centered on enzyme development and enzyme cascade optimization, from early-stage concept through scalable, industrially relevant enzymatic systems.
Key responsibilities
- Enzyme development, including screening, selection, and characterization
- Establishment and optimization of multi-enzyme cascades
- Optimisation of enzymatic reactions with respect to kinetics, stoichiometry, pH, temperature, cofactors, and operational stability
- Development and implementation of one-pot and cascade reactions
- Identification and resolution of bottlenecks within enzyme and cascade systems, including yield, productivity, and robustness limitations
- Development and implementation of cofactor and co-substrate regeneration strategies
You should bring
- PhD in Biochemistry, Biotechnology, Enzymology, Biocatalysis, or a closely related field
- Strong hands-on experience in biocatalysis and enzymatic reaction development
- Demonstrated experience with multi-enzyme systems and/or enzyme cascades
- Solid understanding of enzymology, enzyme kinetics, and reaction engineering
- Proven ability to design, execute, and interpret experimental work independently
- Experience developing robust enzymatic systems beyond proof-of-concept (lab-scale or larger)
- Work on innovative technologies with real-world impact.
- Work on challenging topics and cutting-edge science.
- Contribution to solving highly important problems in human nutrition and health.
- Steep learning curve with huge potential for personal and professional growth.
- Dynamic team with a collaborative and entrepreneurial team culture.
- Amazing team and colleagues
We are looking forward to receiving your application.
In case you have any questions, reach out to [email protected]
Business Areas
- Nutrition
- Personal Care
- R&D
- About Us
- Legal Notice
- Privacy Policy
let swipers = {}; let windowWidth = window.innerWidth; let uniqueIdCounter = 0; const createResponsiveSwiper = ( componentSelector, swiperSelector, classSelector, options, mode ) => { const mobile = window.matchMedia('(min-width: 0px) and (max-width: 991px)'); const desktop = window.matchMedia('(min-width: 992px)'); let elements = $(componentSelector); if (elements.length === 0) { console.log('No elements found for selector', componentSelector); // Step 2 return; } elements.each(function () { // Generate a unique key for this instance let uniqueKey = classSelector + '_' + uniqueIdCounter; const arrows = '.swiper-arrow'; const pagination = '.swiper-navigation'; $(this).find(swiperSelector).addClass(uniqueKey); $(this).find(arrows).addClass(uniqueKey); $(this).find(pagination).addClass(uniqueKey); let swiperOptions = Object.assign({}, options, { navigation: { prevEl: `${arrows}.prev.${uniqueKey}`, nextEl: `${arrows}.next.${uniqueKey}`, }, pagination: { el: `${pagination}.${uniqueKey}`, type: 'bullets', bulletActiveClass: 'swiper-pagination-bullet-active', bulletClass: 'swiper-pagination-bullet', clickable: true, }, }); swipers[classSelector] = swipers[classSelector] || {}; swipers[classSelector][uniqueKey] = swipers[classSelector][uniqueKey] || {}; let existingInstance = swipers[classSelector] ? swipers[classSelector][uniqueKey] : null; let shouldInitDesktop = mode === 'desktop' && desktop.matches; let shouldInitMobile = mode === 'mobile' && mobile.matches; let shouldInitAll = mode === 'all'; let existingSwiper = swipers[classSelector] && swipers[classSelector][uniqueKey] ? swipers[classSelector][uniqueKey].swiperInstance : null; let existingMode = swipers[classSelector] && swipers[classSelector][uniqueKey] ? swipers[classSelector][uniqueKey].mode : null; if (shouldInitDesktop || shouldInitMobile || shouldInitAll) { if (!existingSwiper) { // Initialize new instance let swiper = new Swiper(`${swiperSelector}.${uniqueKey}`, swiperOptions); swipers[classSelector][uniqueKey] = { swiperInstance: swiper, mode: shouldInitDesktop ? 'desktop' : shouldInitMobile ? 'mobile' : 'all', initialized: true, // set the initialized flag to true }; console.log('Swiper initialized for', componentSelector, 'with uniqueKey', uniqueKey); } } else if (existingSwiper) { // If none of the init conditions are true and an existing swiper instance is found, destroy it existingSwiper.destroy(true, true); delete swipers[classSelector][uniqueKey]; console.log('Swiper destroyed for', componentSelector, 'with uniqueKey', uniqueKey); } // Increment the uniqueIdCounter after processing each element uniqueIdCounter++; }); }; // Function to initialize swipers from an array of instances const runSwipers = (swiperInstances) => { swiperInstances.forEach((instance) => { console.log(...instance); createResponsiveSwiper(...instance); }); }; const initSwipers = (swiperInstances) => { // Load window.addEventListener('load', function () { console.log('Window Loaded'); runSwipers(swiperInstances); }); // Resize window.addEventListener('resize', function () { if (window.innerWidth !== windowWidth) { windowWidth = window.innerWidth; uniqueIdCounter = 0; // Reset the uniqueIdCounter runSwipers(swiperInstances); } }); }; var pix = document.getElementsByClassName("pixel"); for (var i = 0; i < pix.length; i++) { pix[i].style.animationDelay = Math.ceil(Math.random()*5000)+"ms"; } (function ($) { "use strict"; $.fn.counterUp = function (options) { // Defaults var settings = $.extend({ 'time': 800, 'delay': 100, 'formatter': false, callback: function () { } }, options), s; return this.each(function () { // Store the object var $this = $(this), counter = { time: $(this).data('counterup-time') || settings.time, delay: $(this).data('counterup-delay') || settings.delay }; var counterUpper = function () { var nums = []; var divisions = counter.time / counter.delay; var num = $this.text(); var isComma = /[0-9]+,[0-9]+/.test(num); num = num.replace(/,/g, ''); var decimalPlaces = (num.split('.')[1] || []).length; var isTime = /[0-9]+:[0-9]+:[0-9]+/.test(num); // Convert time to total seconds if (isTime) { var times = num.split(':'), m = 1; s = 0; while (times.length > 0) { s += m * parseInt(times.pop(), 10); m *= 60; } } // Generate list of incremental numbers to display for (var i = divisions; i >= 1; i--) { var newNum = parseFloat(num / divisions * i).toFixed(decimalPlaces); // Add incremental seconds and convert back to time if (isTime) { newNum = parseInt(s / divisions * i); var hours = parseInt(newNum / 3600) % 24; var minutes = parseInt(newNum / 60) % 60; var seconds = parseInt(newNum % 60, 10); newNum = (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds); } // Preserve commas if input had commas if (isComma) { while (/(\d+)(\d{3})/.test(newNum.toString())) { newNum = newNum.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2'); } } if (settings.formatter) { newNum = settings.formatter.call(this, newNum); } nums.unshift(newNum); } $this.data('counterup-nums', nums); $this.text('0'); // Updates the number until we're done var f = function () { $this.html($this.data('counterup-nums').shift()); if ($this.data('counterup-nums').length) { setTimeout($this.data('counterup-func'), counter.delay); } else { $this.data('counterup-nums', null); $this.data('counterup-func', null); settings.callback.call(this); } }; $this.data('counterup-func', f); // Start the count up setTimeout($this.data('counterup-func'), counter.delay); }; // Perform counts when the element gets into view $this.waypoint(function (direction) { counterUpper(); this.destroy(); //-- Waypoint 3.0 version of triggerOnce }, {offset: '100%'}); }); }; })(jQuery); jQuery(document).ready(function($) { $('.counterup').counterUp({ delay: 10, time: 800, }); }); $(document).ready(function() { const clickWrapElement = $('.graph_bar-wrap.click-wrap'); clickWrapElement.each(function() { $(this).on('click', function() { console.log('.graph_bar.click_wrap element was successfully clicked.'); }); }); setTimeout(function() { clickWrapElement.click(); }, 100); $('.graph_bar').hover(function() { $('.graph_bar._1').removeClass('active'); $('.graph_bar_content-wrap_inner.motor').css('opacity', '0'); }); });
Biocatalysis Scientist
Full-time
Leipzig, Germany
Functional nutrition tailored to individual needs
Qualifications
You should bring
- PhD in Biochemistry, Biotechnology, Enzymology, Biocatalysis, or a closely related field
- Strong hands-on experience in biocatalysis and enzymatic reaction development
- Demonstrated experience with multi-enzyme systems and/or enzyme cascades
- Solid understanding of enzymology, enzyme kinetics, and reaction engineering
- Proven ability to design, execute, and interpret experimental work independently
- Experience developing robust enzymatic systems beyond proof-of-concept (lab-scale or larger)
- Work on innovative technologies with real-world impact.
- Work on challenging topics and cutting-edge science.
- Contribution to solving highly important problems in human nutrition and health.
- Steep learning curve with huge potential for personal and professional growth.
- Dynamic team with a collaborative and entrepreneurial team culture.
- Amazing team and colleagues
We are looking forward to receiving your application.
In case you have any questions, reach out to [email protected]
Business Areas
- Nutrition
- Personal Care
- R&D
- About Us
- Legal Notice
- Privacy Policy
let swipers = {}; let windowWidth = window.innerWidth; let uniqueIdCounter = 0; const createResponsiveSwiper = ( componentSelector, swiperSelector, classSelector, options, mode ) => { const mobile = window.matchMedia('(min-width: 0px) and (max-width: 991px)'); const desktop = window.matchMedia('(min-width: 992px)'); let elements = $(componentSelector); if (elements.length === 0) { console.log('No elements found for selector', componentSelector); // Step 2 return; } elements.each(function () { // Generate a unique key for this instance let uniqueKey = classSelector + '_' + uniqueIdCounter; const arrows = '.swiper-arrow'; const pagination = '.swiper-navigation'; $(this).find(swiperSelector).addClass(uniqueKey); $(this).find(arrows).addClass(uniqueKey); $(this).find(pagination).addClass(uniqueKey); let swiperOptions = Object.assign({}, options, { navigation: { prevEl: `${arrows}.prev.${uniqueKey}`, nextEl: `${arrows}.next.${uniqueKey}`, }, pagination: { el: `${pagination}.${uniqueKey}`, type: 'bullets', bulletActiveClass: 'swiper-pagination-bullet-active', bulletClass: 'swiper-pagination-bullet', clickable: true, }, }); swipers[classSelector] = swipers[classSelector] || {}; swipers[classSelector][uniqueKey] = swipers[classSelector][uniqueKey] || {}; let existingInstance = swipers[classSelector] ? swipers[classSelector][uniqueKey] : null; let shouldInitDesktop = mode === 'desktop' && desktop.matches; let shouldInitMobile = mode === 'mobile' && mobile.matches; let shouldInitAll = mode === 'all'; let existingSwiper = swipers[classSelector] && swipers[classSelector][uniqueKey] ? swipers[classSelector][uniqueKey].swiperInstance : null; let existingMode = swipers[classSelector] && swipers[classSelector][uniqueKey] ? swipers[classSelector][uniqueKey].mode : null; if (shouldInitDesktop || shouldInitMobile || shouldInitAll) { if (!existingSwiper) { // Initialize new instance let swiper = new Swiper(`${swiperSelector}.${uniqueKey}`, swiperOptions); swipers[classSelector][uniqueKey] = { swiperInstance: swiper, mode: shouldInitDesktop ? 'desktop' : shouldInitMobile ? 'mobile' : 'all', initialized: true, // set the initialized flag to true }; console.log('Swiper initialized for', componentSelector, 'with uniqueKey', uniqueKey); } } else if (existingSwiper) { // If none of the init conditions are true and an existing swiper instance is found, destroy it existingSwiper.destroy(true, true); delete swipers[classSelector][uniqueKey]; console.log('Swiper destroyed for', componentSelector, 'with uniqueKey', uniqueKey); } // Increment the uniqueIdCounter after processing each element uniqueIdCounter++; }); }; // Function to initialize swipers from an array of instances const runSwipers = (swiperInstances) => { swiperInstances.forEach((instance) => { console.log(...instance); createResponsiveSwiper(...instance); }); }; const initSwipers = (swiperInstances) => { // Load window.addEventListener('load', function () { console.log('Window Loaded'); runSwipers(swiperInstances); }); // Resize window.addEventListener('resize', function () { if (window.innerWidth !== windowWidth) { windowWidth = window.innerWidth; uniqueIdCounter = 0; // Reset the uniqueIdCounter runSwipers(swiperInstances); } }); }; var pix = document.getElementsByClassName("pixel"); for (var i = 0; i < pix.length; i++) { pix[i].style.animationDelay = Math.ceil(Math.random()*5000)+"ms"; } (function ($) { "use strict"; $.fn.counterUp = function (options) { // Defaults var settings = $.extend({ 'time': 800, 'delay': 100, 'formatter': false, callback: function () { } }, options), s; return this.each(function () { // Store the object var $this = $(this), counter = { time: $(this).data('counterup-time') || settings.time, delay: $(this).data('counterup-delay') || settings.delay }; var counterUpper = function () { var nums = []; var divisions = counter.time / counter.delay; var num = $this.text(); var isComma = /[0-9]+,[0-9]+/.test(num); num = num.replace(/,/g, ''); var decimalPlaces = (num.split('.')[1] || []).length; var isTime = /[0-9]+:[0-9]+:[0-9]+/.test(num); // Convert time to total seconds if (isTime) { var times = num.split(':'), m = 1; s = 0; while (times.length > 0) { s += m * parseInt(times.pop(), 10); m *= 60; } } // Generate list of incremental numbers to display for (var i = divisions; i >= 1; i--) { var newNum = parseFloat(num / divisions * i).toFixed(decimalPlaces); // Add incremental seconds and convert back to time if (isTime) { newNum = parseInt(s / divisions * i); var hours = parseInt(newNum / 3600) % 24; var minutes = parseInt(newNum / 60) % 60; var seconds = parseInt(newNum % 60, 10); newNum = (hours < 10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds); } // Preserve commas if input had commas if (isComma) { while (/(\d+)(\d{3})/.test(newNum.toString())) { newNum = newNum.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2'); } } if (settings.formatter) { newNum = settings.formatter.call(this, newNum); } nums.unshift(newNum); } $this.data('counterup-nums', nums); $this.text('0'); // Updates the number until we're done var f = function () { $this.html($this.data('counterup-nums').shift()); if ($this.data('counterup-nums').length) { setTimeout($this.data('counterup-func'), counter.delay); } else { $this.data('counterup-nums', null); $this.data('counterup-func', null); settings.callback.call(this); } }; $this.data('counterup-func', f); // Start the count up setTimeout($this.data('counterup-func'), counter.delay); }; // Perform counts when the element gets into view $this.waypoint(function (direction) { counterUpper(); this.destroy(); //-- Waypoint 3.0 version of triggerOnce }, {offset: '100%'}); }); }; })(jQuery); jQuery(document).ready(function($) { $('.counterup').counterUp({ delay: 10, time: 800, }); }); $(document).ready(function() { const clickWrapElement = $('.graph_bar-wrap.click-wrap'); clickWrapElement.each(function() { $(this).on('click', function() { console.log('.graph_bar.click_wrap element was successfully clicked.'); }); }); setTimeout(function() { clickWrapElement.click(); }, 100); $('.graph_bar').hover(function() { $('.graph_bar._1').removeClass('active'); $('.graph_bar_content-wrap_inner.motor').css('opacity', '0'); }); });