{"$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":"Freelance full stack developer working remotely across web applications, product engineering, and infrastructure, with additional investment in open source. Focus areas include 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":{"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"}]},"awards":[{"title":"Grimme Online Award (nominated)","date":"2020-06-25","summary":"Bee sensor stories","awarder":"Grimme-Institut","url":"https://www.grimme-online-award.de/archiv/2020/nominierte/n/d/bienenlive-folge-den-koeniginnen"},{"title":"German Reporter Award 2019","date":"2019-12-02","summary":"Bee sensor stories","awarder":"Reporter-Forum e. V.","url":"https://de.wikipedia.org/wiki/Deutscher_Reporter:innenpreis#Deutscher_Reporterpreis_2019"},{"title":"German Reporter Award 2017 (nominated)","date":"2017-12-11","summary":"Dairy cow sensor stories","awarder":"Reporter-Forum e. V.","url":"https://archiv.reporter-forum.de/index.php%3Fid=231.html#c2904"},{"title":"Winner of MIZ Formatfestival 2015","summary":"#ursuppe","date":"2015-11-12","awarder":"MIZ Babelsberg","url":"https://www.mabb.de/uber-die-mabb/aktuelles/veranstaltungen-details/miz-formatfestival-2015-preisverleihung-im-miz-babelsberg"}],"languages":[{"language":"German","fluency":"Native Speaker"},{"language":"English","fluency":"Business Fluent"},{"language":"Spanish","fluency":"Fluent"}],"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":[]}],"projects":[{"id":"git-subtrees","name":"git-subtrees","entity":"Robert Schäfer","codeVisibility":"open-source","roles":["Development"],"startDate":"2026-09-11","keywords":["Bash","Bats","Nix"],"description":"A Git extension that keeps multiple git subtrees in a monorepo in sync with their own repositories. It needs no config file: every remote named after a folder path is a subtree. The documentation consists of tested example scenarios.","url":"https://github.com/roschaefer/git-subtrees","type":"volunteering"},{"id":"remote-telescope-platform","name":"Remote observatory","roles":["Full Stack Developer"],"startDate":"2026-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":"experience","entity":"Bo***bH","redacted":true},{"id":"ai-interview-platform","name":"AI interview platform","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":"This SvelteKit application for AI-assisted interviews and editorial publishing replaces brittle infrastructure spread across Airtable, Voiceflow, and additional custom services with a single serverless application. Using the built-in workflows of ElevenLabs AI Agents significantly reduces maintenance overhead and complexity while improving the phone agent's response time by several seconds, which is crucial for a good user experience.","type":"experience","entity":"ta***bH","redacted":true},{"id":"hledger-document-check","name":"hledger-document-check","entity":"Robert Schäfer","codeVisibility":"open-source","roles":["Development"],"startDate":"2026-03-19","keywords":["Rust","hledger","Cucumber"],"description":"A Plain Text Accounting command-line tool for checking documents with hledger. It reconciles transactions that require documentation with files on disk, detects missing or unbooked documents, checks amount plausibility, and generates an enriched journal for Fava's document view.","url":"https://github.com/roschaefer/hledger-document-check","type":"volunteering"},{"id":"hledger-elster","name":"hledger-elster","entity":"Robert Schäfer","codeVisibility":"open-source","roles":["Development"],"startDate":"2026-03-19","keywords":["Rust","hledger","Cucumber"],"description":"A Plain Text Accounting command-line tool for hledger that automates German tax filing. It reads transactions from the journal and generates traceable exports for the corresponding forms on ELSTER.de. The exports are available in CSV and XLSX format and include derivations that tax authorities can audit.","url":"https://github.com/roschaefer/hledger-elster","type":"volunteering"},{"id":"roschaefer-portfolio","name":"roschaefer.de","entity":"Robert Schäfer","codeVisibility":"open-source","roles":["Design and Development"],"startDate":"2026-03-16","keywords":["TypeScript","Svelte","SvelteKit","Tailwind","Paraglide","Typst","Vitest","Playwright","Netlify"],"description":"Personal portfolio website and 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":"volunteering"},{"id":"foss-social-network-infra-migration","name":"FOSS social network","codeVisibility":"open-source","roles":["Infrastructure Engineer"],"startDate":"2024-10-01","endDate":"2025-11-30","keywords":["TypeScript","Vue","Nuxt","Terraform","sops","Kubernetes","Hetzner","S3","Digital Ocean","Docker"],"description":"Migrated assets from a Kubernetes volume to S3-compatible object storage to reduce deployment complexity and cost. Rebuilt the infrastructure with Terraform and sops, and moved from a managed Kubernetes cluster on Digital Ocean to a self-hosted Kubernetes cluster on Hetzner, cutting monthly costs by 80%.","type":"experience","entity":"bu***V.","redacted":true},{"id":"entrepreneur-social-platform","name":"Founder network","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, the delivery and infrastructure architecture was fundamentally reworked after deployments had previously been performed manually via a remote desktop on the target server, regularly causing downtime. Moving the project to a self-managed Kubernetes setup on Hetzner with Terraform gave every developer production-like test environments for their own branches while keeping operating costs extremely low at under 20 euros per month.","type":"experience","entity":"***","redacted":true},{"id":"audience-engagement-platform","name":"Newsroom dialog","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, the Ruby on Rails application 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.","type":"experience","entity":"ta***bH","redacted":true},{"id":"automotive-price-comparison","name":"Auto parts price comparison","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, an Electron desktop application was migrated 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.","type":"experience","entity":"au***bH","redacted":true},{"id":"retail-website-relaunch","name":"SvelteKit relaunch","codeVisibility":"closed-source","roles":["Full Stack Developer"],"startDate":"2021-12-09","endDate":"2023-06-28","keywords":["TypeScript","Svelte","SvelteKit","HyGraph","Netlify","Serverless"],"description":"Rebuilt a retail client's website 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.","type":"experience","entity":"Jo***er","redacted":true},{"id":"course-booking-system","name":"Booking system for course providers","codeVisibility":"closed-source","roles":["Full Stack Developer"],"startDate":"2020-08-11","endDate":"2023-05-02","keywords":["TypeScript","Netlify","Vue","Nuxt","HyGraph"],"description":"Built a custom booking system for a course provider's sewing classes and integrated it into their website. Courses for adults, teens, and children can be managed online, including registration and waiting lists.","type":"experience","entity":"Jo***er","redacted":true},{"id":"continuing-education-booking-system","name":"Booking system for continuing education providers","codeVisibility":"closed-source","roles":["Full Stack Developer"],"startDate":"2021-05-12","endDate":"2022-12-10","keywords":["TypeScript","Netlify","Svelte","SvelteKit","Tailwind"],"description":"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.","type":"experience","entity":"Jo***er","redacted":true},{"id":"holiday-apartment-booking-site","name":"Booking website for a holiday apartment","codeVisibility":"closed-source","roles":["Full Stack Developer"],"startDate":"2022-01-28","endDate":"2022-08-09","keywords":["TypeScript","Netlify","Svelte","SvelteKit","Tailwind"],"description":"Built a booking website with calendar integration for a holiday apartment on Norderney. Day-by-day availability is maintained in Google Calendar and synchronized to the site via Google APIs.","type":"experience","entity":"Jo***er","redacted":true},{"id":"systems-development-and-framework","entity":"Hochschule für Technik und Wirtschaft Berlin","name":"Systems-Development and Framework","codeVisibility":"open-source","roles":["University Lecturer"],"startDate":"2019-10-31","endDate":"2021-03-31","keywords":["JavaScript","Vue","Apollo GraphQL","Neo4J","Nuxt","Vuetify","Tailwind"],"description":"Owned 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","location":"Berlin, Germany","type":"mentoring"},{"id":"open-source-social-network","name":"FOSS social network","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"],"description":"Technical Lead work on product architecture, GraphQL APIs, production use of Neo4J, and Kubernetes-based operations for a community-built open-source social network that offers communities a privacy-friendly alternative to large platforms. The project grew to around 80 code contributors on GitHub; newcomers were onboarded through GitHub, Discord, and online pair programming, mentored directly, and most contributions were reviewed. Neo4J ran in production as the primary database to model the network's social graph directly.","type":"experience","entity":"Hu***bH","redacted":true},{"id":"find-open-source-contributors-vuejs-berlin","name":"Find open-source contributors in online learner communities","entity":"Vue.js Berlin Meetup","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","startDate":"2019-06-20","endDate":"2019-06-20","roles":["Speaker"],"url":"https://www.youtube.com/watch?v=kGwGX6R70H4","type":"presentation"},{"id":"sensor-storytelling-bees","name":"Bee sensor stories","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, the platform was reused and extended 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.","type":"experience","entity":"ta***bH","redacted":true},{"id":"rundfunk-mitbestimmen-project","name":"Rundfunk mitbestimmen","entity":"Rundfunk mitbestimmen e.V.","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":"volunteering"},{"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","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.","type":"experience","entity":"So***AG","redacted":true},{"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":"Smart bathroom mirror","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":"experience","entity":"ta***bH","redacted":true},{"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."},{"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":"Dairy cow sensor stories","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, a journalistic format generated reports automatically from sensor data collected from three dairy cows. The project received broad media attention with more than 63 reports and features.","entity":"ta***bH","links":[{"label":"Spiegel Online","url":"https://www.spiegel.de/netzwelt/web/superkuehe-sensorjournalismus-mit-milchkuehen-a-1165241.html","kind":"press"}],"type":"experience","redacted":true},{"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":"Smart shopping cart","roles":["IoT Developer"],"startDate":"2017-06-01","endDate":"2017-06-30","keywords":["Ember","Python"],"description":"Rapid IoT prototype of a smart shopping cart.","type":"experience","entity":"ta***bH","redacted":true},{"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."},{"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."},{"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."},{"id":"protothon-podcast","name":"Protothon","entity":"MIZ Babelsberg","roles":["Hackathon Coach"],"startDate":"2016-09-01","endDate":"2016-09-30","keywords":["JavaScript"],"description":"Coached a team at MIZ Babelsberg's Protothon rapid-prototyping hackathon that built an interactive, decision-based podcast prototype.","url":"https://www.miz-babelsberg.de/startseite.html","location":"Potsdam, Brandenburg, Germany","type":"mentoring"},{"id":"protothon-music-player","name":"Protothon","entity":"MIZ Babelsberg","roles":["Hackathon Coach"],"startDate":"2016-08-01","endDate":"2016-08-31","keywords":["JavaScript"],"description":"Coached a team at MIZ Babelsberg's Protothon rapid-prototyping hackathon that built a location-aware music player prototype.","url":"https://www.miz-babelsberg.de/startseite.html","location":"Potsdam, Brandenburg, Germany","type":"mentoring"},{"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":"mentoring"},{"id":"supply-chain-risk-research","name":"Automated Risk Analysis in Supply Chains","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.","location":"Belfast, United Kingdom","type":"experience","entity":"***","redacted":true},{"id":"sports-association-webapp","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":"First developer to introduce an automated test environment for this web application for officials, referees, and coaches.","location":"Bern, Switzerland","type":"experience","entity":"OX***AG","redacted":true},{"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":"experience"}],"skills":[{"name":"TypeScript","level":"Long-term experience","keywords":["6½ years","11 projects","active now"]},{"name":"Docker","level":"Long-term experience","keywords":["8 years","7 projects","active now"]},{"name":"Vue","level":"Long-term experience","keywords":["7 years","7 projects","active now"]},{"name":"Nuxt","level":"Long-term experience","keywords":["6½ years","5 projects","active now"]},{"name":"Ruby","level":"Long-term experience","keywords":["9¼ years","5 projects","last used Apr 2025"]},{"name":"Tailwind","level":"Proficient use","keywords":["4½ years","7 projects","active now"]},{"name":"Ruby on Rails","level":"Long-term experience","keywords":["8¾ years","5 projects","last used Apr 2025"]},{"name":"PostgreSQL","level":"Proficient use","keywords":["5 years","4 projects","active now"]},{"name":"Netlify","level":"Proficient use","keywords":["3½ years","6 projects","active now"]},{"name":"Digital Ocean","level":"Proficient use","keywords":["7 years","3 projects","last used 11 months ago"]},{"name":"Sentry","level":"Proficient use","keywords":["5¾ years","2 projects","active now"]},{"name":"RSpec","level":"Long-term experience","keywords":["7½ years","4 projects","last used Apr 2025"]},{"name":"Cucumber","level":"Proficient use","keywords":["3 years","6 projects","active now"]},{"name":"Svelte","level":"Proficient use","keywords":["2¾ years","5 projects","active now"]},{"name":"SvelteKit","level":"Proficient use","keywords":["2¾ years","5 projects","active now"]},{"name":"Apollo GraphQL","level":"Long-term experience","keywords":["5¾ years","4 projects","last used Jun 2025"]},{"name":"Jest","level":"Proficient use","keywords":["5 years","3 projects","last used Jun 2025"]},{"name":"Terraform","level":"Proficient use","keywords":["2¼ years","3 projects","active now"]},{"name":"Serverless","level":"Proficient use","keywords":["2¼ years","2 projects","active now"]},{"name":"Kubernetes","level":"Proficient use","keywords":["3 years","3 projects","last used 11 months ago"]},{"name":"Ansible","level":"Practical experience","keywords":["5¼ years","1 project","last used Apr 2025"]},{"name":"Postmark","level":"Practical experience","keywords":["5¼ years","1 project","last used Apr 2025"]},{"name":"Stimulus","level":"Practical experience","keywords":["5¼ years","1 project","last used Apr 2025"]},{"name":"Playwright","level":"Practical experience","keywords":["8 months","3 projects","active now"]},{"name":"Auth0","level":"Proficient use","keywords":["5 years","2 projects","last used Sep 2023"]},{"name":"JavaScript","level":"Basic exposure","keywords":["2¾ years","5 projects","last used Mar 2021"]},{"name":"hledger","level":"Practical experience","keywords":["8 months","2 projects","active now"]},{"name":"Rust","level":"Practical experience","keywords":["8 months","2 projects","active now"]},{"name":"Vitest","level":"Practical experience","keywords":["8 months","2 projects","active now"]},{"name":"AWS","level":"Practical experience","keywords":["8 months","1 project","active now"]},{"name":"Better Auth","level":"Practical experience","keywords":["8 months","1 project","active now"]},{"name":"Drizzle ORM","level":"Practical experience","keywords":["8 months","1 project","active now"]},{"name":"ElevenLabs","level":"Practical experience","keywords":["8 months","1 project","active now"]},{"name":"Fly.io","level":"Practical experience","keywords":["8 months","1 project","active now"]},{"name":"Infisical","level":"Practical experience","keywords":["8 months","1 project","active now"]},{"name":"Neon DB","level":"Practical experience","keywords":["8 months","1 project","active now"]},{"name":"NINA","level":"Practical experience","keywords":["8 months","1 project","active now"]},{"name":"Paraglide","level":"Practical experience","keywords":["8 months","1 project","active now"]},{"name":"Tailscale","level":"Practical experience","keywords":["8 months","1 project","active now"]},{"name":"Typst","level":"Practical experience","keywords":["8 months","1 project","active now"]},{"name":"Vuetify","level":"Proficient use","keywords":["2½ years","2 projects","last used Jun 2025"]},{"name":"Hetzner","level":"Practical experience","keywords":["1½ years","2 projects","last used 11 months ago"]},{"name":"Bash","level":"Practical experience","keywords":["2 months","1 project","active now"]},{"name":"Bats","level":"Practical experience","keywords":["2 months","1 project","active now"]},{"name":"Nix","level":"Practical experience","keywords":["2 months","1 project","active now"]},{"name":"HyGraph","level":"Proficient use","keywords":["3 years","2 projects","last used Jun 2023"]},{"name":"Ember","level":"Basic exposure","keywords":["2¾ years","2 projects","last used Mar 2019"]},{"name":"S3","level":"Practical experience","keywords":["1¼ years","1 project","last used 11 months ago"]},{"name":"sops","level":"Practical experience","keywords":["1¼ years","1 project","last used 11 months ago"]},{"name":"Neo4J","level":"Basic exposure","keywords":["2½ years","2 projects","last used Mar 2021"]},{"name":"D3","level":"Basic exposure","keywords":["2¾ years","1 project","last used Mar 2019"]},{"name":"Highcharts","level":"Basic exposure","keywords":["2¾ years","1 project","last used Mar 2019"]},{"name":"Uberspace","level":"Basic exposure","keywords":["2¾ years","1 project","last used Mar 2019"]},{"name":"Authentik","level":"Practical experience","keywords":["1 year","1 project","last used Jun 2025"]},{"name":"Helm","level":"Practical experience","keywords":["1 year","1 project","last used Jun 2025"]},{"name":"Vike","level":"Practical experience","keywords":["1 year","1 project","last used Jun 2025"]},{"name":"Google Cloud","level":"Practical experience","keywords":["2¼ years","1 project","last used Sep 2023"]},{"name":"Hasura","level":"Practical experience","keywords":["2¼ years","1 project","last used Sep 2023"]},{"name":"Testing-Library","level":"Practical experience","keywords":["2¼ years","1 project","last used Sep 2023"]},{"name":"Vercel","level":"Practical experience","keywords":["2¼ years","1 project","last used Sep 2023"]},{"name":"Cypress","level":"Basic exposure","keywords":["1½ years","1 project","last used Apr 2020"]},{"name":"Storybook","level":"Basic exposure","keywords":["1½ years","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"]}]}