[{"data":1,"prerenderedAt":539},["ShallowReactive",2],{"\u002Fprojects\u002Fkeepnet":3,"github-\u002Fprojects\u002Fkeepnet":128,"skills":137},{"id":4,"title":5,"body":6,"description":90,"extension":91,"featured":92,"image":93,"languages":94,"links":101,"meta":107,"navigation":92,"path":108,"repo":109,"seo":110,"skills":113,"stem":126,"__hash__":127},"projects\u002Fprojects\u002Fkeepnet.md","Keepnet",{"type":7,"value":8,"toc":82},"minimark",[9,13,16,21,24,62,66,69,72,76,79],[10,11,12],"p",{},"Jeder kennt es: Man speichert sich auf X, TikTok, Instagram oder Reddit ständig Links \"für später\" – und wenn später dann kommt, ist das Video gelöscht, der Account weg oder man findet den Bookmark in der unsortierten Masse einfach nicht mehr. X versteckt die eigenen Bookmarks inzwischen sogar hinter einer Paywall-API.",[10,14,15],{},"Keepnet ist meine Antwort darauf: ein selbst-gehostetes \"save it before it's gone\"-System. Per iOS-Shortcut (oder PWA-Share-Target) teile ich einen Link an meine eigene Instanz – den Rest erledigt eine Pipeline im Hintergrund.",[17,18,20],"h3",{"id":19},"die-ingest-pipeline","Die Ingest-Pipeline",[10,22,23],{},"Jeder geteilte Link durchläuft eine asynchrone Job-Pipeline auf Basis von pg-boss – ganz ohne Redis, die Queue lebt direkt in Postgres:",[25,26,27,44,50,56],"ul",{},[28,29,30,34,35,39,40,43],"li",{},[31,32,33],"strong",{},"Kanonisieren & Deduplizieren"," – Shortener wie ",[36,37,38],"code",{},"t.co"," oder ",[36,41,42],{},"vm.tiktok.com"," werden aufgelöst, Tracking-Parameter entfernt und die kanonische URL gehasht, damit doppelt geteilte Links nicht doppelt landen.",[28,45,46,49],{},[31,47,48],{},"Medien-Archivierung"," – Videos und Bilder werden mit yt-dlp und ffmpeg heruntergeladen und in MinIO (S3) abgelegt – inklusive Sonderfällen wie TikTok-Foto-Karussells.",[28,51,52,55],{},[31,53,54],{},"Transkription auf dem Mac"," – ein eigener Worker läuft als launchd-Agent auf meinem Mac und transkribiert Videos mit mlx-whisper auf der Apple-Silicon-GPU, 10–30× schneller als CPU-Whisper auf dem Server. Der Worker sieht dabei weder Datenbank noch S3-Credentials – Audio kommt über kurzlebige presigned URLs.",[28,57,58,61],{},[31,59,60],{},"KI-Labeling"," – ein LLM ordnet jeden Bookmark automatisch einer selbst definierten Label-Taxonomie zu.",[17,63,65],{"id":64},"suche-die-wirklich-findet","Suche, die wirklich findet",[10,67,68],{},"Die Bibliothek ist über eine dreistufige Suche in einer einzigen Postgres-Instanz durchsuchbar: gewichtete Volltextsuche, Trigram-Index als Tippfehler-Fallback und semantische Vektorsuche über pgvector mit HNSW-Index – fusioniert per Reciprocal Rank Fusion.",[10,70,71],{},"Dazu gibt es einen \"Ask your library\"-Endpoint: Ein LLM beantwortet Fragen über die eigene Bibliothek, ruft dabei selbstständig Such-Tools auf und zitiert die Quellen als verlinkte Bookmarks.",[17,73,75],{"id":74},"importer-für-den-alt-bestand","Importer für den Alt-Bestand",[10,77,78],{},"Damit auch die Bookmarks der letzten Jahre einziehen, gibt es Bulk-Importer für GitHub Stars, TikTok-Favoriten, Instagram Saved und Reddit Saved – und für die X-Bookmarks einen dokumentierten Console-Script-Workaround an der Paywall vorbei.",[10,80,81],{},"Keepnet läuft produktiv auf meinem eigenen Server und archiviert seitdem alles, was ich unterwegs teile.",{"title":83,"searchDepth":84,"depth":84,"links":85},"",2,[86,88,89],{"id":19,"depth":87,"text":20},3,{"id":64,"depth":87,"text":65},{"id":74,"depth":87,"text":75},"Keepnet ist ein selbst-gehosteter Bookmark-Archiver, der geteilte Links samt Videos archiviert, transkribiert und per KI durchsuchbar macht.","md",true,"\u002Fimages\u002Fprojects\u002Fcards\u002Fkeepnet.png",[95,98],{"language":96,"percentage":97},"Nuxt",60,{"language":99,"percentage":100},"TypeScript",40,[102],{"label":103,"icon":104,"to":105,"target":106,"external":92},"Website","i-heroicons-globe-alt","https:\u002F\u002Fkeepnet.niki2k1.dev","_blank",{},"\u002Fprojects\u002Fkeepnet","Niki2k1\u002Fkeepnet",{"title":111,"description":112},"Keepnet – Social-Bookmark-Archiver","Keepnet ist ein selbst-gehosteter Bookmark-Archiver – Links von X, TikTok, Instagram & Co. werden per iOS-Shortcut gespeichert, mit yt-dlp archiviert, mit Whisper transkribiert und über Volltext- und Vektorsuche durchsuchbar gemacht.",[114,115,116,117,118,119,120,121,122,123,124,125],"nuxt","vue","typescript","nuxt-ui","tailwind","postgres","drizzle-orm","ai-sdk","ffmpeg","docker","vitest","whisper","projects\u002Fkeepnet","EN5MzX5BW70dmgTaNGLBNjCpDS2bx2OKN3oJ2LtnxX8",{"stars":129,"forks":129,"createdAt":130,"pushedAt":131,"commitCount":132,"activity":133},0,"2026-07-05T11:19:13Z","2026-07-19T20:38:41Z",44,[129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,134,135,136],31,12,1,[138,150,161,170,179,188,199,208,217,225,233,241,249,257,266,274,283,291,300,310,318,326,334,342,350,357,364,371,380,388,396,404,412,420,428,436,444,452,460,468,476,483,491,499,507,515,523,531],{"id":139,"category":140,"extension":141,"icon":142,"level":143,"meta":144,"name":145,"stem":146,"url":147,"year":148,"__hash__":149},"skills\u002Fskills\u002Fai-sdk.yml","Backend","yml","i-logos-vercel-icon","Familiar",{},"AI SDK","skills\u002Fai-sdk","https:\u002F\u002Fai-sdk.dev","2026","wrZ81rlAkAtAOUgPZ3O7XKZVo_ZA40usaRMX1x2QIqI",{"id":151,"category":152,"extension":141,"icon":153,"level":154,"meta":155,"name":156,"stem":157,"url":158,"year":159,"__hash__":160},"skills\u002Fskills\u002Fazure.yml","DevOps","i-logos-microsoft-azure","Proficient",{},"Azure","skills\u002Fazure","https:\u002F\u002Fazure.microsoft.com","2021","uhi9OV2kz1bgheQ-n9srKx0HSUYlYI7MuyjObYDUgrQ",{"id":162,"category":140,"extension":141,"icon":163,"level":154,"meta":164,"name":165,"stem":166,"url":167,"year":168,"__hash__":169},"skills\u002Fskills\u002Fbun.yml","i-logos-bun",{},"Bun","skills\u002Fbun","https:\u002F\u002Fbun.sh","2024","bkieq8AIp5NIJh3xetY96f7WfuFNjAMI7oevfWb1W-0",{"id":171,"category":172,"extension":141,"icon":173,"level":143,"meta":174,"name":175,"stem":176,"url":177,"year":148,"__hash__":178},"skills\u002Fskills\u002Fclaude-code.yml","Tooling","i-logos-claude-icon",{},"Claude Code","skills\u002Fclaude-code","https:\u002F\u002Fclaude.com\u002Fclaude-code","nq8UwiCtks6-HbLWOie3mLLRI_0FcRckcL4OK0btTzI",{"id":180,"category":152,"extension":141,"icon":181,"level":154,"meta":182,"name":183,"stem":184,"url":185,"year":186,"__hash__":187},"skills\u002Fskills\u002Fcoolify.yml","i-simple-icons-coolify",{},"Coolify","skills\u002Fcoolify","https:\u002F\u002Fcoolify.io","2023","uh7httXSb9SS1ggRLMKgfmPi2mgMtqNgSGUnSDHeAXk",{"id":189,"category":190,"extension":141,"icon":191,"level":192,"meta":193,"name":194,"stem":195,"url":196,"year":197,"__hash__":198},"skills\u002Fskills\u002Fcss.yml","Frontend","i-logos-css-3","Core",{},"CSS","skills\u002Fcss","https:\u002F\u002Fdeveloper.mozilla.org\u002Fdocs\u002FWeb\u002FCSS","2013","GLbnVt9JlmOE-RyFF0Pmh8QKVBKq-Qj-uXhgVZkMxBs",{"id":200,"category":140,"extension":141,"icon":201,"level":143,"meta":202,"name":203,"stem":204,"url":205,"year":206,"__hash__":207},"skills\u002Fskills\u002Fdeno.yml","i-logos-deno",{},"Deno","skills\u002Fdeno","https:\u002F\u002Fdeno.com","2022","8A31HmVc4GmvzZgLwJKLp_Km8w1T5q_vG3TVVtDOHnQ",{"id":209,"category":152,"extension":141,"icon":210,"level":192,"meta":211,"name":212,"stem":213,"url":214,"year":215,"__hash__":216},"skills\u002Fskills\u002Fdocker.yml","i-logos-docker-icon",{},"Docker","skills\u002Fdocker","https:\u002F\u002Fwww.docker.com","2018","uyfqCF9l6H7XsIozx1X-BUtL2KULygtDHq2cOZARNZ0",{"id":218,"category":140,"extension":141,"icon":219,"level":154,"meta":220,"name":221,"stem":222,"url":223,"year":186,"__hash__":224},"skills\u002Fskills\u002Fdrizzle-orm.yml","\u002Fimages\u002Fskills\u002Fdrizzle.png",{},"Drizzle ORM","skills\u002Fdrizzle-orm","https:\u002F\u002Form.drizzle.team","zWErcCRBV0E4HJ5FqPZd5-J3wK3j9Yw25nOgK2Qy5hw",{"id":226,"category":172,"extension":141,"icon":227,"level":143,"meta":228,"name":229,"stem":230,"url":231,"year":148,"__hash__":232},"skills\u002Fskills\u002Felectron.yml","i-logos-electron",{},"Electron","skills\u002Felectron","https:\u002F\u002Fwww.electronjs.org","fraXMojywwTj5bFfI5bkZhPnQV48uvu0gcmqTT5a4_U",{"id":234,"category":140,"extension":141,"icon":235,"level":154,"meta":236,"name":237,"stem":238,"url":239,"year":215,"__hash__":240},"skills\u002Fskills\u002Fexpress.yml","i-simple-icons-express",{},"Express","skills\u002Fexpress","https:\u002F\u002Fexpressjs.com","HDN_-ZUR4vI-cmgZ4yy84nm94T5rgkV3mr3PQjeBwe4",{"id":242,"category":172,"extension":141,"icon":243,"level":143,"meta":244,"name":122,"stem":245,"url":246,"year":247,"__hash__":248},"skills\u002Fskills\u002Fffmpeg.yml","i-logos-ffmpeg-icon",{},"skills\u002Fffmpeg","https:\u002F\u002Fffmpeg.org","2020","ApV9_VXvOROhOvHzPYhx23qctHIqsAdUiIIvG6U8HeE",{"id":250,"category":172,"extension":141,"icon":251,"level":154,"meta":252,"name":253,"stem":254,"url":255,"year":159,"__hash__":256},"skills\u002Fskills\u002Ffigma.yml","i-logos-figma",{},"Figma","skills\u002Ffigma","https:\u002F\u002Fwww.figma.com","7YpzoWeTiTmAMs8PL1jIfpLLzHc028OaNC-k2XmWF7c",{"id":258,"category":259,"extension":141,"icon":260,"level":154,"meta":261,"name":262,"stem":263,"url":264,"year":247,"__hash__":265},"skills\u002Fskills\u002Ffirebase.yml","Data","i-logos-firebase",{},"Firebase","skills\u002Ffirebase","https:\u002F\u002Ffirebase.google.com","2BZXkjqAiQI7NcBh95AwkW55Kg9OYJcTd4g7BZlVyH8",{"id":267,"category":140,"extension":141,"icon":268,"level":192,"meta":269,"name":270,"stem":271,"url":272,"year":186,"__hash__":273},"skills\u002Fskills\u002Fgo.yml","i-logos-go",{},"Go","skills\u002Fgo","https:\u002F\u002Fgo.dev","jfqLu9ALZexHbFIxbNX4hXCa9YWsGQ_J879h7nG3Mwg",{"id":275,"category":152,"extension":141,"icon":276,"level":154,"meta":277,"name":278,"stem":279,"url":280,"year":281,"__hash__":282},"skills\u002Fskills\u002Fgrafana.yml","i-logos-grafana",{},"Grafana","skills\u002Fgrafana","https:\u002F\u002Fgrafana.com","2019","bAJDLy0__P9oiyY9zBlhcQLKAc6ijpLfODLoQFmcXRk",{"id":284,"category":190,"extension":141,"icon":285,"level":192,"meta":286,"name":287,"stem":288,"url":289,"year":197,"__hash__":290},"skills\u002Fskills\u002Fhtml.yml","i-logos-html-5",{},"HTML","skills\u002Fhtml","https:\u002F\u002Fdeveloper.mozilla.org\u002Fdocs\u002FWeb\u002FHTML","uKm-23PNdCtyRNJPSwsp0T81LlpZYyDem_nanppkV40",{"id":292,"category":190,"extension":141,"icon":293,"level":192,"meta":294,"name":295,"stem":296,"url":297,"year":298,"__hash__":299},"skills\u002Fskills\u002Fjavascript.yml","i-logos-javascript",{},"JavaScript","skills\u002Fjavascript","https:\u002F\u002Fdeveloper.mozilla.org\u002Fdocs\u002FWeb\u002FJavaScript","2017","IAVd2T2nFt-Keg7ky5OkJQv0XHXgH5Q6azMVo_EwOZc",{"id":301,"category":302,"extension":141,"icon":303,"level":143,"meta":304,"name":305,"stem":306,"url":307,"year":308,"__hash__":309},"skills\u002Fskills\u002Fk6.yml","Testing","i-simple-icons-k6",{},"k6","skills\u002Fk6","https:\u002F\u002Fk6.io","2025","9LQe3jOXpzWYeu4o8j4frNKF_kRfmU34bztg9h0iybs",{"id":311,"category":152,"extension":141,"icon":312,"level":154,"meta":313,"name":314,"stem":315,"url":316,"year":159,"__hash__":317},"skills\u002Fskills\u002Fkubernetes.yml","i-logos-kubernetes",{},"Kubernetes","skills\u002Fkubernetes","https:\u002F\u002Fkubernetes.io","QZKWLGxmYYLjqMaWXYElwW6LzZIhRiWviV7EqzTuf20",{"id":319,"category":152,"extension":141,"icon":320,"level":143,"meta":321,"name":322,"stem":323,"url":324,"year":308,"__hash__":325},"skills\u002Fskills\u002Floki.yml","\u002Fimages\u002Fskills\u002Floki.png",{},"Loki","skills\u002Floki","https:\u002F\u002Fgrafana.com\u002Foss\u002Floki","6XbX8pKz3kJ-UNj2sa0D5jiJpCuOjHZPHW6K0p9yc5c",{"id":327,"category":259,"extension":141,"icon":328,"level":154,"meta":329,"name":330,"stem":331,"url":332,"year":247,"__hash__":333},"skills\u002Fskills\u002Fmongodb.yml","i-logos-mongodb-icon",{},"MongoDB","skills\u002Fmongodb","https:\u002F\u002Fwww.mongodb.com","vAymZsawe3eHWefRddwCPUkOz4ENH0f27f3c7qoPaiU",{"id":335,"category":140,"extension":141,"icon":336,"level":154,"meta":337,"name":338,"stem":339,"url":340,"year":159,"__hash__":341},"skills\u002Fskills\u002Fnest.yml","i-logos-nestjs",{},"Nest","skills\u002Fnest","https:\u002F\u002Fnestjs.com","_k_OLI2yWacjZ6bnL_2SY5foR4PTtG05W754HMLaw84",{"id":343,"category":140,"extension":141,"icon":344,"level":192,"meta":345,"name":346,"stem":347,"url":348,"year":215,"__hash__":349},"skills\u002Fskills\u002Fnode-js.yml","i-logos-nodejs-icon",{},"Node.js","skills\u002Fnode-js","https:\u002F\u002Fnodejs.org","EDZpDGWxfyGs0KkLE0Lb99w_kAQ3M6Q7drthHbUYEY0",{"id":351,"category":190,"extension":141,"icon":352,"level":192,"meta":353,"name":96,"stem":354,"url":355,"year":206,"__hash__":356},"skills\u002Fskills\u002Fnuxt.yml","i-logos-nuxt-icon",{},"skills\u002Fnuxt","https:\u002F\u002Fnuxt.com","kH1NvQG2PGmpWgMoKRLQGjTCwFTGQmiXgMDGdRNAcOI",{"id":358,"category":190,"extension":141,"icon":352,"level":154,"meta":359,"name":360,"stem":361,"url":362,"year":168,"__hash__":363},"skills\u002Fskills\u002Fnuxt-content.yml",{},"Nuxt Content","skills\u002Fnuxt-content","https:\u002F\u002Fcontent.nuxt.com","RgsSePMO7r_6Hu61Hnfy5f4ll2ofq37vk0rJxmPjfg0",{"id":365,"category":190,"extension":141,"icon":352,"level":154,"meta":366,"name":367,"stem":368,"url":369,"year":168,"__hash__":370},"skills\u002Fskills\u002Fnuxt-ui.yml",{},"Nuxt UI","skills\u002Fnuxt-ui","https:\u002F\u002Fui.nuxt.com","e8h3Pmq1FaZ6dXccd_HW3_NTbNofuk5zfmn7_FmlBnU",{"id":372,"category":140,"extension":141,"icon":373,"level":143,"meta":374,"name":375,"stem":376,"url":377,"year":378,"__hash__":379},"skills\u002Fskills\u002Fphp.yml","i-logos-php",{},"PHP","skills\u002Fphp","https:\u002F\u002Fwww.php.net","2016","s1Q64crnDcVTJ7GDn-w43Gl5HMI8gYVM7AOWotWdEWc",{"id":381,"category":190,"extension":141,"icon":382,"level":154,"meta":383,"name":384,"stem":385,"url":386,"year":206,"__hash__":387},"skills\u002Fskills\u002Fpinia.yml","i-logos-pinia",{},"Pinia","skills\u002Fpinia","https:\u002F\u002Fpinia.vuejs.org","otf3EcrCxdIwH7CiBpeIxBI-K0pma63F5TzHHSN51IA",{"id":389,"category":302,"extension":141,"icon":390,"level":154,"meta":391,"name":392,"stem":393,"url":394,"year":168,"__hash__":395},"skills\u002Fskills\u002Fplaywright.yml","i-logos-playwright",{},"Playwright","skills\u002Fplaywright","https:\u002F\u002Fplaywright.dev","U-Tn8P9DTjsve7P0YEyG-yEgkuI9kLgoY3KIcnUZ8Qw",{"id":397,"category":259,"extension":141,"icon":398,"level":192,"meta":399,"name":400,"stem":401,"url":402,"year":168,"__hash__":403},"skills\u002Fskills\u002Fpostgres.yml","i-logos-postgresql",{},"Postgres","skills\u002Fpostgres","https:\u002F\u002Fwww.postgresql.org","SkbJBjm46QnLyVmsyIEO7LGDxT46TkJ5yLBcO-KOl3A",{"id":405,"category":140,"extension":141,"icon":406,"level":154,"meta":407,"name":408,"stem":409,"url":410,"year":186,"__hash__":411},"skills\u002Fskills\u002Fprisma.yml","i-logos-prisma",{},"Prisma","skills\u002Fprisma","https:\u002F\u002Fwww.prisma.io","q8u6bLwKxVNFZN18eMkhkkQW9KO1tzZzNCryalAhOQU",{"id":413,"category":152,"extension":141,"icon":414,"level":143,"meta":415,"name":416,"stem":417,"url":418,"year":308,"__hash__":419},"skills\u002Fskills\u002Fprometheus.yml","i-logos-prometheus",{},"Prometheus","skills\u002Fprometheus","https:\u002F\u002Fprometheus.io","wFPFPMT9NMAGyNakkGxpy1sdEZkiIYGD14Z-a9iSh7Y",{"id":421,"category":140,"extension":141,"icon":422,"level":143,"meta":423,"name":424,"stem":425,"url":426,"year":168,"__hash__":427},"skills\u002Fskills\u002Fpruvious.yml","\u002Fimages\u002Fskills\u002Fpruvious.svg",{},"Pruvious","skills\u002Fpruvious","https:\u002F\u002Fpruvious.com","OPpO35l5b9442tiQxW7FFq8LEVi8h2xGuNHgriT2UXM",{"id":429,"category":190,"extension":141,"icon":430,"level":154,"meta":431,"name":432,"stem":433,"url":434,"year":215,"__hash__":435},"skills\u002Fskills\u002Freact.yml","i-logos-react",{},"React","skills\u002Freact","https:\u002F\u002Freact.dev","0GbioLLfFPZRDh0rOzkolvqdcZFEEMKUh0_3lzOVaL4",{"id":437,"category":259,"extension":141,"icon":438,"level":154,"meta":439,"name":440,"stem":441,"url":442,"year":168,"__hash__":443},"skills\u002Fskills\u002Fsqlite.yml","i-logos-sqlite",{},"SQLite","skills\u002Fsqlite","https:\u002F\u002Fwww.sqlite.org","gHx-0xMVX6TE88ObCbbLoWfkLG1t3B_z6zSzT8m__fI",{"id":445,"category":140,"extension":141,"icon":446,"level":154,"meta":447,"name":448,"stem":449,"url":450,"year":186,"__hash__":451},"skills\u002Fskills\u002Fstripe.yml","i-logos-stripe",{},"Stripe","skills\u002Fstripe","https:\u002F\u002Fstripe.com","UGj0EO6yOfztwtcQ_wMiqUU1UYgTLbB5jxl9e-asFpA",{"id":453,"category":190,"extension":141,"icon":454,"level":192,"meta":455,"name":456,"stem":457,"url":458,"year":186,"__hash__":459},"skills\u002Fskills\u002Ftailwind.yml","i-logos-tailwindcss-icon",{},"Tailwind","skills\u002Ftailwind","https:\u002F\u002Ftailwindcss.com","VkKWaTtKA70dUgAsMIDKN8N94TH1MsU8-b1kPUx-Wq8",{"id":461,"category":190,"extension":141,"icon":462,"level":143,"meta":463,"name":464,"stem":465,"url":466,"year":308,"__hash__":467},"skills\u002Fskills\u002Ftiptap.yml","i-custom-tiptap",{},"Tiptap","skills\u002Ftiptap","https:\u002F\u002Ftiptap.dev","gBw3cx61wA-4kZNeChkBoB38Z2aS7Y5P7_ufagI8BSU",{"id":469,"category":152,"extension":141,"icon":470,"level":143,"meta":471,"name":472,"stem":473,"url":474,"year":186,"__hash__":475},"skills\u002Fskills\u002Ftraefik.yml","i-simple-icons-traefikproxy",{},"Traefik","skills\u002Ftraefik","https:\u002F\u002Ftraefik.io","o-rECQEfSq4kbulKrfx14EeER1PTEYFavnEQHhAuaBw",{"id":477,"category":190,"extension":141,"icon":478,"level":192,"meta":479,"name":99,"stem":480,"url":481,"year":281,"__hash__":482},"skills\u002Fskills\u002Ftypescript.yml","i-logos-typescript-icon",{},"skills\u002Ftypescript","https:\u002F\u002Fwww.typescriptlang.org","C6S0SKAC_EKz2ITnMm4hCCUKG2P5KsOfbGXqMzFI-EY",{"id":484,"category":172,"extension":141,"icon":485,"level":154,"meta":486,"name":487,"stem":488,"url":489,"year":206,"__hash__":490},"skills\u002Fskills\u002Fvite.yml","i-logos-vitejs",{},"Vite","skills\u002Fvite","https:\u002F\u002Fvite.dev","TpxW7LK8p6-A-XypTE_uBmHo2vAWbB_1Zy8pSt8Ih8A",{"id":492,"category":302,"extension":141,"icon":493,"level":154,"meta":494,"name":495,"stem":496,"url":497,"year":186,"__hash__":498},"skills\u002Fskills\u002Fvitest.yml","i-logos-vitest",{},"Vitest","skills\u002Fvitest","https:\u002F\u002Fvitest.dev","IS5nla0e3iC4ACuhoQjqBEdsXwdYY2WRZ118YrtMNHg",{"id":500,"category":190,"extension":141,"icon":501,"level":192,"meta":502,"name":503,"stem":504,"url":505,"year":281,"__hash__":506},"skills\u002Fskills\u002Fvue.yml","i-logos-vue",{},"Vue","skills\u002Fvue","https:\u002F\u002Fvuejs.org","F0ztv5f98yIVCbyfDGbwlJ22KROp3yL3Izjp0VBWlAU",{"id":508,"category":190,"extension":141,"icon":509,"level":143,"meta":510,"name":511,"stem":512,"url":513,"year":159,"__hash__":514},"skills\u002Fskills\u002Fvuetify.yml","i-logos-vuetifyjs",{},"Vuetify","skills\u002Fvuetify","https:\u002F\u002Fvuetifyjs.com","g2xXVDYSXlGLfnyLDkx3zPBVc3BCYEiGx5Ilh5-pTT4",{"id":516,"category":190,"extension":141,"icon":517,"level":154,"meta":518,"name":519,"stem":520,"url":521,"year":186,"__hash__":522},"skills\u002Fskills\u002Fvueuse.yml","i-logos-vueuse",{},"VueUse","skills\u002Fvueuse","https:\u002F\u002Fvueuse.org","-6U_Vo_7APwR3Oo6rLI2mWO_Emse0aAoL1vL4noxZEk",{"id":524,"category":172,"extension":141,"icon":525,"level":154,"meta":526,"name":527,"stem":528,"url":529,"year":186,"__hash__":530},"skills\u002Fskills\u002Fwhisper.yml","i-simple-icons-openai",{},"Whisper","skills\u002Fwhisper","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fwhisper","KtdfiQb3uVjd4DFgV3SN8y6xCAu-eP81lC8nH3NM0S8",{"id":532,"category":140,"extension":141,"icon":533,"level":154,"meta":534,"name":535,"stem":536,"url":537,"year":186,"__hash__":538},"skills\u002Fskills\u002Fzod.yml","i-logos-zod",{},"Zod","skills\u002Fzod","https:\u002F\u002Fzod.dev","DLk6ZAEEgRjsJqbGw9uXcZmhZaVQZj7gSbhWpolBDNk",1784578080523]