[{"data":1,"prerenderedAt":375},["ShallowReactive",2],{"slug-content-en-\u002Fexperience\u002Ffreelance":3},{"kind":4,"item":5,"categories":61,"projects":199},"experience",{"id":6,"title":7,"body":8,"company":19,"dateEnd":20,"dateStart":21,"description":14,"extension":22,"featured":23,"highlights":24,"location":27,"meta":28,"navigation":29,"path":30,"projects":31,"role":37,"seo":38,"sideGig":29,"stem":39,"tags":40,"__hash__":60},"experience_en\u002Fexperience\u002Ffreelance.md","Freelance",{"type":9,"value":10,"toc":15},"minimark",[11],[12,13,14],"p",{},"I started freelancing while still in secondary school to earn some extra income alongside my studies.\nOne of my first projects is one I still maintain and develop to this day.",{"title":16,"searchDepth":17,"depth":17,"links":18},"",2,[],"Self-employed","9999-99","2019-11","md",false,[25,26],"Development of web applications and APIs for client projects","Drafting requirement and specification documents in coordination with clients",null,{},true,"\u002Fexperience\u002Ffreelance",[32,33,34,35,36],"chi-costadelsol.com","richter-historica.de","XML Transformer","mysql-exporter","FtpToGit","Freelance Software Developer",{"description":14},"experience\u002Ffreelance",[41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59],"php","laravel","symfony","shopware","vuejs","nuxt","javascript","typescript","linux","rest","html5","css3","tailwindcss","docker","git","nodejs","cloudflare","nginx","cicd","o-AxT-KQmuWX2KPjLWDt_MAQgoF4x8BqSp47Z_0RrsM",[62,71,89,105,131,143,152,160],{"name":63,"items":64},"Databases",[65,68],{"slug":66,"name":67},"sql","SQL (MySQL, MariaDB)",{"slug":69,"name":70},"sqlite","SQLite",{"name":72,"items":73},"Frontend",[74,76,78,80,83,86],{"slug":51,"name":75},"HTML5",{"slug":52,"name":77},"CSS3",{"slug":53,"name":79},"Tailwind CSS",{"slug":81,"name":82},"bootstrap","Bootstrap",{"slug":84,"name":85},"uikit","UIkit",{"slug":87,"name":88},"extjs","Ext JS",{"name":90,"items":91},"JavaScript Ecosystem",[92,94,96,98,100,102],{"slug":47,"name":93},"JavaScript",{"slug":48,"name":95},"TypeScript",{"slug":56,"name":97},"Node.js",{"slug":45,"name":99},"Vue.js",{"slug":46,"name":101},"Nuxt.JS",{"slug":103,"name":104},"deno","Deno",{"name":106,"items":107},"Backend",[108,110,112,114,117,120,123,126,128],{"slug":41,"name":109},"PHP",{"slug":42,"name":111},"Laravel",{"slug":43,"name":113},"Symfony",{"slug":115,"name":116},"laminas","Laminas",{"slug":118,"name":119},"mezzio","Mezzio",{"slug":121,"name":122},"zend","Zend Framework",{"slug":124,"name":125},"wordpress","WordPress",{"slug":44,"name":127},"Shopware",{"slug":129,"name":130},"spryker","Spryker",{"name":132,"items":133},"Mobile",[134,137,140],{"slug":135,"name":136},"dart","Dart",{"slug":138,"name":139},"flutter","Flutter",{"slug":141,"name":142},"android","Android",{"name":144,"items":145},"Other Languages",[146,149],{"slug":147,"name":148},"java","Java",{"slug":150,"name":151},"python","Python",{"name":153,"items":154},"Operating Systems",[155,157],{"slug":49,"name":156},"Linux",{"slug":158,"name":159},"windows","Windows",{"name":161,"items":162},"Other",[163,165,167,170,173,176,178,180,183,186,189,192,194,197],{"slug":55,"name":164},"Git",{"slug":54,"name":166},"Docker",{"slug":168,"name":169},"jenkins","Jenkins",{"slug":171,"name":172},"jvm","JVM",{"slug":174,"name":175},"aws","AWS",{"slug":57,"name":177},"Cloudflare",{"slug":58,"name":179},"Nginx",{"slug":181,"name":182},"redis","Redis",{"slug":184,"name":185},"networking","Networking",{"slug":187,"name":188},"rabbitmq","RabbitMQ",{"slug":190,"name":191},"oidc","OIDC",{"slug":50,"name":193},"REST",{"slug":195,"name":196},"terraform","Terraform",{"slug":59,"name":198},"CI\u002FCD",[200,251,281,307,344],{"id":201,"title":32,"body":202,"dateEnd":20,"dateStart":241,"description":242,"extension":22,"featuredInCv":29,"link":243,"meta":244,"navigation":29,"path":245,"repo":27,"seo":246,"stem":247,"tags":248,"__hash__":250},"projects_en\u002Fprojects\u002Fchi-costadelsol.md",{"type":9,"value":203,"toc":236},[204,209,212,219,223,226,230],[205,206,208],"h2",{"id":207},"about-the-project","About the Project",[12,210,211],{},"Marketing and property website for a Spanish real estate agent operating on the Costa del Sol.",[12,213,214,215,218],{},"A Symfony backend was developed to handle data storage and the import of data from an XML feed provided by Spain's largest real estate portal.",[216,217],"br",{},"\nThe frontend was built with Nuxt.JS and Tailwind.",[205,220,222],{"id":221},"my-role","My Role",[12,224,225],{},"I built the project from the ground up as a full-stack developer and was responsible for the entire technical planning and implementation in collaboration with the client.",[205,227,229],{"id":228},"import","Import",[12,231,232,233,235],{},"The import is triggered asynchronously via RabbitMQ as a queue system, either directly by the provider or manually with a custom XML file.",[216,234],{},"\nThe import progress is displayed and updated live in the back office.",{"title":16,"searchDepth":17,"depth":17,"links":237},[238,239,240],{"id":207,"depth":17,"text":208},{"id":221,"depth":17,"text":222},{"id":228,"depth":17,"text":229},"2018-03","Website for a Spanish real estate agent on the Costa del Sol.","https:\u002F\u002Fchi-costadelsol.com",{},"\u002Fprojects\u002Fchi-costadelsol",{"title":32,"description":242},"projects\u002Fchi-costadelsol",[41,43,46,47,249,187,84,50,52,45,54,58,184,55,49],"tailwind","QWwGP6Ays966ANL9t83lxbc_7sURqAq0209qRFzY4SY",{"id":252,"title":33,"body":253,"dateEnd":272,"dateStart":273,"description":274,"extension":22,"featuredInCv":23,"link":27,"meta":275,"navigation":29,"path":276,"repo":27,"seo":277,"stem":278,"tags":279,"__hash__":280},"projects_en\u002Fprojects\u002Frichter-historica.md",{"type":9,"value":254,"toc":269},[255,257,260,266],[205,256,208],{"id":207},[12,258,259],{},"An online shop specializing in the sale of military antiques.",[12,261,262,263,265],{},"The project was built with Shopware 6, with a custom theme developed according to the client's wishes.",[216,264],{},"\nSince the shop mainly sells one-of-a-kind items, a reservation feature was also built at the client's request, giving customers enough time to complete their order without worrying that the item might be bought by another customer in the meantime.",[12,267,268],{},"Additionally, a bulk-publishing feature for listings was developed, allowing my client to publish many items at once without having to approve each item individually.",{"title":16,"searchDepth":17,"depth":17,"links":270},[271],{"id":207,"depth":17,"text":208},"2023-06","2020-06","Online shop specializing in the sale of military antiques.",{},"\u002Fprojects\u002Frichter-historica",{"title":33,"description":274},"projects\u002Frichter-historica",[44,41,66,51,52,54,55],"eNlZQlf-ch2lwm8KdYsn7iCb8ASTgPLOsECjEinTsfc",{"id":282,"title":34,"body":283,"dateEnd":299,"dateStart":299,"description":300,"extension":22,"featuredInCv":23,"link":27,"meta":301,"navigation":29,"path":302,"repo":27,"seo":303,"stem":304,"tags":305,"__hash__":306},"projects_en\u002Fprojects\u002Fxml-transformer.md",{"type":9,"value":284,"toc":296},[285,287,290,293],[205,286,208],{"id":207},[12,288,289],{},"This project was referred to me by a web agency I'm friends with and deals with the transformation of\nXML structures. The tool converts attribute-oriented XML files into an element-oriented structure by\ndynamically converting all attributes of an XML tag into child elements of the respective XML element.",[12,291,292],{},"The application was developed with a particular focus on performance and resource efficiency. By using\nstreams, memory usage was kept low and large amounts of data could be processed quickly. This enabled\nefficient transformation even of large XML files without high system requirements.",[12,294,295],{},"Laravel Lumen was used as the technical foundation, a stripped-down version of Laravel optimized for console applications.",{"title":16,"searchDepth":17,"depth":17,"links":297},[298],{"id":207,"depth":17,"text":208},"2020-03","A tool that converts attribute-oriented XML files into element-oriented ones.",{},"\u002Fprojects\u002Fxml-transformer",{"title":34,"description":300},"projects\u002Fxml-transformer",[41,42,55],"vsxcPNC2l6dsyaa1OPLbjUyM5Z4y1vD9AW2WbOVK4Gw",{"id":308,"title":35,"body":309,"dateEnd":336,"dateStart":336,"description":337,"extension":22,"featuredInCv":23,"link":27,"meta":338,"navigation":29,"path":339,"repo":27,"seo":340,"stem":341,"tags":342,"__hash__":343},"projects_en\u002Fprojects\u002Fmysql-exporter.md",{"type":9,"value":310,"toc":332},[311,313,319,323],[205,312,208],{"id":207},[12,314,315,316,318],{},"I was commissioned by a web agency to develop a tool that helps them clone the database from a managed web server (without shell access) to a local server.",[216,317],{},"\nAt the agency's request, this was built with Laravel Lumen, a stripped-down version of Laravel optimized for console applications.",[205,320,322],{"id":321},"how-it-works","How It Works",[12,324,325,326,328,329,331],{},"The tool can be configured for any client server, with a list of excluded tables.",[216,327],{},"\nWhen run, the application connects to the client's server and creates a PHP script that exports the database there to a predefined path according to the configuration.",[216,330],{},"\nThis export is then downloaded and imported on the local server, after which both the script and the export are deleted from the client's server again.",{"title":16,"searchDepth":17,"depth":17,"links":333},[334,335],{"id":207,"depth":17,"text":208},{"id":321,"depth":17,"text":322},"2020-01","Laravel console application for cloning a remote database.",{},"\u002Fprojects\u002Fmysql-exporter",{"title":35,"description":337},"projects\u002Fmysql-exporter",[41,42,66,55],"foKHnlWX46yq5UVmrzI4IzWtQ51F9AwdDl4TpXs-guk",{"id":345,"title":36,"body":346,"dateEnd":367,"dateStart":367,"description":368,"extension":22,"featuredInCv":23,"link":27,"meta":369,"navigation":29,"path":370,"repo":27,"seo":371,"stem":372,"tags":373,"__hash__":374},"projects_en\u002Fprojects\u002Fftptogit.md",{"type":9,"value":347,"toc":363},[348,350,355,357],[205,349,208],{"id":207},[12,351,352,353,318],{},"I was commissioned by a web agency to develop a tool that helps them log configuration changes on client servers.",[216,354],{},[205,356,322],{"id":321},[12,358,359,360,362],{},"The tool can be configured for any number of client servers, with individual glob-style exclude lists, similar to a .gitignore file.\nAfter connecting to the client's server, the files are checked for changes and then logged in a local Git repository, which is then pushed to a remote Git server.",[216,361],{},"\nThis way, Git's excellent version control is used to log every configuration change, which greatly simplifies troubleshooting in everyday agency work.",{"title":16,"searchDepth":17,"depth":17,"links":364},[365,366],{"id":207,"depth":17,"text":208},{"id":321,"depth":17,"text":322},"2019-12","Laravel console application for monitoring a remote FTP host.",{},"\u002Fprojects\u002Fftptogit",{"title":36,"description":368},"projects\u002Fftptogit",[41,42,55],"ttr-GHptjk2BnywsGNPTyl8umNAT_qHOoEdzqsFU3d4",1782416851469]