[{"data":1,"prerenderedAt":1232},["ShallowReactive",2],{"projects-all":3},[4,92,162,194,248,288,320,354,404,1073,1112,1155,1192],{"id":5,"title":6,"body":7,"date":78,"dateFrom":79,"dateTo":79,"description":80,"extension":81,"image":82,"meta":83,"navigation":86,"path":87,"published":86,"seo":88,"snippet":89,"stem":90,"tags":78,"__hash__":91},"projects\u002Fprojects\u002Fnuxt-schema-form.md","Nuxt Schema Form",{"type":8,"value":9,"toc":75},"minimark",[10,20,23,36,39,71],[11,12,13,19],"p",{},[14,15,6],"a",{":rel":16,":target":17,"href":18},"noopener","_blank","https:\u002F\u002Fgithub.com\u002FLiamEderzeel\u002Fnuxt-schema-form"," is a Nuxt module for runtime form generation. You describe a form as JSON Schema, and the module builds the fields, validation and layout at runtime and renders them with Nuxt UI components. The first release, 0.1.0, came out in October 2026.",[11,21,22],{},"Forms and data structures created by users came up again and again in my work for different employers. I started this package to bring together what I learned along the way, and hopefully to make the next project like that a bit easier, for me and maybe for others too.",[11,24,25,26,30,31,35],{},"Try the ",[14,27,29],{":rel":16,":target":17,"href":28},"https:\u002F\u002Fliamederzeel.github.io\u002Fnuxt-schema-form\u002Fdemo","live demo",", where the form updates as you edit the schema, or read the ",[14,32,34],{":rel":16,":target":17,"href":33},"https:\u002F\u002Fliamederzeel.github.io\u002Fnuxt-schema-form\u002Fdocs\u002Fgetting-started","documentation",".",[11,37,38],{},"Install it in a Nuxt project with:",[40,41,46],"pre",{"className":42,"code":43,"language":44,"meta":45,"style":45},"language-bash shiki shiki-themes github-light github-dark","npx nuxi module add @ederzeel\u002Fnuxt-schema-form\n","bash","",[47,48,49],"code",{"__ignoreMap":45},[50,51,54,58,62,65,68],"span",{"class":52,"line":53},"line",1,[50,55,57],{"class":56},"sScJk","npx",[50,59,61],{"class":60},"sZZnC"," nuxi",[50,63,64],{"class":60}," module",[50,66,67],{"class":60}," add",[50,69,70],{"class":60}," @ederzeel\u002Fnuxt-schema-form\n",[72,73,74],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":45,"searchDepth":76,"depth":76,"links":77},2,[],null,"2025-01-29","Nuxt Schema Form is a Nuxt module for runtime form generation. You describe a form as JSON Schema, and the module builds the fields, validation and layout at runtime and renders them with Nuxt UI components. The first release, 0.1.0, came out in October 2026.","md","\u002Fimages\u002Fprojects\u002Fnuxt-schema-form-cover.png",{"slug":84,"employer":85},"nuxt-schema-form","Personal Project",true,"\u002Fprojects\u002Fnuxt-schema-form",{"title":6,"description":80},"A Nuxt module that generates forms at runtime from JSON Schema, rendered with Nuxt UI components.","projects\u002Fnuxt-schema-form","a_miABJbR0MSZa0x5gABBdol9LWb12HAeyUKusYipR8",{"id":93,"title":94,"body":95,"date":78,"dateFrom":153,"dateTo":153,"description":154,"extension":81,"image":155,"meta":156,"navigation":86,"path":157,"published":86,"seo":158,"snippet":159,"stem":160,"tags":78,"__hash__":161},"projects\u002Fprojects\u002Ftmux-booster.md","Tmux Booster",{"type":8,"value":96,"toc":151},[97,105,113,120,148],[11,98,99,104],{},[14,100,94],{"href":101,"rel":102,"target":17},"https:\u002F\u002Fgithub.com\u002FLiamEderzeel\u002Ftmux-booster",[103],"nofollow"," is a small command-line tool for moving between projects in tmux. It lists your project directories in a fuzzy finder, and picking one switches to that project's tmux session, or creates the session first if it doesn't exist yet.",[11,106,107,108,112],{},"It grew out of the shell script from my article on ",[14,109,111],{"href":110},"\u002Farticles\u002Ftmux-project-laucher","building a tmux project launcher",". I rewrote it in Rust to make it a bit faster and easier to configure.",[11,114,115,116,119],{},"Projects can come from directories that hold projects, from direct project paths, or both. These can be set in a config file at ",[47,117,118],{},"~\u002F.config\u002Ftmux-booster\u002Fconfig.toml",", passed as command-line flags, or combined:",[40,121,123],{"className":42,"code":122,"language":44,"meta":45,"style":45},"tmux-booster -d ~\u002Fprojects -d ~\u002Fwork -p ~\u002Fdotfiles\n",[47,124,125],{"__ignoreMap":45},[50,126,127,130,134,137,139,142,145],{"class":52,"line":53},[50,128,129],{"class":56},"tmux-booster",[50,131,133],{"class":132},"sj4cs"," -d",[50,135,136],{"class":60}," ~\u002Fprojects",[50,138,133],{"class":132},[50,140,141],{"class":60}," ~\u002Fwork",[50,143,144],{"class":132}," -p",[50,146,147],{"class":60}," ~\u002Fdotfiles\n",[72,149,150],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":45,"searchDepth":76,"depth":76,"links":152},[],"2023-08-19","Tmux Booster is a small command-line tool for moving between projects in tmux. It lists your project directories in a fuzzy finder, and picking one switches to that project's tmux session, or creates the session first if it doesn't exist yet.","\u002Fimages\u002Ftmux-booster-cover.png",{"slug":129,"employer":85},"\u002Fprojects\u002Ftmux-booster",{"title":94,"description":154},"A tmux session launcher and switcher for jumping between projects, written in Rust.","projects\u002Ftmux-booster","Yz_VfxV2xPnZlHXMkmknhXovW5JSlYBefQZ1VVhOstw",{"id":163,"title":164,"body":165,"date":78,"dateFrom":184,"dateTo":184,"description":185,"extension":81,"image":186,"meta":187,"navigation":86,"path":189,"published":86,"seo":190,"snippet":191,"stem":192,"tags":78,"__hash__":193},"projects\u002Fprojects\u002Fwehaveanyspace.md","WehaveAnyspace",{"type":8,"value":166,"toc":181},[167,173,178],[11,168,169,172],{},[14,170,164],{":rel":16,":target":17,"href":171},"https:\u002F\u002Fwww.wehaveanyspace.com\u002F"," is een platform gemakelijk en snel kantoor ruimte kan vinden en vergelijken.",[174,175,177],"h2",{"id":176},"my-contribution","My Contribution",[11,179,180],{},"I worked as a full stack engeneer at we have any space in a small self managed multi role team. My role with in the team has a empises on backend, ci\u002Fcd, devops and sysops.",{"title":45,"searchDepth":76,"depth":76,"links":182},[183],{"id":176,"depth":76,"text":177},"2021-03-01","WehaveAnyspace is een platform gemakelijk en snel kantoor ruimte kan vinden en vergelijken.","\u002Fimages\u002Fprojects\u002Fwhas-cover.png",{"slug":188,"employer":164},"wehaveanyspace","\u002Fprojects\u002Fwehaveanyspace",{"title":164,"description":185},"A website for finding you next office","projects\u002Fwehaveanyspace","NfkEpMySURz72mZqtnJV3hATGgqnpHmWh8GGlAmFsfE",{"id":195,"title":196,"body":197,"date":78,"dateFrom":236,"dateTo":237,"description":238,"extension":81,"image":239,"meta":240,"navigation":86,"path":243,"published":86,"seo":244,"snippet":245,"stem":246,"tags":78,"__hash__":247},"projects\u002Fprojects\u002Fhearth.md","Hearth",{"type":8,"value":198,"toc":233},[199,205,213,221,228,230],[11,200,201,204],{},[14,202,196],{"href":203,":rel":16,":target":17},"https:\u002F\u002Fglobalgamejam.org\u002F2019\u002Fgames\u002Fhearth-1"," is a game made during the Global Game Jam 2019. It's a cooperative game about a family that has to survive through the night after a harsh wind swept away their home. You survive by keeping the hearthfire going and collecting fuel for it to burn. You have to work together to move the hearth as fuel nearby grows scarce.",[11,206,207,208,35],{},"You can download the game ",[14,209,212],{"href":210,"rel":211},"https:\u002F\u002Fggj.s3.amazonaws.com\u002Fgames\u002F2019\u002F01\u002F59258\u002Fexec\u002FNfABQ\u002FHearth.zip",[103],"here",[11,214,215,220],{},[216,217],"img",{"alt":218,"src":219},"Tutorial on how to interact with the world.","\u002Fimages\u002Fprojects\u002Fhearth\u002Fimage_1.jpg","\nTutorial on how to interact with the world.",[11,222,223,227],{},[216,224],{"alt":225,"src":226},"Tutorial on how to move the hearth.","\u002Fimages\u002Fprojects\u002Fhearth\u002Fimage_2.jpg","\nTutorial on how to move the hearth.",[174,229,177],{"id":176},[11,231,232],{},"I worked on a heat system for losing and gaining heat and making things pretty in Unity, but I mainly worked on glueing the game together by implementing code and assets from my team members.",{"title":45,"searchDepth":76,"depth":76,"links":234},[235],{"id":176,"depth":76,"text":177},"2019-01-25","2019-01-27","Hearth is a game made during the Global Game Jam 2019. It's a cooperative game about a family that has to survive through the night after a harsh wind swept away their home. You survive by keeping the hearthfire going and collecting fuel for it to burn. You have to work together to move the hearth as fuel nearby grows scarce.","\u002Fimages\u002Fprojects\u002Fhearth\u002Fcover.jpg",{"slug":241,"employer":242},"hearth","Global Game Jam 2019","\u002Fprojects\u002Fhearth",{"title":196,"description":238},"A cooperative local multiplayer game about a family that has to survive through a harsh winter night after the wind swept away their home.","projects\u002Fhearth","6zzUojIB8sa6peOhiCZ1eYcgbeo1-vt3JTaWxw7xsHI",{"id":249,"title":250,"body":251,"date":78,"dateFrom":277,"dateTo":278,"description":255,"extension":81,"image":279,"meta":280,"navigation":86,"path":283,"published":86,"seo":284,"snippet":285,"stem":286,"tags":78,"__hash__":287},"projects\u002Fprojects\u002Fisomatrix.md","Isomatrix",{"type":8,"value":252,"toc":274},[253,256,269,271],[11,254,255],{},"Isomatrix is a fast-paced endless runner, set in a colourful isometric world that rebuilds itself as you move. Dodge dangers and collect black matter to upgrade your player. Use your skills to rack up the highest score!",[11,257,258,259,264,265],{},"You can download the game for ",[14,260,263],{":target":17,"href":261,"rel":262},"https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.Strawbei.Isomatrix",[103],"Android"," and ",[14,266,268],{":target":17,"href":267,":rel":16},"https:\u002F\u002Fitunes.apple.com\u002Fus\u002Fapp\u002Fisomatrix\u002Fid1445541230?mt=8","iOS",[174,270,177],{"id":176},[11,272,273],{},"I worked on the grid system and implementation of the pathfinding, but also worked on implementation of android and iOS social features, in-app purchases, ads, effects and general optimisation for mobile performance.",{"title":45,"searchDepth":76,"depth":76,"links":275},[276],{"id":176,"depth":76,"text":177},"2018-01-01","2019-01-01","\u002Fimages\u002Fprojects\u002Fisomatrix\u002Fcover.jpg",{"slug":281,"employer":282},"isomatrix","Strawbei","\u002Fprojects\u002Fisomatrix",{"title":250,"description":255},"A fast-paced endless runner, set in a colourful isometric world.","projects\u002Fisomatrix","RgvmPkatQ3P78wpyTgbyXwsbZUlf2wh4DD5gIYuCqFA",{"id":289,"title":290,"body":291,"date":78,"dateFrom":277,"dateTo":310,"description":298,"extension":81,"image":311,"meta":312,"navigation":86,"path":315,"published":86,"seo":316,"snippet":317,"stem":318,"tags":78,"__hash__":319},"projects\u002Fprojects\u002Fmds.md","MDS",{"type":8,"value":292,"toc":308},[293,299,305],[11,294,295,298],{},[216,296],{"alt":45,"src":297},"\u002Fimages\u002Fprojects\u002Fmds\u002Fimage_1.jpg","\nA TV could be used as a board and smartphones the hand cards of a game.",[11,300,301,304],{},[216,302],{"alt":45,"src":303},"\u002Fimages\u002Fprojects\u002Fmds\u002Fimage_2.jpg","\nA laptop could be used by a game master to influance the game.",[11,306,307],{},"Multi Device Game Server or MDGS was my graduation project. While working on City of Shadows the team and I were thinking about changing the game so it can be played on a TV and controlled through smartphone. I felt this would be a great subject to explore and a great way to apply my knowledge of game development and web development at the same time. I wrote MDGS as a proof of concept together with a design document for the implementation of the game Fury of Dracula. The project taught me a lot about networking and the challenges online multiplayer brings to game development.",{"title":45,"searchDepth":76,"depth":76,"links":309},[],"2018-05-01","\u002Fimages\u002Fprojects\u002Fmds\u002Fcover.jpg",{"slug":313,"employer":314},"mds","HKU","\u002Fprojects\u002Fmds",{"title":290,"description":298},"A lib for connecting PC's and Smartphones to your game","projects\u002Fmds","a48-p6cewWv3EenWVGnK4lS3EkfhCav9tR3W6A4KUmc",{"id":321,"title":322,"body":323,"date":78,"dateFrom":344,"dateTo":345,"description":327,"extension":81,"image":346,"meta":347,"navigation":86,"path":349,"published":86,"seo":350,"snippet":351,"stem":352,"tags":78,"__hash__":353},"projects\u002Fprojects\u002FStraatje.md","Straatje",{"type":8,"value":324,"toc":341},[325,328,331,336,338],[11,326,327],{},"Straatje is a project in collaboration with Witteveen+Bos and Gemeente Utrecht (Municipality of Utrecht). In Straatje the player gets the same tools as Witteveen+Bos when building the new Croeselaan. There are three main pillars the player needs to keep in mind: cost, sustainability and infrastructure.",[11,329,330],{},"The player has a fixed budget of 1.5 million euros to renovate the Croeselaan, keeping within budget satisfies the Cost pillar. Sustainability is an important element of the new Croeselaan as it aims to be the most sustainable street in the city of Utrecht. But the more sustainable the solution, the higher the costs. The last pillar is Infrastructure. Since the headquarters of Rabobank (one of the largest Dutch banks) is located on the Croeselaan with many employees, , infrastructure is very important. All Rabobank’s employees need to be able to travel to and from work easily.",[11,332,333],{},[216,334],{"alt":45,"src":335},"\u002Fimages\u002Fprojects\u002Fstraatje\u002Fimage_1.jpg",[174,337,177],{"id":176},[11,339,340],{},"My main contribution in this project was developing a grid system on which the players could place different types of tiles and assets. I also implemented pathfinding for the cars and wrote a lightweight thread pool for improved mobile performance.",{"title":45,"searchDepth":76,"depth":76,"links":342},[343],{"id":176,"depth":76,"text":177},"2017-01-01","2017-05-01","\u002Fimages\u002Fprojects\u002Fstraatje\u002Fcover.jpg",{"slug":348,"employer":314},"straatje","\u002Fprojects\u002Fstraatje",{"title":322,"description":327},"A game for designing Utrecht’s most sustainable street","projects\u002FStraatje","W7h0hUWCKoKAtSPCxBcz_W7INU204BgC8DCcq_zA1As",{"id":355,"title":356,"body":357,"date":78,"dateFrom":395,"dateTo":344,"description":364,"extension":81,"image":396,"meta":397,"navigation":86,"path":399,"published":86,"seo":400,"snippet":401,"stem":402,"tags":78,"__hash__":403},"projects\u002Fprojects\u002Ftrycoding.md","Try Coding",{"type":8,"value":358,"toc":392},[359,365,371,378,384,386,389],[11,360,361,364],{},[216,362],{"alt":45,"src":363},"\u002Fimages\u002Fprojects\u002Ftry-coding\u002Fimage_1.jpg","\nLevel editer.",[11,366,367,370],{},[216,368],{"alt":45,"src":369},"\u002Fimages\u002Fprojects\u002Ftry-coding\u002Fimage_2.jpg","\nMy desk at TryCatch Media.",[11,372,373,377],{},[14,374,376],{":rel":16,":target":17,"href":375},"https:\u002F\u002Fwww.trycoding.net\u002F","TryCoding"," is a web based game to help teach young people how to write code. This is done in a playful way by introducing the players bit by bit to programming principles, while playing through an exciting story.",[379,380,381],"blockquote",{},[11,382,383],{},"video here",[174,385,177],{"id":176},[11,387,388],{},"I worked on TryCoding as an intern at TryCatch Media in South Korea. My role was setting up the project from scratch with a team of fellow interns. I was the only developer at the start of the project, so I was tasked with setting up the main infrastructure before other developers would join the team. Because I knew I was going to be the only developer on the project for quite some time I chose the MEAN stack. Since I already had a year of experience with this technologie, in combination with the Phaser html5 game engine which was new for me, but easy to understand and well documented. In addition to the core game and the website I also worked on a level editor for the art and design team which greatly improved efficiency in the development process.",[11,390,391],{},"This project was a great test for me, since I had to apply my knowledge of game development and web development simultaneously. It was also great for improving my communication skills across all disciplines involved with game development. Fulfilling a lead role within the team, was a great experience,which felt intimidating at first as an intern, but came quite natural. I consider it the most valuable part of my internship and my development as a developer.",{"title":45,"searchDepth":76,"depth":76,"links":393},[394],{"id":176,"depth":76,"text":177},"2016-07-01","\u002Fimages\u002Fprojects\u002Ftry-coding\u002Fcover.jpg",{"slug":398,"employer":314},"try-coding","\u002Fprojects\u002Ftrycoding",{"title":356,"description":364},"An online platform for learn coding through gaming","projects\u002Ftrycoding","EP4_QDgbTmO9z_qBI5Fpkp2amrZ5p13dLMb9fiWlEDE",{"id":405,"title":406,"body":407,"date":78,"dateFrom":1062,"dateTo":1063,"description":45,"extension":81,"image":1064,"meta":1065,"navigation":86,"path":1068,"published":86,"seo":1069,"snippet":1070,"stem":1071,"tags":78,"__hash__":1072},"projects\u002Fprojects\u002Fatlas.md","Atlas",{"type":8,"value":408,"toc":1057},[409,413,416,419,421,424,429,435,438,1054],[379,410,411],{},[11,412,383],{},[11,414,415],{},"Atlas is like a diary, you write down your problems or thoughts that trouble you and you put them in a place that no one can ever read them. These little notes are put in a mailbox, which is carried by the main character. After writing a note you get the opportunity to relieve the weight on your characters shoulders, by throwing a box at the stack of boxes. The purpose of Atlas is that you lighten the literal weight of the character's shoulders in the digital world, while lightening the figurative weight on your own shoulders in the real world.",[11,417,418],{},"Atlas was made during an applied game jam on the HKU. During this game jam, the goal was to make a game for children that struggle with mentally ill parents. The game jam was a collaboration with exchange students from south Korea.",[174,420,177],{"id":176},[11,422,423],{},"My responsebility in this project was game play programming for this game. It was a challange to build a game in sutch a short time and was a informative experiance.",[425,426,428],"h3",{"id":427},"shader","Shader",[11,430,431,434],{},[216,432],{"alt":45,"src":433},"\u002Fimages\u002Fprojects\u002Fatlas\u002Fimage_2.jpg","\nIn door enviroment.",[11,436,437],{},"I wrote most of the game play for this game and a shader for achieving the stylized look. It was the first time I did most of the programming of a game on my own. It was quite a challenge to build a game in such a short time and proved to be the deciding factor for switching my education program from game art to game design and development.",[40,439,443],{"className":440,"code":441,"language":442,"meta":45,"style":45},"language-glsl shiki shiki-themes github-light github-dark","Shader \"Custom\u002FDirectionalColor\" {\n    Properties {\n        _ColorX (\"ColorX\", Color) = (1,0,0,1)\n        _ColorY (\"ColorY\", Color) = (0,1,0,1)\n        _ColorZ (\"ColorZ\", Color) = (0,0,1,1)\n    }\n    SubShader {\n        Tags {\n            \"RenderType\"=\"Opaque\"\n        }\n        Pass {\n            Name \"FORWARD\"\n            Tags {\n                \"LightMode\"=\"ForwardBase\"\n            }\n\n            CGPROGRAM\n            #pragma vertex vert\n            #pragma fragment frag\n            #define UNITY_PASS_FORWARDBASE\n            #include \"UnityCG.cginc\"\n            #pragma multi_compile_fwdbase_fullshadows\n            #pragma exclude_renderers gles3 metal d3d11_9x xbox360 xboxone ps3 ps4 psp2\n            #pragma target 3.0\n\n            uniform float4 _ColorX;\n            uniform float4 _ColorY;\n            uniform float4 _ColorZ;\n\n            struct VertexInput {\n                float4 vertex : POSITION;\n                float3 normal : NORMAL;\n            };\n\n            struct VertexOutput {\n                float4 pos : SV_POSITION;\n                float3 normalDir : TEXCOORD0;\n            };\n\n            VertexOutput vert (VertexInput v) {\n                VertexOutput o = (VertexOutput)0;\n                o.normalDir = UnityObjectToWorldNormal(v.normal);\n                o.pos = mul(UNITY_MATRIX_MVP, v.vertex );\n                return o;\n            }\n\n            float4 frag(VertexOutput i) : COLOR {\n                i.normalDir = normalize(i.normalDir);\n                float3 normalDirection = i.normalDir;\n                float3 squared = (i.normalDir*i.normalDir);\n                float3 finalColor = (squared.r*_ColorX.rgb + squared.g*_ColorY.rgb + squared.b*_ColorZ.rgb);\n                return fixed4(finalColor,1);\n            }\n            ENDCG\n        }\n    }\n    FallBack \"Diffuse\"\n}\n","glsl",[47,444,445,457,462,503,536,569,575,581,587,598,604,610,619,625,636,642,648,654,666,677,686,695,703,735,746,751,757,763,769,774,783,789,795,801,806,814,820,826,831,836,848,864,878,892,901,906,911,923,937,948,965,1002,1018,1023,1029,1034,1039,1048],{"__ignoreMap":45},[50,446,447,451,454],{"class":52,"line":53},[50,448,450],{"class":449},"sVt8B","Shader ",[50,452,453],{"class":60},"\"Custom\u002FDirectionalColor\"",[50,455,456],{"class":449}," {\n",[50,458,459],{"class":52,"line":76},[50,460,461],{"class":449},"    Properties {\n",[50,463,465,468,471,474,477,481,483,486,489,492,494,496,498,500],{"class":52,"line":464},3,[50,466,467],{"class":56},"        _ColorX",[50,469,470],{"class":449}," (",[50,472,473],{"class":60},"\"ColorX\"",[50,475,476],{"class":449},", Color) ",[50,478,480],{"class":479},"szBVR","=",[50,482,470],{"class":449},[50,484,485],{"class":132},"1",[50,487,488],{"class":449},",",[50,490,491],{"class":132},"0",[50,493,488],{"class":449},[50,495,491],{"class":132},[50,497,488],{"class":449},[50,499,485],{"class":132},[50,501,502],{"class":449},")\n",[50,504,506,509,511,514,516,518,520,522,524,526,528,530,532,534],{"class":52,"line":505},4,[50,507,508],{"class":56},"        _ColorY",[50,510,470],{"class":449},[50,512,513],{"class":60},"\"ColorY\"",[50,515,476],{"class":449},[50,517,480],{"class":479},[50,519,470],{"class":449},[50,521,491],{"class":132},[50,523,488],{"class":449},[50,525,485],{"class":132},[50,527,488],{"class":449},[50,529,491],{"class":132},[50,531,488],{"class":449},[50,533,485],{"class":132},[50,535,502],{"class":449},[50,537,539,542,544,547,549,551,553,555,557,559,561,563,565,567],{"class":52,"line":538},5,[50,540,541],{"class":56},"        _ColorZ",[50,543,470],{"class":449},[50,545,546],{"class":60},"\"ColorZ\"",[50,548,476],{"class":449},[50,550,480],{"class":479},[50,552,470],{"class":449},[50,554,491],{"class":132},[50,556,488],{"class":449},[50,558,491],{"class":132},[50,560,488],{"class":449},[50,562,485],{"class":132},[50,564,488],{"class":449},[50,566,485],{"class":132},[50,568,502],{"class":449},[50,570,572],{"class":52,"line":571},6,[50,573,574],{"class":449},"    }\n",[50,576,578],{"class":52,"line":577},7,[50,579,580],{"class":449},"    SubShader {\n",[50,582,584],{"class":52,"line":583},8,[50,585,586],{"class":449},"        Tags {\n",[50,588,590,593,595],{"class":52,"line":589},9,[50,591,592],{"class":60},"            \"RenderType\"",[50,594,480],{"class":479},[50,596,597],{"class":60},"\"Opaque\"\n",[50,599,601],{"class":52,"line":600},10,[50,602,603],{"class":449},"        }\n",[50,605,607],{"class":52,"line":606},11,[50,608,609],{"class":449},"        Pass {\n",[50,611,613,616],{"class":52,"line":612},12,[50,614,615],{"class":449},"            Name ",[50,617,618],{"class":60},"\"FORWARD\"\n",[50,620,622],{"class":52,"line":621},13,[50,623,624],{"class":449},"            Tags {\n",[50,626,628,631,633],{"class":52,"line":627},14,[50,629,630],{"class":60},"                \"LightMode\"",[50,632,480],{"class":479},[50,634,635],{"class":60},"\"ForwardBase\"\n",[50,637,639],{"class":52,"line":638},15,[50,640,641],{"class":449},"            }\n",[50,643,645],{"class":52,"line":644},16,[50,646,647],{"emptyLinePlaceholder":86},"\n",[50,649,651],{"class":52,"line":650},17,[50,652,653],{"class":449},"            CGPROGRAM\n",[50,655,657,660,663],{"class":52,"line":656},18,[50,658,659],{"class":479},"            #pragma",[50,661,662],{"class":56}," vertex",[50,664,665],{"class":56}," vert\n",[50,667,669,671,674],{"class":52,"line":668},19,[50,670,659],{"class":479},[50,672,673],{"class":56}," fragment",[50,675,676],{"class":56}," frag\n",[50,678,680,683],{"class":52,"line":679},20,[50,681,682],{"class":479},"            #define",[50,684,685],{"class":56}," UNITY_PASS_FORWARDBASE\n",[50,687,689,692],{"class":52,"line":688},21,[50,690,691],{"class":479},"            #include",[50,693,694],{"class":60}," \"UnityCG.cginc\"\n",[50,696,698,700],{"class":52,"line":697},22,[50,699,659],{"class":479},[50,701,702],{"class":56}," multi_compile_fwdbase_fullshadows\n",[50,704,706,708,711,714,717,720,723,726,729,732],{"class":52,"line":705},23,[50,707,659],{"class":479},[50,709,710],{"class":56}," exclude_renderers",[50,712,713],{"class":56}," gles3",[50,715,716],{"class":56}," metal",[50,718,719],{"class":56}," d3d11_9x",[50,721,722],{"class":56}," xbox360",[50,724,725],{"class":56}," xboxone",[50,727,728],{"class":56}," ps3",[50,730,731],{"class":56}," ps4",[50,733,734],{"class":56}," psp2\n",[50,736,738,740,743],{"class":52,"line":737},24,[50,739,659],{"class":479},[50,741,742],{"class":56}," target",[50,744,745],{"class":132}," 3.0\n",[50,747,749],{"class":52,"line":748},25,[50,750,647],{"emptyLinePlaceholder":86},[50,752,754],{"class":52,"line":753},26,[50,755,756],{"class":449},"            uniform float4 _ColorX;\n",[50,758,760],{"class":52,"line":759},27,[50,761,762],{"class":449},"            uniform float4 _ColorY;\n",[50,764,766],{"class":52,"line":765},28,[50,767,768],{"class":449},"            uniform float4 _ColorZ;\n",[50,770,772],{"class":52,"line":771},29,[50,773,647],{"emptyLinePlaceholder":86},[50,775,777,780],{"class":52,"line":776},30,[50,778,779],{"class":479},"            struct",[50,781,782],{"class":449}," VertexInput {\n",[50,784,786],{"class":52,"line":785},31,[50,787,788],{"class":449},"                float4 vertex : POSITION;\n",[50,790,792],{"class":52,"line":791},32,[50,793,794],{"class":449},"                float3 normal : NORMAL;\n",[50,796,798],{"class":52,"line":797},33,[50,799,800],{"class":449},"            };\n",[50,802,804],{"class":52,"line":803},34,[50,805,647],{"emptyLinePlaceholder":86},[50,807,809,811],{"class":52,"line":808},35,[50,810,779],{"class":479},[50,812,813],{"class":449}," VertexOutput {\n",[50,815,817],{"class":52,"line":816},36,[50,818,819],{"class":449},"                float4 pos : SV_POSITION;\n",[50,821,823],{"class":52,"line":822},37,[50,824,825],{"class":449},"                float3 normalDir : TEXCOORD0;\n",[50,827,829],{"class":52,"line":828},38,[50,830,800],{"class":449},[50,832,834],{"class":52,"line":833},39,[50,835,647],{"emptyLinePlaceholder":86},[50,837,839,842,845],{"class":52,"line":838},40,[50,840,841],{"class":449},"            VertexOutput ",[50,843,844],{"class":56},"vert",[50,846,847],{"class":449}," (VertexInput v) {\n",[50,849,851,854,856,859,861],{"class":52,"line":850},41,[50,852,853],{"class":449},"                VertexOutput o ",[50,855,480],{"class":479},[50,857,858],{"class":449}," (VertexOutput)",[50,860,491],{"class":132},[50,862,863],{"class":449},";\n",[50,865,867,870,872,875],{"class":52,"line":866},42,[50,868,869],{"class":449},"                o.normalDir ",[50,871,480],{"class":479},[50,873,874],{"class":56}," UnityObjectToWorldNormal",[50,876,877],{"class":449},"(v.normal);\n",[50,879,881,884,886,889],{"class":52,"line":880},43,[50,882,883],{"class":449},"                o.pos ",[50,885,480],{"class":479},[50,887,888],{"class":56}," mul",[50,890,891],{"class":449},"(UNITY_MATRIX_MVP, v.vertex );\n",[50,893,895,898],{"class":52,"line":894},44,[50,896,897],{"class":479},"                return",[50,899,900],{"class":449}," o;\n",[50,902,904],{"class":52,"line":903},45,[50,905,641],{"class":449},[50,907,909],{"class":52,"line":908},46,[50,910,647],{"emptyLinePlaceholder":86},[50,912,914,917,920],{"class":52,"line":913},47,[50,915,916],{"class":449},"            float4 ",[50,918,919],{"class":56},"frag",[50,921,922],{"class":449},"(VertexOutput i) : COLOR {\n",[50,924,926,929,931,934],{"class":52,"line":925},48,[50,927,928],{"class":449},"                i.normalDir ",[50,930,480],{"class":479},[50,932,933],{"class":56}," normalize",[50,935,936],{"class":449},"(i.normalDir);\n",[50,938,940,943,945],{"class":52,"line":939},49,[50,941,942],{"class":449},"                float3 normalDirection ",[50,944,480],{"class":479},[50,946,947],{"class":449}," i.normalDir;\n",[50,949,951,954,956,959,962],{"class":52,"line":950},50,[50,952,953],{"class":449},"                float3 squared ",[50,955,480],{"class":479},[50,957,958],{"class":449}," (i.normalDir",[50,960,961],{"class":479},"*",[50,963,964],{"class":449},"i.normalDir);\n",[50,966,968,971,973,976,978,981,984,987,989,992,994,997,999],{"class":52,"line":967},51,[50,969,970],{"class":449},"                float3 finalColor ",[50,972,480],{"class":479},[50,974,975],{"class":449}," (squared.r",[50,977,961],{"class":479},[50,979,980],{"class":449},"_ColorX.rgb ",[50,982,983],{"class":479},"+",[50,985,986],{"class":449}," squared.g",[50,988,961],{"class":479},[50,990,991],{"class":449},"_ColorY.rgb ",[50,993,983],{"class":479},[50,995,996],{"class":449}," squared.b",[50,998,961],{"class":479},[50,1000,1001],{"class":449},"_ColorZ.rgb);\n",[50,1003,1005,1007,1010,1013,1015],{"class":52,"line":1004},52,[50,1006,897],{"class":479},[50,1008,1009],{"class":56}," fixed4",[50,1011,1012],{"class":449},"(finalColor,",[50,1014,485],{"class":132},[50,1016,1017],{"class":449},");\n",[50,1019,1021],{"class":52,"line":1020},53,[50,1022,641],{"class":449},[50,1024,1026],{"class":52,"line":1025},54,[50,1027,1028],{"class":449},"            ENDCG\n",[50,1030,1032],{"class":52,"line":1031},55,[50,1033,603],{"class":449},[50,1035,1037],{"class":52,"line":1036},56,[50,1038,574],{"class":449},[50,1040,1042,1045],{"class":52,"line":1041},57,[50,1043,1044],{"class":449},"    FallBack ",[50,1046,1047],{"class":60},"\"Diffuse\"\n",[50,1049,1051],{"class":52,"line":1050},58,[50,1052,1053],{"class":449},"}\n",[72,1055,1056],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":45,"searchDepth":76,"depth":76,"links":1058},[1059],{"id":176,"depth":76,"text":177,"children":1060},[1061],{"id":427,"depth":464,"text":428},"2016-02-27","2016-02-29","\u002Fimages\u002Fprojects\u002Fatlas\u002Fcover.jpg",{"slug":1066,"employer":1067},"atlas","Living Lab Game Jam","\u002Fprojects\u002Fatlas",{"title":406,"description":45},"Atlas is a therapeutic application that lets you write away your problems in a safe and calm environment.","projects\u002Fatlas","qA3ge4_oSQrwP5N9ZRX_P2l1rmJB2TOwFTAHW3fQfDw",{"id":1074,"title":1075,"body":1076,"date":78,"dateFrom":1062,"dateTo":1063,"description":1102,"extension":81,"image":1103,"meta":1104,"navigation":86,"path":1107,"published":86,"seo":1108,"snippet":1109,"stem":1110,"tags":78,"__hash__":1111},"projects\u002Fprojects\u002FIllapa.md","Illapa",{"type":8,"value":1077,"toc":1099},[1078,1084,1090,1094,1096],[11,1079,1080,1083],{},[14,1081,1075],{"href":1082,":rel":16,":target":17},"http:\u002F\u002Fglobalgamejam.org\u002F2016\u002Fgames\u002Fillapa"," is a game made on the Global Game Jam 2016. In this game you play a prophet that has to find demon amongst its people. This is done by the will of Illapa. If you interpreted Illapas message correctly you would be able to find a demon and kill it, but if you were wrong your people would be punished by lightning.",[11,1085,207,1086],{},[14,1087,212],{"href":1088,"rel":1089},"http:\u002F\u002Fggj.s3.amazonaws.com\u002Fgames\u002F2016\u002F02\u002F01\u002F1706\u002FIllapa.zip",[103],[379,1091,1092],{},[11,1093,383],{},[174,1095,177],{"id":176},[11,1097,1098],{},"I was one of the two artist on this team and my task was to create the environments for Illapa. This was the first time after switching my education program from game art to game development, that I worked on art again. I wanted to do art to maintain my artist skills. It was a nice change of pace to do art again and a good opportunity to re-sharpen my skills as an artist.",{"title":45,"searchDepth":76,"depth":76,"links":1100},[1101],{"id":176,"depth":76,"text":177},"Illapa is a game made on the Global Game Jam 2016. In this game you play a prophet that has to find demon amongst its people. This is done by the will of Illapa. If you interpreted Illapas message correctly you would be able to find a demon and kill it, but if you were wrong your people would be punished by lightning.","\u002Fimages\u002Fprojects\u002Fillapa\u002Fcover.jpg",{"slug":1105,"employer":1106},"illapa","Global Game Jam 2016","\u002Fprojects\u002Fillapa",{"title":1075,"description":1102},"A game where you as a prophet of your village need to interpret the will of the gods","projects\u002FIllapa","TDJ1DG0kFUx3IaoGRyqXBw0kpHVuVfGS8WKQ8tSbVHk",{"id":1113,"title":1114,"body":1115,"date":78,"dateFrom":1144,"dateTo":1145,"description":1122,"extension":81,"image":1146,"meta":1147,"navigation":86,"path":1150,"published":86,"seo":1151,"snippet":1152,"stem":1153,"tags":78,"__hash__":1154},"projects\u002Fprojects\u002Flucy.md","Lucy",{"type":8,"value":1116,"toc":1141},[1117,1123,1129,1132,1136,1138],[11,1118,1119,1122],{},[216,1120],{"alt":45,"src":1121},"\u002Fimages\u002Fprojects\u002Flucy\u002Fimage_1.jpg","\nGive lucy a message.",[11,1124,1125,1128],{},[216,1126],{"alt":45,"src":1127},"\u002Fimages\u002Fprojects\u002Flucy\u002Fimage_2.jpg","\nLucy responds to your message.",[11,1130,1131],{},"Lucy is an installation that consists of two parts; one big screen that displays Lucy herself and an audience that feeds Lucy through a website on their mobile devices. Lucy can also be streamed on websites like Twitch and fed through the viewers' devices. When Lucy gets fed, the audience can attach a message to the food which Lucy will respond to. If Lucy gets enough food, she will grow in size. If Lucy does not receive enough food, she ceases to exist. Lucy was shown at the Hotel Maria Kapel in 2016, a renowned art exhibition for contemporary visual art in Hoorn, the Netherlands, and was part of the exhibition of the Imagine Film Festival 2018 at the Eye Film Museum Amsterdam, The Netherlands.",[379,1133,1134],{},[11,1135,383],{},[174,1137,177],{"id":176},[11,1139,1140],{},"I was tasked was creating a website on which players could send Lucy a message and a way for Lucy to request for these messages from the database for processing. This was the first time my knowledge of web development could be applied as a part of a game.",{"title":45,"searchDepth":76,"depth":76,"links":1142},[1143],{"id":176,"depth":76,"text":177},"2016-01-01","2016-05-01","\u002Fimages\u002Fprojects\u002Flucy\u002Fcover.png",{"slug":1148,"employer":1149},"lucy","Art Exposition Lucy Art Group, Imagine film festival","\u002Fprojects\u002Flucy",{"title":1114,"description":1122},"Lucy is a tamagotchi-like artificial intelligence that you have to feed over the internet to prevent her from starving","projects\u002Flucy","xV_pPqXLFarXwRfkZ1k_LyqR6Nq8wZuITo1gGAyPoHw",{"id":1156,"title":1157,"body":1158,"date":78,"dateFrom":1183,"dateTo":1144,"description":1165,"extension":81,"image":1184,"meta":1185,"navigation":86,"path":1187,"published":86,"seo":1188,"snippet":1189,"stem":1190,"tags":78,"__hash__":1191},"projects\u002Fprojects\u002Fdeadlines.md","Deadlines",{"type":8,"value":1159,"toc":1180},[1160,1166,1172,1175,1177],[11,1161,1162,1165],{},[216,1163],{"alt":218,"src":1164},"\u002Fimages\u002Fprojects\u002Fdeadlines\u002Fimage_1.jpg","\nThe Deadline list is colored from urgent to leest urgent. This is to give the usere a sens of how busy there going to be without cheacking all assingments and deadlines that are comming up.",[11,1167,1168,1171],{},[216,1169],{"alt":225,"src":1170},"\u002Fimages\u002Fprojects\u002Fdeadlines\u002Fimage_2.jpg","\nDeadlines as been in Alpha sins 2014 en has been in Beta sins October 2015",[11,1173,1174],{},"Deadlines was conceived out of the frustration with unclarity about my assignments and their deadlines. So my friend Bobbie Goede and me came up with crowdsourcing information about assignments through a website which also allows for discussion between students and teachers. We runned the service for 2 years until the user numbers dropped because of low adoption rates with the new students.",[174,1176,177],{"id":176},[11,1178,1179],{},"I worked on the front-end as well as back-end for the web apps Alpha and Beta releases. I also worked on the UX and some of the UI design in addition to managing the sites web server.",{"title":45,"searchDepth":76,"depth":76,"links":1181},[1182],{"id":176,"depth":76,"text":177},"2014-01-01","\u002Fimages\u002Fprojects\u002Fdeadlines\u002Fcover.jpg",{"slug":1186,"employer":85},"deadlines","\u002Fprojects\u002Fdeadlines",{"title":1157,"description":1165},"A web app to keep track of your assignments with your classmates.","projects\u002Fdeadlines","yaqPLMYYBGcQGH9E4jA7P4uL2POzjOmBmFeS_JTFVjY",{"id":1193,"title":1194,"body":1195,"date":78,"dateFrom":1223,"dateTo":1144,"description":1199,"extension":81,"image":1224,"meta":1225,"navigation":86,"path":1227,"published":86,"seo":1228,"snippet":1229,"stem":1230,"tags":78,"__hash__":1231},"projects\u002Fprojects\u002Fgeit.md","Geit",{"type":8,"value":1196,"toc":1220},[1197,1200,1208,1212,1214,1217],[11,1198,1199],{},"In Geit, the goal is to set a high score based on your reached altitude. Gavin the goat runs from left to right, right to left while you try to line up his jumps correctly. The game features modules that stack on top of each other randomly, not one play through is the same and it always keeps you on your toes.",[11,1201,1202,1205],{},[216,1203],{"alt":45,"src":1204},"\u002Fimages\u002Fprojects\u002Fgeit\u002Fimage_1.png",[216,1206],{"alt":45,"src":1207},"\u002Fimages\u002Fprojects\u002Fgeit\u002Fimage_2.png",[379,1209,1210],{},[11,1211,383],{},[174,1213,177],{"id":176},[11,1215,1216],{},"Within this project I have designed and created the art and animations. I choose to use pixel art for this project because it was a style I had not used before. The art style has gone through multiple iterations before arriving at this stage.",[11,1218,1219],{},"I revisited this project in 2017, and rewrote the code and started on reworking the art assets. The game is still is in a prototype stage at this time.",{"title":45,"searchDepth":76,"depth":76,"links":1221},[1222],{"id":176,"depth":76,"text":177},"2013-01-01","\u002Fimages\u002Fprojects\u002Fgeit\u002Fcover.jpg",{"slug":1226,"employer":85},"geit","\u002Fprojects\u002Fgeit",{"title":1194,"description":1199},"Geit is a fast paced mobile platformer about a goat aiming to be the highest goat in the universe.","projects\u002Fgeit","2g9u0hyQknyJ5eRN67e-F8HI_2uIE4T6sVx7LNSPXhI",1792442025143]