{"$schema":"https://raw.githubusercontent.com/jsonresume/resume-schema/v1.2.1/schema.json","basics":{"name":"Robert Schäfer","label":"Full Stack Developer","image":"https://avatars.githubusercontent.com/u/2110676","email":"hello@roschaefer.de","url":"https://roschaefer.de/","signal":"https://signal.me/#eu/DI0Crg8ktbRKrFyKqMRVJeMO-ecjH3Xa9I6wu8QWkQRUUzGBm-lPwJh0xlrvFb00","summary":"I work remotely as a freelance full stack developer across web applications, product engineering, and infrastructure, and I invest additional time in open source. My focus is on maintainable software, strong test coverage, and modernizing fragile systems by simplifying delivery and operations while strengthening quality through reliable collaboration, code reviews, pair programming, and technical mentoring.","location":{"address":"no permanent address","city":"Cologne","region":"NRW","countryCode":"DE"},"profiles":[{"network":"LinkedIn","username":"Robert Schäfer","url":"https://www.linkedin.com/in/roschaefer/"},{"id":"11444f76-fbdb-4461-8f30-54bfbcf452df","url":"https://github.com/roschaefer","network":"Github","username":"roschaefer"},{"id":"19f445bb-b77e-4a45-9be3-15d905a99e6e","url":"https://www.youtube.com/channel/UCyrLYmvmLzWxnPHxt4n5aPw","network":"YouTube","username":"Robert Schäfer"},{"id":"eefa7b2c-5246-41d1-a344-5ee600f55d92","url":"https://twitter.com/roschaeferDE","network":"Twitter","username":"roschaeferDE"},{"id":"mastodon-roschaefer","url":"https://mastodon.social/@roschaefer","network":"Mastodon","username":"roschaefer"},{"id":"fcb53294-762d-4d77-881b-e379bf574407","url":"https://www.codementor.io/@roschaefer","network":"CodeMentor","username":"roschaefer"}]},"work":[],"volunteer":[],"awards":[{"title":"Grimme Online Award (nominated)","date":"2020-06-25","summary":"Automated sensor-driven storytelling format (bees)","awarder":"Grimme-Institut","links":[{"label":"Automated sensor-driven storytelling format (bees)","url":"https://www.grimme-online-award.de/archiv/2020/nominierte/n/d/bienenlive-folge-den-koeniginnen","kind":"award"}]},{"title":"German Reporter Award 2019","date":"2019-12-02","summary":"Automated sensor-driven storytelling format (bees)","awarder":"Reporter-Forum e. V.","links":[{"label":"Automated sensor-driven storytelling format (bees)","url":"https://de.wikipedia.org/wiki/Deutscher_Reporter:innenpreis#Deutscher_Reporterpreis_2019","kind":"award"}]},{"title":"German Reporter Award 2017 (nominated)","date":"2017-12-11","summary":"Automated sensor-driven storytelling format (dairy cows)","awarder":"Reporter-Forum e. V.","links":[{"label":"Automated sensor-driven storytelling format (dairy cows)","url":"https://archiv.reporter-forum.de/index.php%3Fid=231.html#c2904","kind":"award"}]},{"title":"Winner of MIZ Formatfestival 2015","summary":"#ursuppe","date":"2015-11-12","awarder":"MIZ Babelsberg","links":[{"label":"#ursuppe","url":"https://www.mabb.de/uber-die-mabb/aktuelles/veranstaltungen-details/miz-formatfestival-2015-preisverleihung-im-miz-babelsberg","kind":"award"}]}],"languages":[{"language":"German","fluency":"Native Speaker"},{"language":"English","fluency":"Business Fluent"},{"language":"Spanish","fluency":"Fluent"}],"certificates":[],"references":[],"education":[{"id":"hpi-msc","institution":"Hasso Plattner Institute","url":"https://hpi.de/","area":"IT-Systems Engineering","studyType":"Master of Science","startDate":"2014-10-01","endDate":"2018-03-31","score":"1.6","courses":[]},{"id":"hpi-bsc","institution":"Hasso Plattner Institute","url":"https://hpi.de/","area":"IT-Systems Engineering","studyType":"Bachelor of Science","startDate":"2009-09-01","endDate":"2012-07-01","score":"1.7","courses":[]},{"id":"gymnasium-lohmar-abitur","institution":"Gymnasium Lohmar","area":"","studyType":"Abitur","startDate":"1999-08-01","endDate":"2008-06-30","courses":[]}],"interests":[{"name":"Modern Compiled Languages","keywords":["Rust","Go","Zig"]},{"name":"Cross-platform Development","keywords":["Flutter"]},{"name":"Infrastructure as Code","keywords":["Terraform"]}],"projects":[{"id":"ai-interview-platform","name":"AI-assisted interview platform","entity":"tactile.news GmbH","engagement":"freelance","codeVisibility":"open-source","roles":["Full Stack Developer"],"startDate":"2026-03-23","keywords":["TypeScript","Svelte","SvelteKit","Tailwind","Better Auth","Drizzle ORM","Neon DB","PostgreSQL","Playwright","Vitest","Netlify","Sentry","Serverless","Infisical","ElevenLabs"],"description":"With this SvelteKit application for AI-assisted interviews and editorial publishing, I am helping replace a brittle infrastructure spread across Airtable, Voiceflow, and additional custom services with a single serverless application. By using the built-in workflows of ElevenLabs AI Agents, we significantly reduce maintenance overhead and complexity while improving the phone agent's response time by several seconds, which is crucial for a good user experience.","url":"https://github.com/tactilenews/dialogbank-app/","type":"product"},{"id":"roschaefer-portfolio","name":"roschaefer.de","entity":"Robert Schäfer","engagement":"independent","codeVisibility":"open-source","roles":["Design and Development"],"startDate":"2026-03-16","keywords":["TypeScript","Svelte","SvelteKit","Tailwind","Paraglide","Typst","Vitest","Playwright","Netlify"],"description":"My personal portfolio website and a print-optimized resume built from a shared content source. The project combines a bilingual SvelteKit frontend, PDF generation with Typst, and standards-compliant `resume.json` into an accessible, privacy-conscious experience for web and print.","url":"https://roschaefer.de/","type":"portfolio"},{"id":"entrepreneur-social-platform","name":"Social platform for entrepreneurs","entity":"IT4C","engagement":"freelance","codeVisibility":"open-source","roles":["Full Stack Developer"],"startDate":"2024-06-21","endDate":"2025-06-09","keywords":["TypeScript","Docker","Vue","Vike","Vuetify","Jest","Authentik","Apollo GraphQL","Terraform","Helm","Kubernetes","Hetzner","PostgreSQL"],"description":"For this free and open-source social platform for entrepreneurs I fundamentally reworked the delivery and infrastructure architecture after deployments had previously been performed manually via a remote desktop on the target server, regularly causing downtime. By moving the project to a self-managed Kubernetes setup on Hetzner with Terraform, each developer could test their own branches in production-like environments while keeping operating costs extremely low at under 20 euros per month.","url":"https://dreammall.earth/","type":"product"},{"id":"audience-engagement-platform","name":"Audience engagement platform for newsrooms","entity":"tactile.news GmbH","engagement":"freelance","codeVisibility":"open-source","roles":["Full Stack Developer"],"startDate":"2020-03-30","endDate":"2025-04-16","keywords":["Ruby","TypeScript","Ruby on Rails","RSpec","Stimulus","Docker","Ansible","Digital Ocean","Sentry","Postmark"],"description":"For this platform for audience engagement and crowd-based reporting in journalism, I worked on a Ruby on Rails application that integrates messengers such as WhatsApp, Telegram, Signal, Threema, and email, allowing editorial teams to reach people through channels they already use. Its core differentiator is a direct 1:1 conversation between journalists and their audience, turning a newsroom's own community into a valuable asset for reporting and research.","url":"https://tactile.news/","links":[{"label":"GitHub","url":"https://github.com/tactilenews/100eyes","kind":"repository"}],"type":"product"},{"id":"remote-telescope-platform","name":"Remote telescope control platform","entity":"Bosse Consulting GmbH","engagement":"freelance","roles":["Full Stack Developer"],"startDate":"2025-03-25","keywords":["TypeScript","Nuxt","Vue","Fly.io","Docker","AWS","Terraform","Playwright","Cucumber","Tailwind","NINA","Tailscale"],"description":"With this platform for remotely controlling telescopes through the astrophotography software NINA, deep-sky imaging gets accessible without owning expensive hardware or the expertise to operate it. Users select an astronomical target and book observation time; the application sends imaging sequences to NINA via Tailscale, which executes them overnight and delivers the results. The core challenge is turning a Windows-only, inherently interactive application into a fully autonomous pipeline.","type":"product"},{"id":"automotive-price-comparison","name":"Price comparison platform for the automotive aftermarket","entity":"auteon GmbH","engagement":"freelance","codeVisibility":"closed-source","roles":["Full Stack Developer"],"startDate":"2021-06-30","endDate":"2023-09-01","keywords":["TypeScript","Docker","Vue","Tailwind","Jest","Testing-Library","Auth0","Apollo GraphQL","Hasura","Google Cloud","Vercel"],"description":"For this software for the automotive aftermarket that helps repair shops compare prices across wholesalers, we migrated an Electron desktop application to a cloud-based platform on Google Cloud, Auth0, and Hasura. This significantly improved software quality and increased the number of connected wholesalers from 3 to 240.","url":"https://www.auteon.com","type":"product"},{"id":"retail-website-relaunch","name":"Website relaunch with SvelteKit and Hygraph","entity":"Johannes Schäfer","engagement":"freelance","codeVisibility":"closed-source","roles":["Full Stack Developer"],"startDate":"2021-12-09","endDate":"2023-06-28","keywords":["TypeScript","Svelte","SvelteKit","HyGraph","Netlify","Serverless"],"description":"I rebuilt the website for a retail client with SvelteKit and Hygraph and deployed it statically on Netlify. Server-side logic runs in serverless functions, and content is loaded from the headless CMS via GraphQL. The relaunch improved performance, SEO, and maintainability.","url":"https://rhenania-computer.de/de","type":"client-platform"},{"id":"course-booking-system","name":"Booking system for course providers","entity":"Johannes Schäfer","engagement":"freelance","codeVisibility":"closed-source","roles":["Full Stack Developer"],"startDate":"2020-08-11","endDate":"2023-05-02","keywords":["TypeScript","Netlify","Vue","Nuxt","HyGraph"],"description":"I built a custom booking system for sewing classes for a course provider and integrated it into their website. Courses for adults, teens, and children can be managed online, including registration and waiting lists.","url":"https://werkhof-ichen.de/","type":"client-platform"},{"id":"continuing-education-booking-system","name":"Booking system for continuing education providers","entity":"Johannes Schäfer","engagement":"freelance","codeVisibility":"closed-source","roles":["Full Stack Developer"],"startDate":"2021-05-12","endDate":"2022-12-10","keywords":["TypeScript","Netlify","Svelte","SvelteKit","Tailwind"],"description":"I built a custom booking system for a continuing education provider. The solution includes email confirmations, waiting lists, and an implementation based on SvelteKit with Hygraph as the headless CMS.","url":"https://tanzimpulse.de/","type":"client-platform"},{"id":"holiday-apartment-booking-site","name":"Booking website for a holiday apartment","entity":"Johannes Schäfer","engagement":"freelance","codeVisibility":"closed-source","roles":["Full Stack Developer"],"startDate":"2022-01-28","endDate":"2022-08-09","keywords":["TypeScript","Netlify","Svelte","SvelteKit","Tailwind"],"description":"For a holiday apartment on Norderney, I built a booking website with calendar integration. Day-by-day availability is maintained in Google Calendar and synchronized to the site via Google APIs.","url":"https://am-meer-norderney.de/","type":"client-platform"},{"id":"systems-development-and-framework","entity":"Hochschule für Technik und Wirtschaft Berlin","name":"Systems-Development and Framework","engagement":"freelance","codeVisibility":"open-source","roles":["University Lecturer"],"startDate":"2019-10-31","endDate":"2021-03-31","keywords":["JavaScript","Vue","Apollo GraphQL","Neo4J","Nuxt","Vuetify","Tailwind"],"description":"I was fully responsible for a master's course on full stack development with around 40 students, including curriculum, teaching, and grading. Topics included functional programming, advanced Git, test-driven development, and code reviews on GitHub. All lectures are publicly available on YouTube.","url":"https://www.youtube.com/watch?v=-cuzwDjdowo&list=PL1CiawkXA01PO_39DnKSrxWw99mU7mwWs","links":[{"label":"GitHub","url":"https://github.com/systems-development-and-frameworks","kind":"repository"},{"label":"YouTube Playlist","url":"https://www.youtube.com/playlist?list=PL1CiawkXA01PO_39DnKSrxWw99mU7mwWs","kind":"playlist"}],"location":"Berlin, Germany","type":"course"},{"id":"open-source-social-network","name":"Community-run open-source social network","entity":"busfaktor e.V.","engagement":"freelance","codeVisibility":"open-source","roles":["Technical Lead"],"startDate":"2018-11-30","endDate":"2020-04-30","keywords":["JavaScript","Jest","Vue","Nuxt","Storybook","Cypress","Apollo GraphQL","Neo4J","Docker","Digital Ocean","Kubernetes"],"url":"https://github.com/Ocelot-Social-Community/Ocelot-Social","description":"For this community-built open-source social network that offers communities a privacy-friendly alternative to large platforms, I worked as Technical Lead on product architecture, GraphQL APIs, production use of Neo4J, and Kubernetes-based operations. The project grew to around 80 code contributors on GitHub; I onboarded newcomers through GitHub, Discord, and online pair programming, mentored them directly, and reviewed most contributions. We used Neo4J in production as the primary database to model the network's social graph directly.","links":[{"label":"Staging","url":"https://stage.ocelot.social","kind":"demo"}],"type":"product"},{"id":"find-open-source-contributors-vuejs-berlin","name":"Find open-source contributors in online learner communities","entity":"Vue.js Berlin Meetup","engagement":"community","startDate":"2020-01-14","endDate":"2020-01-14","roles":["Speaker"],"url":"https://www.youtube.com/watch?v=p5iMjfVCXBY","type":"presentation"},{"id":"neo4j-graphql-human-connection","name":"Using Neo4J and GraphQL to build Human Connection","entity":"Neo4J Online Meetup","engagement":"community","startDate":"2019-06-20","endDate":"2019-06-20","roles":["Speaker"],"url":"https://www.youtube.com/watch?v=kGwGX6R70H4","type":"presentation"},{"id":"sensor-storytelling-bees","entity":"tactile.news GmbH","name":"Automated sensor-driven storytelling format (bees)","engagement":"freelance","codeVisibility":"closed-source","roles":["Full Stack Developer"],"startDate":"2019-03-31","endDate":"2019-05-31","keywords":["Ruby","Ruby on Rails","RSpec","Cucumber"],"description":"Building on an earlier journalistic sensor-data project, we reused and extended the platform for a new format. Reports were generated automatically from sensor data collected from three beehives. The project was nominated for the Grimme Online Award and won the German Reporter Award.","url":"https://tactile.news/startseite/journalismus-der-dinge/bienenlive/","type":"product"},{"id":"rundfunk-mitbestimmen-project","name":"Rundfunk mitbestimmen","roles":["Founder"],"startDate":"2016-08-31","endDate":"2019-03-31","keywords":["Ember","Ruby on Rails","Auth0","D3","Highcharts","Uberspace","PostgreSQL"],"description":"\"Rundfunk mitbestimmen\" is a civic tech project that lets people symbolically influence how public broadcasting fees are allocated. Users can assign their contributions to individual programs. The project was covered by Zeit Online, Netzpolitik.org, Deutschlandfunk, and RBB.","links":[{"label":"Zeit Online","url":"https://www.zeit.de/campus/2017-09/z2x-festival-zehn-beste-projekte/seite-2","kind":"press"},{"label":"Netzpolitik.org","url":"https://netzpolitik.org/2017/neues-aus-dem-fernsehrat-6-ein-gespraech-ueber-rundfunk-mitbestimmen-de/","kind":"press"},{"label":"Deutschlandfunk","url":"https://www.deutschlandfunk.de/oeffentlich-rechtlicher-rundfunk-mehr-direkte-demokratie-100.html","kind":"press"},{"label":"RBB","url":"https://www.wwwagner.tv/?p=36200","kind":"press"}],"type":"civic-tech"},{"id":"find-open-source-contributors-35c3","name":"Find open-source contributors in online learner communities","entity":"35th Chaos Communication Congress","startDate":"2018-12-30","endDate":"2018-12-30","roles":["Speaker"],"url":"https://media.ccc.de/v/35c3-9568-lightning_talks_day_4#t=1147","type":"presentation"},{"id":"human-connection-35c3","name":"Human Connection","entity":"35th Chaos Communication Congress","startDate":"2018-12-29","endDate":"2018-12-29","roles":["Speaker"],"url":"https://media.ccc.de/v/35c3-9567-lightning_talks_day_3#t=5180","type":"presentation"},{"id":"rubies-in-the-woods","name":"Rubies in the woods","entity":"MIZ Babelsberg","roles":["Programming Mentor"],"startDate":"2015-09-30","endDate":"2018-11-30","keywords":["Ruby"],"description":"Mentored a beginner-friendly programming group through weekly sessions focused on diversity and low-barrier access to learning how to code.","url":"https://www.facebook.com/watch?v=1342132595875337","location":"Potsdam, Brandenburg, Germany","type":"mentoring"},{"id":"custom-cms-platform","name":"Custom CMS platform","entity":"Solutiance AG","roles":["Full Stack Developer"],"startDate":"2018-04-30","endDate":"2018-06-30","keywords":["Wordpress","PHP","Docker"],"description":"Custom CMS development for the company website with a focus on maintainability and search engine optimization.","url":"https://solutiance.com/","type":"client-platform"},{"id":"informatikradar-1","name":"Informatikradar #1","entity":"Gesellschaft für Informatik","startDate":"2018-05-04","endDate":"2018-05-04","roles":["Speaker"],"url":"https://www.youtube.com/watch?v=fzTmJBo4R5A","type":"presentation"},{"id":"smart-mirror-prototype","name":"IoT prototype: smart bathroom mirror","entity":"tactile.news GmbH","roles":["IoT Developer"],"startDate":"2018-01-01","endDate":"2018-01-31","keywords":["Python","JavaScript","MQTT"],"description":"Rapid IoT prototype of a smart bathroom mirror and cabinet built with Raspberry Pis, Arduinos, and MQTT.","location":"Lunenburg, Lower Saxony, Germany","type":"prototype"},{"id":"story-trolley-ember-meets-iot","name":"Story-Trolley: Ember meets the IoT","description":"How to use Ember to build a smart shopping cart.","entity":"Ember.js Meetup Berlin","startDate":"2018-01-19","endDate":"2018-01-19","roles":["Speaker"],"url":"https://www.youtube.com/watch?v=oWNqLev23AQ&list=PL1CiawkXA01NeLHG2QNHmtACrb_brDodm","type":"presentation"},{"id":"rundfunk-mitbestimmen-34c3","name":"Rundfunk mitbestimmen","entity":"34th Chaos Communication Congress","startDate":"2017-12-30","endDate":"2017-12-30","roles":["Speaker"],"url":"https://media.ccc.de/v/34c3-9258-lightning_talks_day_4#t=1352","type":"presentation","description":"\"Rundfunk mitbestimmen\" is a tool to encourage public participation in the expenditure of German broadcasting fees. Fee payers can symbolically allocate their monies to specific programs. The project was covered by Zeit Online, Netzpolitik.org, Deutschlandfunk and RBB.","links":[{"label":"Zeit Online","url":"https://www.zeit.de/campus/2017-09/z2x-festival-zehn-beste-projekte/seite-2","kind":"press"},{"label":"Netzpolitik.org","url":"https://netzpolitik.org/2017/neues-aus-dem-fernsehrat-6-ein-gespraech-ueber-rundfunk-mitbestimmen-de/","kind":"press"},{"label":"Deutschlandfunk","url":"https://www.deutschlandfunk.de/oeffentlich-rechtlicher-rundfunk-mehr-direkte-demokratie-100.html","kind":"press"},{"label":"RBB","url":"https://www.wwwagner.tv/?p=36200","kind":"press"}]},{"id":"gez-scrap-it-or-pay-it","name":"GEZ - scrap it or pay it?","entity":"University Meetup Group \"Bremer Gesellschaft\"","startDate":"2017-12-19","endDate":"2017-12-19","roles":["Speaker"],"url":"https://www.facebook.com/events/732304050294246/","type":"presentation"},{"id":"sensor-storytelling-dairy-cows","name":"Automated sensor-driven storytelling format (dairy cows)","entity":"tactile.news GmbH","roles":["Full Stack Developer"],"startDate":"2016-05-31","endDate":"2017-10-31","keywords":["Ruby on Rails","Ruby","RSpec","Cucumber"],"description":"For WDR and Spiegel Online, we developed a journalistic format that generated reports automatically from sensor data collected from three dairy cows. The project received broad media attention with more than 63 reports and features.","url":"https://superkuehe.wdr.de/","links":[{"label":"WDR","url":"https://www1.wdr.de/unternehmen/der-wdr/unternehmen/superkuehe-114.html","kind":"press"},{"label":"Spiegel Online","url":"https://www.spiegel.de/netzwelt/web/superkuehe-sensorjournalismus-mit-milchkuehen-a-1165241.html","kind":"press"},{"label":"63 reports and features","url":"https://superkuehe.wdr.de/zum-projekt/meinung/","kind":"press"}]},{"id":"coding-in-the-woods","name":"Coding In The Woods","description":"Introduction to Coding with Rails.","entity":"Codemotion Berlin 2017","startDate":"2017-10-12","endDate":"2017-10-12","roles":["Speaker"],"url":"https://berlin2017.codemotionworld.com/speaker/3623/","type":"presentation"},{"id":"how-to-enjoy-paying-for-public-broadcasting","name":"How to enjoy paying for public broadcasting","description":"Ask-me-anything session at the festival for young visionaries.","entity":"Z2X Festival - Die Zeit","startDate":"2017-09-04","endDate":"2017-09-04","roles":["Speaker"],"url":"https://www.zeit.de/campus/2017-09/z2x-festival-zehn-beste-projekte/seite-2","type":"presentation"},{"id":"smart-shopping-cart-prototype","name":"IoT prototype: smart shopping cart","entity":"tactile.news GmbH","roles":["IoT Developer"],"startDate":"2017-06-01","endDate":"2017-06-30","keywords":["Ember","Python"],"description":"Rapid IoT prototype of a smart shopping cart.","url":"https://www.facebook.com/watch?v=746195418906331","type":"prototype"},{"id":"rundfunk-mitbestimmen-nerd-nite-17","name":"Rundfunk mitbestimmen","entity":"Nerd Nite Berlin #17","startDate":"2017-06-16","endDate":"2017-06-16","roles":["Speaker"],"url":"https://www.youtube.com/watch?v=3BmdDEuW-ZA","type":"presentation","description":"\"Rundfunk mitbestimmen\" is a tool to encourage public participation in the expenditure of German broadcasting fees. Fee payers can symbolically allocate their monies to specific programs. The project was covered by Zeit Online, Netzpolitik.org, Deutschlandfunk and RBB.","links":[{"label":"Zeit Online","url":"https://www.zeit.de/campus/2017-09/z2x-festival-zehn-beste-projekte/seite-2","kind":"press"},{"label":"Netzpolitik.org","url":"https://netzpolitik.org/2017/neues-aus-dem-fernsehrat-6-ein-gespraech-ueber-rundfunk-mitbestimmen-de/","kind":"press"},{"label":"Deutschlandfunk","url":"https://www.deutschlandfunk.de/oeffentlich-rechtlicher-rundfunk-mehr-direkte-demokratie-100.html","kind":"press"},{"label":"RBB","url":"https://www.wwwagner.tv/?p=36200","kind":"press"}]},{"id":"why-do-i-have-to-pay-and-dont-get-a-say","name":"Why do I have to pay and don't get a say?","description":"Democratize public broadcasting.","entity":"OpenTechSummit 2017","startDate":"2017-05-25","endDate":"2017-05-25","roles":["Speaker"],"url":"https://www.youtube.com/watch?v=mr_9iNma0pI&list=PL1CiawkXA01PaCTnImLLqbrcbJmf7Xssv","type":"presentation"},{"id":"miz-rapid-fire-pitch","name":"MIZ Rapid Fire Pitch","description":"SensorStory (Best Practices)","entity":"re:publica 2017 - Love Out Loud","startDate":"2017-05-09","endDate":"2017-05-09","roles":["Speaker"],"url":"https://www.youtube.com/watch?v=GKKaVHjxJII&t=358s","type":"presentation"},{"id":"ember-rails-capybara","name":"Ember.js + Rails + Capybara = ♥️","entity":"Ember.js Meetup Berlin","startDate":"2017-03-10","endDate":"2017-03-10","roles":["Speaker"],"url":"https://www.youtube.com/watch?v=xSukVhdX0DI&list=PL1CiawkXA01N8PRcrZ4UlFJRT8Bx9gDOp","type":"presentation"},{"id":"rundfunk-mitbestimmen-swift-meetup","name":"Rundfunk mitbestimmen","entity":"Swift Meetup Berlin","startDate":"2016-11-14","endDate":"2016-11-14","roles":["Speaker"],"url":"https://www.youtube.com/watch?v=8TyViNgmeSQ","type":"presentation","description":"\"Rundfunk mitbestimmen\" is a tool to encourage public participation in the expenditure of German broadcasting fees. Fee payers can symbolically allocate their monies to specific programs. The project was covered by Zeit Online, Netzpolitik.org, Deutschlandfunk and RBB.","links":[{"label":"Zeit Online","url":"https://www.zeit.de/campus/2017-09/z2x-festival-zehn-beste-projekte/seite-2","kind":"press"},{"label":"Netzpolitik.org","url":"https://netzpolitik.org/2017/neues-aus-dem-fernsehrat-6-ein-gespraech-ueber-rundfunk-mitbestimmen-de/","kind":"press"},{"label":"Deutschlandfunk","url":"https://www.deutschlandfunk.de/oeffentlich-rechtlicher-rundfunk-mehr-direkte-demokratie-100.html","kind":"press"},{"label":"RBB","url":"https://www.wwwagner.tv/?p=36200","kind":"press"}]},{"id":"rundfunk-mitbestimmen-hpi-hack-and-tell","name":"Rundfunk mitbestimmen","entity":"HPI Hack'n Tell","startDate":"2016-10-26","endDate":"2016-10-26","roles":["Speaker"],"url":"https://www.youtube.com/watch?v=JxnWeyYFwUw","type":"presentation","description":"\"Rundfunk mitbestimmen\" is a tool to encourage public participation in the expenditure of German broadcasting fees. Fee payers can symbolically allocate their monies to specific programs. The project was covered by Zeit Online, Netzpolitik.org, Deutschlandfunk and RBB.","links":[{"label":"Zeit Online","url":"https://www.zeit.de/campus/2017-09/z2x-festival-zehn-beste-projekte/seite-2","kind":"press"},{"label":"Netzpolitik.org","url":"https://netzpolitik.org/2017/neues-aus-dem-fernsehrat-6-ein-gespraech-ueber-rundfunk-mitbestimmen-de/","kind":"press"},{"label":"Deutschlandfunk","url":"https://www.deutschlandfunk.de/oeffentlich-rechtlicher-rundfunk-mehr-direkte-demokratie-100.html","kind":"press"},{"label":"RBB","url":"https://www.wwwagner.tv/?p=36200","kind":"press"}]},{"id":"protothon","name":"Protothon","entity":"MIZ Babelsberg","roles":["Hackathon Coach"],"startDate":"2015-08-31","endDate":"2016-09-30","keywords":["JavaScript"],"description":"","url":"https://www.miz-babelsberg.de/startseite.html","location":"Potsdam, Brandenburg, Germany"},{"id":"ursuppe","name":"#ursuppe","entity":"MIZ Babelsberg","roles":["Hackathon Coach"],"startDate":"2015-08-01","endDate":"2015-08-31","description":"Coached the team behind #ursuppe, an IoT prototype that automatically generated a live journalism report from a biological experiment tracking brine shrimp. Winner of the MIZ Formatfestival 2015.","url":"https://www.youtube.com/watch?v=-H9aFNUXvvA","location":"Potsdam, Brandenburg, Germany","type":"prototype"},{"id":"supply-chain-risk-research","name":"Automated Risk Analysis in Supply Chains","entity":"SAP","roles":["Research Intern"],"startDate":"2013-10-01","endDate":"2013-11-30","description":"Built a tool for automated risk analysis in supply chains, working with an existing legacy codebase.","url":"https://www.sap.com/","location":"Belfast, United Kingdom","type":"research"},{"id":"sports-association-webapp","entity":"OXON AG","name":"Web application for sports associations","roles":["Full Stack Developer"],"startDate":"2013-04-01","endDate":"2013-09-30","keywords":["Ruby","Ruby on Rails","RSpec","Cucumber","PostgreSQL"],"description":"For this web application for officials, referees, and coaches, I was the first developer to introduce an automated test environment.","url":"https://clubcorner.ch/","location":"Bern, Switzerland","type":"product"},{"id":"enterprise-programming-models-in-memory-databases","name":"Enterprise programming models for in-memory databases","entity":"Hasso Plattner Institute","roles":["Researcher"],"startDate":"2012-01-31","endDate":"2012-08-31","keywords":["Java"],"description":"Implementation of a business process and web application as specified by SAP as a use case for the HANA in-memory database.","url":"https://hpi.de/","type":"research"}],"skills":[{"name":"TypeScript","level":"Long-term experience","keywords":["6 years, 5 months","10 projects","active now"]},{"name":"Docker","level":"Long-term experience","keywords":["8 years","6 projects","active now"]},{"name":"Vue","level":"Long-term experience","keywords":["7 years, 1 month","6 projects","active now"]},{"name":"Ruby","level":"Long-term experience","keywords":["9 years, 2 months","5 projects","last used Apr 2025"]},{"name":"Tailwind","level":"Long-term experience","keywords":["5 years, 4 months","7 projects","active now"]},{"name":"Ruby on Rails","level":"Long-term experience","keywords":["8 years, 9 months","5 projects","last used Apr 2025"]},{"name":"Nuxt","level":"Long-term experience","keywords":["6 years","4 projects","active now"]},{"name":"RSpec","level":"Long-term experience","keywords":["7 years, 5 months","4 projects","last used Apr 2025"]},{"name":"PostgreSQL","level":"Proficient use","keywords":["4 years, 8 months","4 projects","active now"]},{"name":"Netlify","level":"Proficient use","keywords":["3 years, 4 months","6 projects","active now"]},{"name":"Sentry","level":"Proficient use","keywords":["5 years, 7 months","2 projects","active now"]},{"name":"Apollo GraphQL","level":"Long-term experience","keywords":["5 years, 10 months","4 projects","last used Jun 2025"]},{"name":"Cucumber","level":"Proficient use","keywords":["3 years, 8 months","4 projects","active now"]},{"name":"Svelte","level":"Proficient use","keywords":["2 years, 7 months","5 projects","active now"]},{"name":"SvelteKit","level":"Proficient use","keywords":["2 years, 7 months","5 projects","active now"]},{"name":"Digital Ocean","level":"Proficient use","keywords":["6 years, 6 months","2 projects","last used Apr 2025"]},{"name":"Jest","level":"Proficient use","keywords":["4 years, 11 months","3 projects","last used Jun 2025"]},{"name":"Terraform","level":"Proficient use","keywords":["2 years, 2 months","2 projects","active now"]},{"name":"Playwright","level":"Practical experience","keywords":["1 year, 5 months","3 projects","active now"]},{"name":"Ansible","level":"Practical experience","keywords":["5 years, 2 months","1 project","last used Apr 2025"]},{"name":"Postmark","level":"Practical experience","keywords":["5 years, 2 months","1 project","last used Apr 2025"]},{"name":"Stimulus","level":"Practical experience","keywords":["5 years, 2 months","1 project","last used Apr 2025"]},{"name":"Serverless","level":"Proficient use","keywords":["2 years","2 projects","active now"]},{"name":"Auth0","level":"Proficient use","keywords":["5 years","2 projects","last used Sep 2023"]},{"name":"JavaScript","level":"Basic exposure","keywords":["3 years, 8 months","4 projects","last used Mar 2021"]},{"name":"AWS","level":"Practical experience","keywords":["1 year, 5 months","1 project","active now"]},{"name":"Fly.io","level":"Practical experience","keywords":["1 year, 5 months","1 project","active now"]},{"name":"NINA","level":"Practical experience","keywords":["1 year, 5 months","1 project","active now"]},{"name":"Tailscale","level":"Practical experience","keywords":["1 year, 5 months","1 project","active now"]},{"name":"Kubernetes","level":"Proficient use","keywords":["2 years, 7 months","2 projects","last used Jun 2025"]},{"name":"Vuetify","level":"Proficient use","keywords":["2 years, 7 months","2 projects","last used Jun 2025"]},{"name":"Vitest","level":"Practical experience","keywords":["5 months","2 projects","active now"]},{"name":"Better Auth","level":"Practical experience","keywords":["5 months","1 project","active now"]},{"name":"Drizzle ORM","level":"Practical experience","keywords":["5 months","1 project","active now"]},{"name":"ElevenLabs","level":"Practical experience","keywords":["5 months","1 project","active now"]},{"name":"Infisical","level":"Practical experience","keywords":["5 months","1 project","active now"]},{"name":"Neon DB","level":"Practical experience","keywords":["5 months","1 project","active now"]},{"name":"Paraglide","level":"Practical experience","keywords":["5 months","1 project","active now"]},{"name":"Typst","level":"Practical experience","keywords":["5 months","1 project","active now"]},{"name":"HyGraph","level":"Proficient use","keywords":["2 years, 11 months","2 projects","last used Jun 2023"]},{"name":"Ember","level":"Basic exposure","keywords":["2 years, 8 months","2 projects","last used Mar 2019"]},{"name":"Neo4J","level":"Basic exposure","keywords":["2 years, 5 months","2 projects","last used Mar 2021"]},{"name":"Authentik","level":"Practical experience","keywords":["1 year, 1 month","1 project","last used Jun 2025"]},{"name":"Helm","level":"Practical experience","keywords":["1 year, 1 month","1 project","last used Jun 2025"]},{"name":"Hetzner","level":"Practical experience","keywords":["1 year, 1 month","1 project","last used Jun 2025"]},{"name":"Vike","level":"Practical experience","keywords":["1 year, 1 month","1 project","last used Jun 2025"]},{"name":"D3","level":"Basic exposure","keywords":["2 years, 8 months","1 project","last used Mar 2019"]},{"name":"Highcharts","level":"Basic exposure","keywords":["2 years, 8 months","1 project","last used Mar 2019"]},{"name":"Uberspace","level":"Basic exposure","keywords":["2 years, 8 months","1 project","last used Mar 2019"]},{"name":"Google Cloud","level":"Practical experience","keywords":["2 years, 4 months","1 project","last used Sep 2023"]},{"name":"Hasura","level":"Practical experience","keywords":["2 years, 4 months","1 project","last used Sep 2023"]},{"name":"Testing-Library","level":"Practical experience","keywords":["2 years, 4 months","1 project","last used Sep 2023"]},{"name":"Vercel","level":"Practical experience","keywords":["2 years, 4 months","1 project","last used Sep 2023"]},{"name":"Cypress","level":"Basic exposure","keywords":["1 year, 6 months","1 project","last used Apr 2020"]},{"name":"Storybook","level":"Basic exposure","keywords":["1 year, 6 months","1 project","last used Apr 2020"]},{"name":"Python","level":"Basic exposure","keywords":["2 months","2 projects","last used Jan 2018"]},{"name":"Java","level":"Basic exposure","keywords":["8 months","1 project","last used Aug 2012"]},{"name":"PHP","level":"Basic exposure","keywords":["3 months","1 project","last used Jun 2018"]},{"name":"Wordpress","level":"Basic exposure","keywords":["3 months","1 project","last used Jun 2018"]},{"name":"MQTT","level":"Basic exposure","keywords":["1 month","1 project","last used Jan 2018"]}]}