[{"data":1,"prerenderedAt":315},["ShallowReactive",2],{"posts-en":3},[4,127],{"id":5,"title":6,"authors":7,"body":11,"cover":108,"date":109,"description":110,"draft":111,"extension":112,"featured":111,"key":113,"meta":114,"navigation":115,"path":116,"seo":117,"stem":118,"tools":119,"type":125,"__hash__":126},"postsEn\u002Fen\u002Fportfolio-rebuild.md","Why I rebuilt my portfolio",[8],{"id":9,"role":10},"janis","Web developer",{"type":12,"value":13,"toc":100},"minimark",[14,18,23,31,37,44,51,57,61,68,75,79,90,93,97],[15,16,17],"p",{},"My old portfolio was getting a bit dated, and strictly speaking it was never really finished. With the new one I want to try to be a bit more active, keep the site up to date and write the odd blog post, even though most likely not many people will ever see them.",[19,20,22],"h2",{"id":21},"less-is-more","Less is more",[15,24,25,26,30],{},"The nice thing about the new portfolio is how much I was able to ",[27,28,29],"strong",{},"remove",".",[15,32,33,36],{},[27,34,35],{},"daisyUI"," is out. Instead there's now a theme of my own that covers everything it did, so every element looks exactly the way I like it. Claude Design helped me out with that too.",[15,38,39,40,43],{},"The ",[27,41,42],{},"i18n module"," is out. German and English now run on my own little \"mini i18n\". The language comes from the URL prefix and the text lives in the code as a typed object. With two languages and not much text, that's a lot leaner than a big module.",[15,45,46,47,50],{},"And I removed the ",[27,48,49],{},"contact form",", Redis and all. The reason was a huge amount of spam, and it wasn't that useful anyway. An email address is more than enough.",[52,53,54],"blockquote",{},[15,55,56],{},"What isn't there can't break.",[19,58,60],{"id":59},"what-stayed-the-same","What stayed the same",[15,62,63,64,67],{},"Nuxt stayed, now on ",[27,65,66],{},"version 4",", so it's up to date again. The whole site gets rendered to HTML at build time and then just gets served as finished files. No backend, no database, hardly anything that could go down.",[15,69,70,71,74],{},"The blog is just plain ",[27,72,73],{},"markdown files"," in the repository. So a new post only needs a commit, no database. And since everything is rendered at build time, the site stays fast.",[19,76,78],{"id":77},"design-and-build","Design and build",[15,80,81,82,85,86,89],{},"The design was made in ",[27,83,84],{},"Claude Design",". I tried out a few different directions until I found something I liked. I built the site with the help of ",[27,87,88],{},"Claude Code",", which mostly took over the tedious parts: pulling components out of the mockup, keeping both languages in sync, and plenty of testing and improvements.",[15,91,92],{},"The decisions were still mine though: what goes, what stays, and how much effort a feature is worth. That's exactly why the site ended up the way I pictured it.",[19,94,96],{"id":95},"whats-next","What's next",[15,98,99],{},"As soon as I have something worth showing, I'll add new projects here. And hopefully a blog post every now and then.",{"title":101,"searchDepth":102,"depth":102,"links":103},"",2,[104,105,106,107],{"id":21,"depth":102,"text":22},{"id":59,"depth":102,"text":60},{"id":77,"depth":102,"text":78},{"id":95,"depth":102,"text":96},"\u002Fblog\u002Fportfolio-en.webp","2026-09-23","Fewer dependencies, no backend, and a blog where I can show my projects and share some thoughts.",false,"md","portfolio-rebuild",{},true,"\u002Fen\u002Fportfolio-rebuild",{"title":6,"description":110},"en\u002Fportfolio-rebuild",[120,121,122,123,124,84,88],"Nuxt","Nuxt Content","Vue","Tailwind","TypeScript","project","NIdJ8C04WWa06PYMDgA8xZHrtx3DWXeg2vS3oFf2z2o",{"id":128,"title":129,"authors":130,"body":139,"cover":301,"date":302,"description":303,"draft":111,"extension":112,"featured":115,"key":304,"meta":305,"navigation":115,"path":306,"seo":307,"stem":308,"tools":309,"type":125,"__hash__":314},"postsEn\u002Fen\u002Fmini-arcade-machine.md","Mini Arcade – Our own arcade machine",[131,133,136],{"id":9,"role":132},"Software",{"name":134,"role":135},"Luca","Cabinet",{"name":137,"role":138},"Luka","Electronics",{"type":12,"value":140,"toc":287},[141,144,155,170,174,181,184,191,196,207,211,218,230,234,237,240,246,250,261,264,267,270,277,281,284],[15,142,143],{},"For our final school project, the three of us built our own mini arcade machine. From the electronics to the software to the cabinet, we planned and built everything ourselves.",[15,145,146,147,150,151,154],{},"The special part is the display. Instead of a normal screen we used a ",[27,148,149],{},"48 × 48 LED matrix with 2,304 individually addressable RGB LEDs",", driven by a ",[27,152,153],{},"Raspberry Pi Pico 2 W",". Several games run on it directly on the hardware.",[52,156,157],{},[15,158,159,160,30],{},"The full source code is on ",[161,162,169],"a",{"href":163,"rel":164,"target":168},"https:\u002F\u002Fgithub.com\u002FJanisArnold\u002Farcade-idpa",[165,166,167],"nofollow","noopener","noreferrer","_blank","GitHub",[19,171,173],{"id":172},"the-system","The system",[15,175,176,177,180],{},"The project has three parts: ",[27,178,179],{},"electronics, software and cabinet",". I took care of the software, Luca did the cabinet and Luka the electronics. The electronics connect the microcontroller to the display, buttons and speakers. The software handles the input and draws the menu and games. And the cabinet puts it all together in the end.",[19,182,132],{"id":183},"software",[15,185,186,187,190],{},"The software is the heart of the machine. Instead of writing a separate program for every game, we built a small ",[27,188,189],{},"arcade operating system",". When you switch it on, the main menu starts right away, and from there you control everything with the joystick and buttons.",[192,193,195],"h3",{"id":194},"games","Games",[15,197,198,199,202,203,206],{},"Among others, it has ",[27,200,201],{},"Snake"," and ",[27,204,205],{},"Space Invaders",". In Snake you steer the snake with the direction keys, in Space Invaders you move the ship and shoot with the A button. The controls work the same way as in the menu. The low resolution isn't a downside, it's part of the look. The games were made specifically for 48 × 48 pixels.",[192,208,210],{"id":209},"menu-settings-and-sound","Menu, settings and sound",[15,212,213,214,217],{},"In the ",[27,215,216],{},"settings app"," you can change brightness, volume and sound right on the device, turn on developer mode or reset everything. Settings and high scores are saved and survive a restart.",[15,219,220,221,225,226,229],{},"There are sound effects too. A shot, a hit or the snake eating something triggers an event like ",[222,223,224],"code",{},"snake_eat"," or ",[222,227,228],{},"space_invaders_player_shoot",". A central audio service plays the sound, so the games themselves don't need to know anything about the audio hardware.",[192,231,233],{"id":232},"developer-mode","Developer mode",[15,235,236],{},"For development there's a hidden mode with test programs for input, sprites, fonts and audio. That way we could test individual parts directly on the real hardware without cluttering the normal interface.",[19,238,138],{"id":239},"electronics",[15,241,242,243,245],{},"At the centre is the ",[27,244,153],{},". It drives the display, handles the input and runs the software and games. The display is made up of 2,304 WS2812 LEDs, split across several data segments so they don't all have to run over a single line. The software corrects the way the matrix is rotated internally in one central place, so the games don't have to worry about it. Behind the display and inside the cabinet there's also the power supply, the audio hardware and quite a lot of cables.",[192,247,249],{"id":248},"controls-audio-power-and-cooling","Controls, audio, power and cooling",[15,251,252,253,256,257,260],{},"You control the machine with a ",[27,254,255],{},"joystick"," with four directions and ",[27,258,259],{},"six buttons",", so you don't need a keyboard or controller. For sound there's an I2S audio system with DACs and two speakers. It's meant for short effects on purpose, not for full songs.",[15,262,263],{},"The LED matrix needs a lot more power than everything else, so it has its own, stronger power supply. On top of that there's active cooling in the cabinet. You can also limit the brightness in software, which cuts down on power use and heat.",[19,265,135],{"id":266},"cabinet",[15,268,269],{},"To turn the electronics into a real arcade machine, the cabinet had to be right too. Display, electronics, speakers, fans and buttons all needed to fit in as compactly as possible.",[15,271,272,273,276],{},"In front of the LED matrix there's a ",[27,274,275],{},"grid"," we made ourselves that separates the individual LEDs. That's what gives it the typical pixel look. The buttons are built right into the cabinet, and everything is easy to reach, even though there's not much room inside for the electronics and airflow.",[19,278,280],{"id":279},"the-result","The result",[15,282,283],{},"In the end, lots of separate parts turned into a standalone mini arcade. You switch it on, land straight in the main menu and can start playing with the joystick and buttons. The picture comes from the LED matrix, the sound from the built-in speakers.",[15,285,286],{},"The most exciting part was that we didn't just end up with a program or a circuit, but a whole device. Programming, electronics, 3D design and fabrication all had to fit together for it to work.",{"title":101,"searchDepth":102,"depth":102,"links":288},[289,290,296,299,300],{"id":172,"depth":102,"text":173},{"id":183,"depth":102,"text":132,"children":291},[292,294,295],{"id":194,"depth":293,"text":195},3,{"id":209,"depth":293,"text":210},{"id":232,"depth":293,"text":233},{"id":239,"depth":102,"text":138,"children":297},[298],{"id":248,"depth":293,"text":249},{"id":266,"depth":102,"text":135},{"id":279,"depth":102,"text":280},"\u002Fblog\u002Fmini_arcade.webp","2026-05-04","For our final school project, the three of us built an arcade machine with a 48×48 LED matrix, a small operating system of its own and a cabinet we built ourselves.","mini-arcade-automat",{},"\u002Fen\u002Fmini-arcade-machine",{"title":129,"description":303},"en\u002Fmini-arcade-machine",[153,310,311,312,313],"MicroPython","C\u002FC++","WS2812","I2S","ThCxYA6jDiKnL0Irugs0hiNVHMJSzfRSy4sBMEDZLI0",1790166521362]