[{"data":1,"prerenderedAt":332},["ShallowReactive",2],{"projects":3},[4,108,186,254],{"id":5,"title":6,"body":7,"date":73,"description":74,"extension":75,"image":76,"imageAlt":77,"imageCaption":78,"imageHeight":79,"imageWidth":79,"liveLabel":80,"liveUrl":81,"meta":82,"navigation":83,"path":84,"published":83,"seo":85,"stack":86,"stats":95,"status":105,"stem":106,"tags":79,"updated":79,"__hash__":107},"projects\u002Fprojects\u002Fdarktrust.md","DarkTrust - Keep track of your legal orders from the Darknet",{"type":8,"value":9,"toc":64},"minimark",[10,15,19,22,26,29,32,36,39,42,46,49,52,56,59],[11,12,14],"h2",{"id":13},"the-problem-too-many-orders-not-enough-memory","The problem: too many orders, not enough memory",[16,17,18],"p",{},"We all know the feeling. You order something online and then you wait. Sometimes the package shows up right on time, and sometimes it takes forever. That part I can live with. The real problem for me was remembering anything about my orders afterwards: what I bought, in what quantity, and from which vendor.",[16,20,21],{},"After a while it all blurs together. Some orders arrived exactly as promised; others were nothing like the listing, with the wrong item, the wrong amount, or a vendor who had clearly oversold what they offered. On the kind of marketplaces I'm talking about, there's no support line to call and no buyer protection to fall back on, so the only thing keeping you safe is knowing who's reliable and who isn't. My memory was no help there, and more than once I ended up ordering again from someone who had already let me down. That's what pushed me to build DarkTrust.",[11,23,25],{"id":24},"what-darktrust-does","What DarkTrust does",[16,27,28],{},"DarkTrust is the long-term memory I never had for my orders. You create an entry for every order you place and attach all the details that matter: what you ordered, how much of it, which vendor it came from, the shipping they offered, and how much you spent.",[16,30,31],{},"You can keep track of vendors, orders, items, offers, and the platforms you bought on. Once an order arrives, you can rate the vendor, note how long delivery took, record how well the package was put together, and add anything else worth remembering for next time. Everything sits in one place, so the next time you're about to order, you actually know who you're dealing with.",[11,33,35],{"id":34},"privacy-and-self-hosting","Privacy and self-hosting",[16,37,38],{},"A tool like this only works if you trust it with sensitive data, so that data stays yours. DarkTrust is open source. If you have a server and Docker, you can self-host it for maximum privacy and security. If you don't, you're welcome to use the hosted version that I run myself.",[16,40,41],{},"Everything you enter is strongly encrypted. On your first login you set a recovery key, and that key matters: if you forget both your password and your recovery key, the data is gone for good. There's no backdoor, which is exactly the point. Only your real E-Mail is necessary for the hosted version in case the project\u002Fwebsite shuts down I can reach you before that happends and you've the chance to export your data as json. With that then you can host the project yourself and import your data if you want to.",[11,43,45],{"id":44},"built-in-a-day-with-claude","Built in a day with Claude",[16,47,48],{},"The whole thing took me about eleven hours, all in a single day. Most of it was written with Claude Code, using Claude Opus 4.8 from start to finish. I even picked up a second paid Pro plan on a separate account so the rate limits wouldn't slow me down halfway through. After this eleven hours the software is already ready to get self hosted or to run on a server with multi tenant support.",[16,50,51],{},"It's always interesting to throw a half-formed idea at Claude and see what comes back. If the new Fable model had been available, I'd bet the code could have turned out even cleaner and more concise.",[11,53,55],{"id":54},"final-thoughts","Final thoughts",[16,57,58],{},"If some everyday problem keeps nagging at you, think about building your own tool for it. You end up with something shaped exactly around how you see the problem. For me that was a tracker for my online orders, all perfectly legal of course ;) I'm happy with where it is right now, and I hope it nudges a few other people to give it a shot.",[60,61],"comment-section",{"section":62,"slug":63},"projects","darktrust",{"title":65,"searchDepth":66,"depth":66,"links":67},"",2,[68,69,70,71,72],{"id":13,"depth":66,"text":14},{"id":24,"depth":66,"text":25},{"id":34,"depth":66,"text":35},{"id":44,"depth":66,"text":45},{"id":54,"depth":66,"text":55},"2026-06-23","Track the orders you place along with how trustworthy each vendor is, shipping details, how much you spent, and more.","md","\u002Fimages\u002Fprojects\u002Fdarktrust\u002Fweb-interface.webp","Screenshot of the DarkTrust dashboard","You can see here the dashboard of DarkTrust",null,"DarkTrust","https:\u002F\u002Fdarktrust.danobe.dev",{},true,"\u002Fprojects\u002Fdarktrust",{"title":6,"description":74},[87,88,89,90,91,92,93,94],"Nuxt 4","Vue 3","Nuxt-auth-utils","Nuxt-content","Sqlite3-ciphers","Drizzle","Resend","Zod",[96,99,102],{"icon":97,"text":98},"i-lucide-timer","First MVP in ~11 hours",{"icon":100,"text":101},"i-lucide-server","Self-host or use online",{"icon":103,"text":104},"i-lucide-shield-check","Database Encrypted, no backdoor","wip","projects\u002Fdarktrust","64HH3OTR_SZVF5ubclLP4HrpATyT6R-GUZVYg0_OSkI",{"id":109,"title":110,"body":111,"date":165,"description":166,"extension":75,"image":167,"imageAlt":168,"imageCaption":168,"imageHeight":79,"imageWidth":79,"liveLabel":122,"liveUrl":119,"meta":169,"navigation":83,"path":170,"published":83,"seo":171,"stack":172,"stats":176,"status":183,"stem":184,"tags":79,"updated":79,"__hash__":185},"projects\u002Fprojects\u002Fplayvault.md","PlayVault - Save All YouTube Videos in a Playlist",{"type":8,"value":112,"toc":159},[113,124,128,131,135,138,142,145,149,156],[16,114,115,116,123],{},"A while back I kept running into the same problem: I collected music videos in a YouTube playlist, and after a while songs would just disappear from it.\nSo I wrote a small Python script that went through the playlist and saved each video's title, uploader, and position.\nI ran it once a week, which gave me a running history of everything I'd been listening to on YouTube.\nIt worked well enough, but getting it running needed a Google\u002FYouTube API key to talk to YouTube's backend.\nThat setup is a hassle, so I looked for an easier way to solve the same problem.\nThe result is ",[117,118,122],"a",{"href":119,"rel":120},"https:\u002F\u002Fplayvault.danobe.dev",[121],"nofollow","PlayVault",".",[11,125,127],{"id":126},"what-you-get-with-an-account","What you get with an account",[16,129,130],{},"You can sign in with a Google account. That keeps people from spamming the API with requests, and it unlocks the main feature: PlayVault scans your playlist automatically once a week or month, and if a video has been removed, it sends you an email.\nIt's a convenient way to find out when something quietly vanishes from a playlist.",[11,132,134],{"id":133},"dont-want-to-sign-up","Don't want to sign up?",[16,136,137],{},"If you'd rather not create an account, there's another way. Enter a YouTube playlist URL on the website and download a ZIP archive of the whole playlist.\nEach video becomes a .jpg file: the image is the video's thumbnail, and the filename is its position, title, and uploader.\nGrab a playlist like this every so often, and when you want to know what's changed, feed two of these ZIP files into the built-in compare tool.\nIt shows you right in the browser which videos have gone missing and which were added recently.\nThis works fine, but I'd still recommend signing in with a Google account so you get an email automatically whenever a video disappears.",[11,139,141],{"id":140},"house-rules","House rules",[16,143,144],{},"I had to add some rate limiting. You can download up to 20 ZIP archives per day, and the counter resets at midnight.\nThis is necessary because my YouTube API access is limited, so I can't offer unlimited downloads.\nWith a Google account you can monitor up to five playlists, and you can manually scan each one for changes up to three times a day.\nWhen a scan finds a deleted video, you click the \"removed\" button and it shows you exactly which video was taken out of your playlist.",[11,146,148],{"id":147},"future-plans","Future plans",[16,150,151,152,123],{},"For now I've built everything I had in mind for this project. If I come up with more good ideas, I'll add them, but I'm happy with where it is.\nIf you have a suggestion for making it better, feel free to email me anytime at ",[117,153,155],{"href":154},"mailto:hello@danobe.dev","hello@danobe.dev",[60,157],{"section":62,"slug":158},"playvault",{"title":65,"searchDepth":66,"depth":66,"links":160},[161,162,163,164],{"id":126,"depth":66,"text":127},{"id":133,"depth":66,"text":134},{"id":140,"depth":66,"text":141},{"id":147,"depth":66,"text":148},"2026-06-16","Save the title and uploader of every video in a YouTube playlist, then compare snapshots over time to see which videos have gone private or been deleted.","\u002Fimages\u002Fprojects\u002Fplayvault\u002Fweb-interface.webp","Screenshot of the PlayVault website",{},"\u002Fprojects\u002Fplayvault",{"title":110,"description":166},[87,88,173,174,175],"YouTube API","Resend for email","SQLite as database",[177,180],{"icon":178,"text":179},"i-lucide-mail-check","Email alert on removed videos",{"icon":181,"text":182},"i-lucide-git-compare","Snapshot & compare playlists","active","projects\u002Fplayvault","FDN2v5Nf_yoEPQBqFyt8IWi2C-WL0pi4y4J1AP0-bp0",{"id":187,"title":188,"body":189,"date":229,"description":230,"extension":75,"image":231,"imageAlt":232,"imageCaption":233,"imageHeight":79,"imageWidth":79,"liveLabel":234,"liveUrl":235,"meta":236,"navigation":83,"path":237,"published":83,"seo":238,"stack":239,"stats":245,"status":105,"stem":252,"tags":79,"updated":79,"__hash__":253},"projects\u002Fprojects\u002Fremindo.md","Remindo - A automated reminder",{"type":8,"value":190,"toc":224},[191,194,197,201,204,208,211,215,218,221],[16,192,193],{},"My dentist is pretty smart. I had a routine teeth cleaning booked and two days before I got an SMS — a simple confirmation so I wouldn't forget. That stuck with me, because there are so many things people forget on a regular basis. The 'collaudo' for their car, for example.",[16,195,196],{},"So I built a platform where businesses can register and send automated SMS or email reminders to their clients. In simple terms: I copied what my dentist was already doing and made it available to other businesses.",[11,198,200],{"id":199},"the-use-case","The use case",[16,202,203],{},"Take the car 'collaudo' as an example — you have to do it every two years, and I always forget when mine is due. I ended up setting a calendar reminder on my iPhone. But it would be much better if the workshop where I last had it done sent me a message a week before it's due, so I can arrange an appointment without even thinking about it. Clients don't forget, businesses get the booking. Everyone wins.",[11,205,207],{"id":206},"going-it-alone","Going it alone",[16,209,210],{},"The project is currently not in the most solid state — I vibe coded quite a bit, and it got big and confusing fast. Getting it off the ground is the hard part. Once it's finished, I need to add payments — and even collecting €10\u002Fmonth from a handful of customers means registering a company and paying taxes in Italy, which is genuinely challenging and expensive.",[11,212,214],{"id":213},"future-of-the-project","Future of the project",[16,216,217],{},"I'm not sure yet whether to take the plunge and cold email some local car mechanics — ask if they'd try the software and tell me if it's actually useful. I'm a bit shy by nature, so reaching out to strangers is the part I keep putting off.",[16,219,220],{},"The other obstacle is time. I have a day job, so most of the work happens in the evenings — and after a long day I'm not always in the mood to open the laptop. We'll see how it goes. I'll keep you posted.",[60,222],{"section":62,"slug":223},"remindo",{"title":65,"searchDepth":66,"depth":66,"links":225},[226,227,228],{"id":199,"depth":66,"text":200},{"id":206,"depth":66,"text":207},{"id":213,"depth":66,"text":214},"2026-05-21","Automated SMS and email reminders for businesses. Notify clients about appointments and recurring deadlines before they forget.","\u002Fimages\u002Fprojects\u002Fremindo\u002Fremindo-web-interface.webp","Screenshot of the Remindo dashboard showing reminder management for businesses","Remindo — businesses manage their client reminders in one place.","remindo.danobe.dev","https:\u002F\u002Fremindo.danobe.dev",{},"\u002Fprojects\u002Fremindo",{"title":188,"description":230},[87,88,240,241,242,243,244],"TailwindCSS","Postgresql & Prisma ORM","Docker & Docker Compose","nuxt-auth-utils + Argon 2","Twilio SMS API",[246,249],{"icon":247,"text":248},"i-lucide-code-2","9000 lines of code",{"icon":250,"text":251},"i-lucide-git-commit","105 git commits from January - May 2026","projects\u002Fremindo","ec_jxu_d7txR3aTWkt-VASyUgSrwVc5NCvcMdwdouM8",{"id":255,"title":256,"body":257,"date":309,"description":310,"extension":75,"image":311,"imageAlt":312,"imageCaption":313,"imageHeight":79,"imageWidth":79,"liveLabel":314,"liveUrl":315,"meta":316,"navigation":83,"path":317,"published":83,"seo":318,"stack":319,"stats":322,"status":329,"stem":330,"tags":79,"updated":79,"__hash__":331},"projects\u002Fprojects\u002Fcarpf.md","carpf.it - Following the footsteps of the police",{"type":8,"value":258,"toc":304},[259,262,265,269,277,280,284,294,298,301],[16,260,261],{},"South Tyrol runs on WhatsApp traffic groups. People share police checkpoint locations,\naccidents, and road closures in real time. It works, but each group is capped at 1,024 members.\nSo there are dozens of them, each covering a different valley or town, with no shared view of\nwhat's actually happening on the roads at any given moment.",[16,263,264],{},"carpf.it is my attempt at fixing that. It's a map where anyone can report a traffic jam,\na construction site, an accident, or a speed trap. One place, all of South Tyrol.",[11,266,268],{"id":267},"the-ux-problem-i-havent-solved","The UX problem I haven't solved",[16,270,271,272,276],{},"The idea works better in theory than in practice. Sending a WhatsApp message takes four\nseconds. Opening a PWA, finding your location on a Leaflet map, and picking an incident\ncategory takes considerably longer — and most people aren't willing to do that while sitting\nin traffic. The WhatsApp groups have thousands of active members; carpf.it gets around\n",[273,274,275],"strong",{},"100 unique visitors a day",". That gap is the problem I haven't cracked yet.",[16,278,279],{},"Part of it is habit. People already have WhatsApp open. Switching to a separate app, even\na fast one, adds just enough friction that most don't bother. I've been thinking about a\nsimpler reporting flow — maybe a one-tap \"I see police here\" button without any map\ninteraction — but haven't shipped it yet.",[11,281,283],{"id":282},"the-tech","The tech",[16,285,286,287,289,290,293],{},"The frontend is ",[273,288,87],{}," with a Leaflet map for rendering incidents.\nReports go into ",[273,291,292],{},"PostgreSQL"," and expire automatically after a few hours\nso stale data doesn't clutter the map. The app is served as a PWA so it installs on\nmobile like a native app, though as mentioned above, that convenience hasn't translated\ninto many active reporters yet.",[11,295,297],{"id":296},"where-it-stands","Where it stands",[16,299,300],{},"It's live, it works, and a small group of people use it regularly. Whether it ever\ndisplaces the WhatsApp groups is an open question. The network effect those groups have\nbuilt up over years is hard to compete with. For now I'm keeping it running and\nseeing whether the reporting flow improvements make a difference.",[60,302],{"section":62,"slug":303},"carpf-it",{"title":65,"searchDepth":66,"depth":66,"links":305},[306,307,308],{"id":267,"depth":66,"text":268},{"id":282,"depth":66,"text":283},{"id":296,"depth":66,"text":297},"2026-02-08","A real-time traffic map for South Tyrol — one place to report jams, accidents, construction sites, and speed traps, instead of hunting across dozens of WhatsApp groups.","\u002Fimages\u002Fprojects\u002Fcarpf-it\u002Flayout.webp","Screenshot of the carpf.it map interface","The carpf.it map — incidents shown in real time across South Tyrol.","carpf.it","https:\u002F\u002Fcarpf.it",{},"\u002Fprojects\u002Fcarpf",{"title":256,"description":310},[87,88,292,320,321],"Leaflet","PWA",[323,326],{"icon":324,"text":325},"i-lucide-users","Peak ~300 users\u002Fday",{"icon":327,"text":328},"i-lucide-map-pin","All of South Tyrol","on-hold","projects\u002Fcarpf","xrYOtjnzjjbv6n0PndGlQvVYzQf3pD77MoySIGEA1lM",1782795477503]