1:"$Sreact.fragment" 2:I[138,["244","static/chunks/244-94685f07977af2ff.js","63","static/chunks/63-4a896a66348e79a8.js","974","static/chunks/app/page-2d2043d27725a813.js"],"default"] 4:I[2920,["87","static/chunks/0e762574-07919328fc2b362b.js","244","static/chunks/244-94685f07977af2ff.js","177","static/chunks/app/layout-6de1279a3de71d8e.js"],"default"] 5:I[7555,[],""] 6:I[1295,[],""] 8:I[9665,[],"MetadataBoundary"] a:I[9665,[],"OutletBoundary"] d:I[4911,[],"AsyncMetadataOutlet"] f:I[9665,[],"ViewportBoundary"] 11:I[6614,[],""] :HL["/_next/static/media/3273710ae43a970a-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}] :HL["/_next/static/media/4b2a774852d1c06b-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}] :HL["/_next/static/css/adfc29178418a091.css","style"] 3:T44f,M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z0:{"P":null,"b":"bBuat6XflHu8iZeyfdua8","p":"","c":["","projects"],"i":false,"f":[[["",{"children":["projects",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/adfc29178418a091.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"__className_c51aed __className_febfbb","children":[["$","head",null,{"children":["$","script",null,{"defer":true,"data-domain":"littledev.nl","src":"https://plausible.littledev.nl/js/script.js"}]}],["$","body",null,{"className":"bg-white text-black dark:bg-gray-900 dark:text-gray-100","children":["$","div",null,{"children":[null,["$","a",null,{"className":"sr-only focus:not-sr-only","href":"#content","children":"Naar content"}],["$","div",null,{"className":"bg-nav dark:bg-dark-nav py-3","children":["$","nav",null,{"className":"container mx-auto flex justify-between flex-wrap text-white","children":[["$","$L2",null,{"className":"ml-3 md:mx-3 md:text-xl font-fancy no-underline","href":"/","children":"Littledev"}],["$","ul",null,{"className":"flex text-white no-underline items-center","children":[["$","li",null,{"className":"px-3","children":["$","$L2",null,{"href":"/about","inactiveClassName":"no-underline","activeClassName":"underline","children":"About"}]}],["$","li",null,{"className":"px-3","children":["$","$L2",null,{"href":"/blog","inactiveClassName":"no-underline","activeClassName":"underline","children":"Blog"}]}],["$","li",null,{"className":"px-3","children":["$","$L2",null,{"href":"/projects","inactiveClassName":"no-underline","activeClassName":"underline","children":"Projects"}]}],["$","li",null,{"className":"px-3","children":["$","a",null,{"rel":"me noopener noreferrer","href":"https://mas.to/@littledev","target":"_blank","title":"@littledev on Mastodon","children":["$","svg",null,{"stroke":"currentColor","fill":"currentColor","strokeWidth":"0","role":"img","viewBox":"0 0 24 24","className":"text-white dark:text-white","children":["$undefined",[["$","path","0",{"d":"$3","children":[]}]]],"style":{"color":"$undefined"},"height":"1rem","width":"1rem","xmlns":"http://www.w3.org/2000/svg"}]}]}],["$","li",null,{"className":"px-3","children":["$","a",null,{"href":"https://github.com/blackshadev/","target":"_blank","title":"My Github","rel":"noreferrer noopener","children":["$","svg",null,{"stroke":"currentColor","fill":"currentColor","strokeWidth":"0","role":"img","viewBox":"0 0 24 24","className":"text-white dark:text-white","children":["$undefined",[["$","path","0",{"d":"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12","children":[]}]]],"style":{"color":"$undefined"},"height":"1rem","width":"1rem","xmlns":"http://www.w3.org/2000/svg"}]}]}],["$","li",null,{"className":"px-3","children":["$","$L4",null,{"size":"1rem"}]}]]}]]}]}],["$","main",null,{"id":"content","className":"container mt-6 px-4 md:mx-auto md:px-0 ","children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]}]]}]]}],{"children":["projects",["$","$1","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":["$L7",["$","$L8",null,{"children":"$L9"}],null,["$","$La",null,{"children":["$Lb","$Lc",["$","$Ld",null,{"promise":"$@e"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","bxNJQTS0JnyLmUiF4ERLb",{"children":[["$","$Lf",null,{"children":"$L10"}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],null]}],false]],"m":"$undefined","G":["$11","$undefined"],"s":false,"S":true} 12:"$Sreact.suspense" 13:I[4911,[],"AsyncMetadata"] 9:["$","$12",null,{"fallback":null,"children":["$","$L13",null,{"promise":"$@14"}]}] c:null 10:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] b:null 14:{"metadata":[["$","title","0",{"children":"Littledev"}],["$","meta","1",{"name":"description","content":"Personal homepage of Vincent Hagen aka Littledev"}]],"error":null,"digest":"$undefined"} e:{"metadata":"$14:metadata","error":null,"digest":"$undefined"} 15:I[6484,["362","static/chunks/30a37ab2-5f68fa3af47db934.js","271","static/chunks/619edb50-fa1bcbbc807ab29f.js","893","static/chunks/app/projects/page-423e124dd6a8bf72.js"],"default"] 7:["$","section",null,{"className":"mx-4 grid grid-cols-4 gap-4","children":[["$","h1",null,{"className":"w-full col-span-full","children":"Projects"}],["$","$L15",null,{"projects":[{"title":"Tempest PHP","description":"A new PHP framework which focuses on ease of use and making use of modern PHP language features. I reworked the router to be able to handle allot of routes fast. And added small small features to the language container and config handling.","date":"2024-10-07T00:00:00","source":"https://github.com/tempestphp/tempest-framework","url":"https://tempestphp.com/","languages":["PHP"],"content":"","filepath":"projects/TempestPHP.md","tech":[]},{"title":"DNSControl","description":"DNSControl is a way to manage your DNS entries centralized in code. Even if they span multiple providers. I made the provider to let DNSControl work with TransIP. On top of that created some fixes for open issues in DNSControl. And I contributed to the way DNSControl managed dependencies between records and orders them accordingly. DNSControl is a project maintained and created by the folks from StackExchange, I merely submitted some code.","date":"2023-10-29T00:00:00","source":"https://github.com/StackExchange/dnscontrol","url":"https://stackexchange.github.io/dnscontrol/","languages":["Go"],"content":"","filepath":"projects/DNSControl.md","tech":[]},{"title":"Littledev.nl","description":"The website you are reading. Written in NextJS because NuxtJS 2 was becoming outdated while the maintainer hadn't proveded a clear update path from NuxtJS 2 to NuxtJS 3. I already had some experience with NextJS from work projects so translating it was easy enough.","date":"2022-11-06T00:00:00","source":"https://github.com/blackshadev/littledev-nl","url":"https://littledev.nl/","languages":["Typescript","HTML"],"tech":["React","NextJS","TailwindCSS"],"content":"","filepath":"projects/littledev-nl-next.md"},{"title":"Monchou","description":"A dutch cooking recipe website for my girlfriend and I. It is Staticly generated with NextJS and it provides a easy way for us to access our cooking recipes.","date":"2022-09-12T00:00:00","source":"https://github.com/IrisvM/monchou","url":"https://monchou.littledev.nl/","languages":["Typescript","HTML"],"tech":["React","NextJS","TailwindCSS"],"content":"","filepath":"projects/monchou.md"},{"title":"Explorer","description":"A library for Laravel scout to interface with ElasticSearch. I am one of the maintainers and made allot of the internals and query features.","date":"2021-04-02T00:00:00","source":"https://github.com/Jeroen-G/Explorer","url":"https://github.com/Jeroen-G/Explorer","languages":["PHP"],"content":"","filepath":"projects/explorer.md","tech":[]},{"title":"Libdivecomputerjs","description":"A library for NodeJS to interface with diving computers. It is a native addon using NAPI written in C++ leveraging the libdivecomputer library under the hood.","date":"2021-03-18T00:00:00","source":"https://github.com/blackshadev/libdivecomputerjs","languages":["C/C++","Javascript","Typescript"],"tech":["Nodejs","CMake(.js)"],"content":"","filepath":"projects/libdivecomputerjs.md"},{"title":"Littledivelog (Uploader) v3","description":"A client to upload dives read from a dive computer to my littledivelog server. This is a rewrite of my dive uploader in Javascript with electron to allow for cross platform compatibility. It uses React with styled-components for the front-end with redux for state management and redux-saga to handle side-effects. I ended up liking React more than I expected, while liking redux, less than I expected. Redux certainly is nice tech, but something I had a hard time with, is the fact that there API enabled you to quickly create a mess. The API doesn't encourage good practices, there documentation doesn't state good practices and there 'toolbox' leaves gaps in there functionality (which redux saga does solve) which again encouraging bad practices.","date":"2021-03-18T00:00:00","source":"https://github.com/blackshadev/electron-dive-downloader","url":"https://dive.littledev.nl/","languages":["Typescript"],"tech":["Electron","React","Redux"],"content":"","filepath":"projects/littledivelog-uploader-v3.md"},{"title":"Littledev's IPTools","description":"A small zero dependency package for working with IP (v4/v6) Networks and Addresses. Its main goal was to have 0 something to work on and try out infection while creating a stable zero dependency library takes the heavy lifting for checking if IP addresses are in a network and iterating through networks.","date":"2020-12-26T00:00:00","source":"https://github.com/blackshadev/IPTools","url":"https://packagist.org/packages/littledevnl/iptools","languages":["PHP"],"tech":["PHPUnit","Infection"],"content":"","filepath":"projects/IPTools.md"},{"title":"Littledev.nl ","description":"The previous version of the website you are reading. Written with new technologies I wanted to learn and because I wanted to get rid of WordPress.","date":"2020-11-06T00:00:00","source":"https://github.com/blackshadev/littledev-nl","url":"https://littledev.nl/","languages":["Typescript","SCSS","HTML"],"tech":["VueJS","NuxtJS","Tailwindcss","Netlify CMS"],"content":"","filepath":"projects/littledev-nl-nuxt.md"},{"title":"Littledivelog (server) v2","description":"The backend for the divelog webapp which I use to log my own dives. I also have a client to download dives from my dive computer to the webapp. Version 2 is written in PHP because I wanted to have a toy project with PHP Laravel and the nodeJS backend was rather hacked together without much tests or maintainability.","date":"2020-01-08T00:00:00","source":"https://github.com/blackshadev/littledivelogserver","url":"https://dive.littledev.nl/","languages":["PHP"],"tech":["PHPUnit","Laravel"],"content":"","filepath":"projects/littledivelog-backend-v2.md"},{"title":"AAS","description":"The Anderwijs Administration system; An administration system build for and with an association. The original creator and I are the main maintainers and contributors to the project.","date":"2018-04-05T00:00:00","source":"https://github.com/robinklaassen/aas2","url":"https://aas2.anderwijs.nl/","languages":["PHP"],"tech":["Laravel"],"content":"","filepath":"projects/aas.md"},{"title":"Littledivelog (Uploader) v2","description":"A client to upload dives read from a dive computer to my littledivelog server. This is a rewrite of my dive uploader in C++ QT to allow for cross platform compatibility. I ended up rewriting this again. because I didn't like how QT handled installers cross compatibility, or the lack thereof. Moreover, allot of the features you'd want are put behind a pay-wall, something I am not a fan off. Moreover compiling to a foreign system, which you don't own, is a pain.","date":"2018-02-01T00:00:00","source":"https://github.com/blackshadev/qt-dive-uploader","url":"https://dive.littledev.nl/","languages":["C/C++"],"tech":["QT","QML"],"content":"","filepath":"projects/littledivelog-uploader-v2.md"},{"title":"Littledivelog (server) v1","description":"The backend for the divelog webapp which I use to log my own dives. I also have a client to download dives from my dive computer to the webapp","date":"2017-03-01T00:00:00","source":"https://github.com/blackshadev/littledivelog/tree/master/divingserver","url":"https://dive.littledev.nl/","languages":["Typescript"],"tech":["NodeJS"],"content":"","filepath":"projects/littledivelog-backend.md"},{"title":"Littledivelog (frontend)","description":"A divelog webapp which I use to log my own dives. I also have a client to download dives from my dive computer to the webapp","date":"2017-03-01T00:00:00","source":"https://github.com/blackshadev/littledivelog/tree/master/divingapp","url":"https://dive.littledev.nl/","languages":["Typescript","HTML"],"tech":["Angular"],"content":"","filepath":"projects/littledivelog-frontend.md"},{"title":"Littledivelog (Uploader) C#","description":"A client to upload dives read from a dive computer to my littledivelog server. Written in C# WinForms. I ended up rewriting this in QT because I wanted to use the client on MacOS and Linux as well.","date":"2016-11-15T00:00:00","languages":["C#"],"tech":["WinForms"],"content":"","filepath":"projects/littledivelog-uploader-v1.md"}]}]]}]