[{"data":1,"prerenderedAt":519},["ShallowReactive",2],{"\u002Fprojects\u002Fopenwave":3,"github-\u002Fprojects\u002Fopenwave":108,"skills":114},{"id":4,"title":5,"body":6,"description":85,"extension":86,"featured":87,"image":88,"languages":89,"links":96,"meta":97,"navigation":98,"path":99,"repo":100,"seo":101,"skills":104,"stem":106,"__hash__":107},"projects\u002Fprojects\u002Fopenwave.md","OpenWave",{"type":7,"value":8,"toc":78},"minimark",[9,13,16,21,24,27,65,69,72,75],[10,11,12],"p",{},"Wer auf Windows oder macOS streamt, kennt Elgatos Wave Link: App-Audio zu Kanälen gruppieren, getrennte Mixe für Kopfhörer und Stream fahren und ein aufbereitetes „Clean Mic\" an OBS geben. Auf Linux gibt es das schlicht nicht – dabei bringt PipeWire eigentlich alles mit, was man dafür braucht.",[10,14,15],{},"OpenWave füllt genau diese Lücke: ein in Rust geschriebener Daemon plus GUI, der als reine Policy-Schicht auf dem PipeWire-Graphen arbeitet. Kein eigenes DSP, keine Treiber – PipeWire ist die Engine, OpenWave dirigiert sie.",[17,18,20],"h3",{"id":19},"kanäle-mixe-und-eine-gain-matrix","Kanäle, Mixe und eine Gain-Matrix",[10,22,23],{},"App-Streams werden zu virtuellen Kanälen gruppiert – Discord, Zoom und Teams landen z. B. zusammen im Kanal „Voice Chat\". Jeder Kanal lässt sich über eine vollständige Gain-Matrix auf beliebig viele Mixe routen, mit unabhängiger Lautstärke pro Zelle: Auf den Kopfhörern läuft Musik laut, im Stream-Mix leise.",[10,25,26],{},"Dahinter steckt einiges an PipeWire-Detailarbeit:",[28,29,30,38,49,59],"ul",{},[31,32,33,37],"li",{},[34,35,36],"strong",{},"Selbstheilende Gain-Stages"," – jede aktive Matrix-Zelle ist ein eigenes Loopback-Modul, das erst geladen wird, wenn die Zielknoten wirklich existieren, und sich nach Geräte-Unplug automatisch neu aufbaut.",[31,39,40,43,44,48],{},[34,41,42],{},"Regelbasiertes Auto-Routing"," – neue App-Streams werden per Glob-Regeln auf ",[45,46,47],"code",{},"application.name"," & Co. automatisch ihrem Kanal zugeordnet; das eigentliche Verlinken übernimmt WirePlumber, statt gegen den Session-Manager zu arbeiten.",[31,50,51,54,55,58],{},[34,52,53],{},"Clean Mic"," – eine Echtzeit-FX-Chain aus EQ, Kompressor und DeepFilterNet\u002FRNNoise-Rauschentfernung erscheint als virtuelle Quelle ",[45,56,57],{},"openwave.mic.clean",", von der jede App aufnehmen kann.",[31,60,61,64],{},[34,62,63],{},"Passive Pegel-Meter"," – Level-Messung, ohne den Graphen je aufzuwecken; die Fader in der egui-GUI sind gleichzeitig Live-Peak-Meter.",[17,66,68],{"id":67},"local-first-auch-headless","Local-first, auch headless",[10,70,71],{},"Die gesamte Konfiguration ist eine menschenlesbare TOML-Datei – kein Account, keine Telemetrie, und der komplette Graph übersteht Reboots per Konstruktion. Neben der GUI gibt es eine vollwertige CLI über einen Unix-Socket: Routing, Gains, Mutes, FX-Editing und Live-Meter direkt im Terminal.",[10,73,74],{},"Kurios am Rande: Obwohl OpenWave reine Linux-Software ist, entwickle ich es auf dem Mac – ein Mock-Backend lässt Daemon und GUI ohne PipeWire laufen, und die Integrationstests fahren den echten PipeWire-Stack in einem Fedora-Container hoch, lokal wie in der CI.",[10,76,77],{},"OpenWave ist aktuell Work in Progress – Paketierung für AUR und Flatpak steht schon, ein öffentliches Release noch nicht.",{"title":79,"searchDepth":80,"depth":80,"links":81},"",2,[82,84],{"id":19,"depth":83,"text":20},3,{"id":67,"depth":83,"text":68},"OpenWave ist ein Wave-Link-artiger Audio-Mixer für Linux – App-Gruppierung, mehrere unabhängige Mixe und eine Echtzeit-Mikrofon-FX-Chain auf PipeWire-Basis.","md",false,"\u002Fimages\u002Fprojects\u002Fcards\u002Fopenwave.png",[90,93],{"language":91,"percentage":92},"Rust",90,{"language":94,"percentage":95},"Shell",10,[],{},true,"\u002Fprojects\u002Fopenwave","Niki2k1\u002Fopenwave",{"title":102,"description":103},"OpenWave – Wave-Link-Alternative für Linux","OpenWave ist ein in Rust geschriebener Audio-Mixer für Linux auf PipeWire-Basis – App-Streams zu virtuellen Kanälen gruppieren, per Gain-Matrix auf mehrere Mixe routen und das Mikrofon durch eine Echtzeit-FX-Chain mit Noise Removal schicken.",[105],"docker","projects\u002Fopenwave","W_EO9FJj_NaeGf9DtSo5OVu2-EqpOYdNe5cgkrZtlD4",{"stars":109,"forks":109,"createdAt":110,"pushedAt":111,"commitCount":112,"activity":113},0,"2026-06-11T10:02:35Z","2026-06-11T17:30:12Z",23,[109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,112,109,109,109,109,109],[115,127,138,147,156,165,176,185,194,202,210,218,227,235,244,252,261,269,278,288,296,304,312,320,328,336,343,350,359,367,375,383,391,399,407,415,423,431,439,447,455,463,471,479,487,495,503,511],{"id":116,"category":117,"extension":118,"icon":119,"level":120,"meta":121,"name":122,"stem":123,"url":124,"year":125,"__hash__":126},"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":128,"category":129,"extension":118,"icon":130,"level":131,"meta":132,"name":133,"stem":134,"url":135,"year":136,"__hash__":137},"skills\u002Fskills\u002Fazure.yml","DevOps","i-logos-microsoft-azure","Proficient",{},"Azure","skills\u002Fazure","https:\u002F\u002Fazure.microsoft.com","2021","uhi9OV2kz1bgheQ-n9srKx0HSUYlYI7MuyjObYDUgrQ",{"id":139,"category":117,"extension":118,"icon":140,"level":131,"meta":141,"name":142,"stem":143,"url":144,"year":145,"__hash__":146},"skills\u002Fskills\u002Fbun.yml","i-logos-bun",{},"Bun","skills\u002Fbun","https:\u002F\u002Fbun.sh","2024","bkieq8AIp5NIJh3xetY96f7WfuFNjAMI7oevfWb1W-0",{"id":148,"category":149,"extension":118,"icon":150,"level":120,"meta":151,"name":152,"stem":153,"url":154,"year":125,"__hash__":155},"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":157,"category":129,"extension":118,"icon":158,"level":131,"meta":159,"name":160,"stem":161,"url":162,"year":163,"__hash__":164},"skills\u002Fskills\u002Fcoolify.yml","i-simple-icons-coolify",{},"Coolify","skills\u002Fcoolify","https:\u002F\u002Fcoolify.io","2023","uh7httXSb9SS1ggRLMKgfmPi2mgMtqNgSGUnSDHeAXk",{"id":166,"category":167,"extension":118,"icon":168,"level":169,"meta":170,"name":171,"stem":172,"url":173,"year":174,"__hash__":175},"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":177,"category":117,"extension":118,"icon":178,"level":120,"meta":179,"name":180,"stem":181,"url":182,"year":183,"__hash__":184},"skills\u002Fskills\u002Fdeno.yml","i-logos-deno",{},"Deno","skills\u002Fdeno","https:\u002F\u002Fdeno.com","2022","8A31HmVc4GmvzZgLwJKLp_Km8w1T5q_vG3TVVtDOHnQ",{"id":186,"category":129,"extension":118,"icon":187,"level":169,"meta":188,"name":189,"stem":190,"url":191,"year":192,"__hash__":193},"skills\u002Fskills\u002Fdocker.yml","i-logos-docker-icon",{},"Docker","skills\u002Fdocker","https:\u002F\u002Fwww.docker.com","2018","uyfqCF9l6H7XsIozx1X-BUtL2KULygtDHq2cOZARNZ0",{"id":195,"category":117,"extension":118,"icon":196,"level":131,"meta":197,"name":198,"stem":199,"url":200,"year":163,"__hash__":201},"skills\u002Fskills\u002Fdrizzle-orm.yml","\u002Fimages\u002Fskills\u002Fdrizzle.png",{},"Drizzle ORM","skills\u002Fdrizzle-orm","https:\u002F\u002Form.drizzle.team","zWErcCRBV0E4HJ5FqPZd5-J3wK3j9Yw25nOgK2Qy5hw",{"id":203,"category":149,"extension":118,"icon":204,"level":120,"meta":205,"name":206,"stem":207,"url":208,"year":125,"__hash__":209},"skills\u002Fskills\u002Felectron.yml","i-logos-electron",{},"Electron","skills\u002Felectron","https:\u002F\u002Fwww.electronjs.org","fraXMojywwTj5bFfI5bkZhPnQV48uvu0gcmqTT5a4_U",{"id":211,"category":117,"extension":118,"icon":212,"level":131,"meta":213,"name":214,"stem":215,"url":216,"year":192,"__hash__":217},"skills\u002Fskills\u002Fexpress.yml","i-simple-icons-express",{},"Express","skills\u002Fexpress","https:\u002F\u002Fexpressjs.com","HDN_-ZUR4vI-cmgZ4yy84nm94T5rgkV3mr3PQjeBwe4",{"id":219,"category":149,"extension":118,"icon":220,"level":120,"meta":221,"name":222,"stem":223,"url":224,"year":225,"__hash__":226},"skills\u002Fskills\u002Fffmpeg.yml","i-logos-ffmpeg-icon",{},"ffmpeg","skills\u002Fffmpeg","https:\u002F\u002Fffmpeg.org","2020","ApV9_VXvOROhOvHzPYhx23qctHIqsAdUiIIvG6U8HeE",{"id":228,"category":149,"extension":118,"icon":229,"level":131,"meta":230,"name":231,"stem":232,"url":233,"year":136,"__hash__":234},"skills\u002Fskills\u002Ffigma.yml","i-logos-figma",{},"Figma","skills\u002Ffigma","https:\u002F\u002Fwww.figma.com","7YpzoWeTiTmAMs8PL1jIfpLLzHc028OaNC-k2XmWF7c",{"id":236,"category":237,"extension":118,"icon":238,"level":131,"meta":239,"name":240,"stem":241,"url":242,"year":225,"__hash__":243},"skills\u002Fskills\u002Ffirebase.yml","Data","i-logos-firebase",{},"Firebase","skills\u002Ffirebase","https:\u002F\u002Ffirebase.google.com","2BZXkjqAiQI7NcBh95AwkW55Kg9OYJcTd4g7BZlVyH8",{"id":245,"category":117,"extension":118,"icon":246,"level":169,"meta":247,"name":248,"stem":249,"url":250,"year":163,"__hash__":251},"skills\u002Fskills\u002Fgo.yml","i-logos-go",{},"Go","skills\u002Fgo","https:\u002F\u002Fgo.dev","jfqLu9ALZexHbFIxbNX4hXCa9YWsGQ_J879h7nG3Mwg",{"id":253,"category":129,"extension":118,"icon":254,"level":131,"meta":255,"name":256,"stem":257,"url":258,"year":259,"__hash__":260},"skills\u002Fskills\u002Fgrafana.yml","i-logos-grafana",{},"Grafana","skills\u002Fgrafana","https:\u002F\u002Fgrafana.com","2019","bAJDLy0__P9oiyY9zBlhcQLKAc6ijpLfODLoQFmcXRk",{"id":262,"category":167,"extension":118,"icon":263,"level":169,"meta":264,"name":265,"stem":266,"url":267,"year":174,"__hash__":268},"skills\u002Fskills\u002Fhtml.yml","i-logos-html-5",{},"HTML","skills\u002Fhtml","https:\u002F\u002Fdeveloper.mozilla.org\u002Fdocs\u002FWeb\u002FHTML","uKm-23PNdCtyRNJPSwsp0T81LlpZYyDem_nanppkV40",{"id":270,"category":167,"extension":118,"icon":271,"level":169,"meta":272,"name":273,"stem":274,"url":275,"year":276,"__hash__":277},"skills\u002Fskills\u002Fjavascript.yml","i-logos-javascript",{},"JavaScript","skills\u002Fjavascript","https:\u002F\u002Fdeveloper.mozilla.org\u002Fdocs\u002FWeb\u002FJavaScript","2017","IAVd2T2nFt-Keg7ky5OkJQv0XHXgH5Q6azMVo_EwOZc",{"id":279,"category":280,"extension":118,"icon":281,"level":120,"meta":282,"name":283,"stem":284,"url":285,"year":286,"__hash__":287},"skills\u002Fskills\u002Fk6.yml","Testing","i-simple-icons-k6",{},"k6","skills\u002Fk6","https:\u002F\u002Fk6.io","2025","9LQe3jOXpzWYeu4o8j4frNKF_kRfmU34bztg9h0iybs",{"id":289,"category":129,"extension":118,"icon":290,"level":131,"meta":291,"name":292,"stem":293,"url":294,"year":136,"__hash__":295},"skills\u002Fskills\u002Fkubernetes.yml","i-logos-kubernetes",{},"Kubernetes","skills\u002Fkubernetes","https:\u002F\u002Fkubernetes.io","QZKWLGxmYYLjqMaWXYElwW6LzZIhRiWviV7EqzTuf20",{"id":297,"category":129,"extension":118,"icon":298,"level":120,"meta":299,"name":300,"stem":301,"url":302,"year":286,"__hash__":303},"skills\u002Fskills\u002Floki.yml","\u002Fimages\u002Fskills\u002Floki.png",{},"Loki","skills\u002Floki","https:\u002F\u002Fgrafana.com\u002Foss\u002Floki","6XbX8pKz3kJ-UNj2sa0D5jiJpCuOjHZPHW6K0p9yc5c",{"id":305,"category":237,"extension":118,"icon":306,"level":131,"meta":307,"name":308,"stem":309,"url":310,"year":225,"__hash__":311},"skills\u002Fskills\u002Fmongodb.yml","i-logos-mongodb-icon",{},"MongoDB","skills\u002Fmongodb","https:\u002F\u002Fwww.mongodb.com","vAymZsawe3eHWefRddwCPUkOz4ENH0f27f3c7qoPaiU",{"id":313,"category":117,"extension":118,"icon":314,"level":131,"meta":315,"name":316,"stem":317,"url":318,"year":136,"__hash__":319},"skills\u002Fskills\u002Fnest.yml","i-logos-nestjs",{},"Nest","skills\u002Fnest","https:\u002F\u002Fnestjs.com","_k_OLI2yWacjZ6bnL_2SY5foR4PTtG05W754HMLaw84",{"id":321,"category":117,"extension":118,"icon":322,"level":169,"meta":323,"name":324,"stem":325,"url":326,"year":192,"__hash__":327},"skills\u002Fskills\u002Fnode-js.yml","i-logos-nodejs-icon",{},"Node.js","skills\u002Fnode-js","https:\u002F\u002Fnodejs.org","EDZpDGWxfyGs0KkLE0Lb99w_kAQ3M6Q7drthHbUYEY0",{"id":329,"category":167,"extension":118,"icon":330,"level":169,"meta":331,"name":332,"stem":333,"url":334,"year":183,"__hash__":335},"skills\u002Fskills\u002Fnuxt.yml","i-logos-nuxt-icon",{},"Nuxt","skills\u002Fnuxt","https:\u002F\u002Fnuxt.com","kH1NvQG2PGmpWgMoKRLQGjTCwFTGQmiXgMDGdRNAcOI",{"id":337,"category":167,"extension":118,"icon":330,"level":131,"meta":338,"name":339,"stem":340,"url":341,"year":145,"__hash__":342},"skills\u002Fskills\u002Fnuxt-content.yml",{},"Nuxt Content","skills\u002Fnuxt-content","https:\u002F\u002Fcontent.nuxt.com","RgsSePMO7r_6Hu61Hnfy5f4ll2ofq37vk0rJxmPjfg0",{"id":344,"category":167,"extension":118,"icon":330,"level":131,"meta":345,"name":346,"stem":347,"url":348,"year":145,"__hash__":349},"skills\u002Fskills\u002Fnuxt-ui.yml",{},"Nuxt UI","skills\u002Fnuxt-ui","https:\u002F\u002Fui.nuxt.com","e8h3Pmq1FaZ6dXccd_HW3_NTbNofuk5zfmn7_FmlBnU",{"id":351,"category":117,"extension":118,"icon":352,"level":120,"meta":353,"name":354,"stem":355,"url":356,"year":357,"__hash__":358},"skills\u002Fskills\u002Fphp.yml","i-logos-php",{},"PHP","skills\u002Fphp","https:\u002F\u002Fwww.php.net","2016","s1Q64crnDcVTJ7GDn-w43Gl5HMI8gYVM7AOWotWdEWc",{"id":360,"category":167,"extension":118,"icon":361,"level":131,"meta":362,"name":363,"stem":364,"url":365,"year":183,"__hash__":366},"skills\u002Fskills\u002Fpinia.yml","i-logos-pinia",{},"Pinia","skills\u002Fpinia","https:\u002F\u002Fpinia.vuejs.org","otf3EcrCxdIwH7CiBpeIxBI-K0pma63F5TzHHSN51IA",{"id":368,"category":280,"extension":118,"icon":369,"level":131,"meta":370,"name":371,"stem":372,"url":373,"year":145,"__hash__":374},"skills\u002Fskills\u002Fplaywright.yml","i-logos-playwright",{},"Playwright","skills\u002Fplaywright","https:\u002F\u002Fplaywright.dev","U-Tn8P9DTjsve7P0YEyG-yEgkuI9kLgoY3KIcnUZ8Qw",{"id":376,"category":237,"extension":118,"icon":377,"level":169,"meta":378,"name":379,"stem":380,"url":381,"year":145,"__hash__":382},"skills\u002Fskills\u002Fpostgres.yml","i-logos-postgresql",{},"Postgres","skills\u002Fpostgres","https:\u002F\u002Fwww.postgresql.org","SkbJBjm46QnLyVmsyIEO7LGDxT46TkJ5yLBcO-KOl3A",{"id":384,"category":117,"extension":118,"icon":385,"level":131,"meta":386,"name":387,"stem":388,"url":389,"year":163,"__hash__":390},"skills\u002Fskills\u002Fprisma.yml","i-logos-prisma",{},"Prisma","skills\u002Fprisma","https:\u002F\u002Fwww.prisma.io","q8u6bLwKxVNFZN18eMkhkkQW9KO1tzZzNCryalAhOQU",{"id":392,"category":129,"extension":118,"icon":393,"level":120,"meta":394,"name":395,"stem":396,"url":397,"year":286,"__hash__":398},"skills\u002Fskills\u002Fprometheus.yml","i-logos-prometheus",{},"Prometheus","skills\u002Fprometheus","https:\u002F\u002Fprometheus.io","wFPFPMT9NMAGyNakkGxpy1sdEZkiIYGD14Z-a9iSh7Y",{"id":400,"category":117,"extension":118,"icon":401,"level":120,"meta":402,"name":403,"stem":404,"url":405,"year":145,"__hash__":406},"skills\u002Fskills\u002Fpruvious.yml","\u002Fimages\u002Fskills\u002Fpruvious.svg",{},"Pruvious","skills\u002Fpruvious","https:\u002F\u002Fpruvious.com","OPpO35l5b9442tiQxW7FFq8LEVi8h2xGuNHgriT2UXM",{"id":408,"category":167,"extension":118,"icon":409,"level":131,"meta":410,"name":411,"stem":412,"url":413,"year":192,"__hash__":414},"skills\u002Fskills\u002Freact.yml","i-logos-react",{},"React","skills\u002Freact","https:\u002F\u002Freact.dev","0GbioLLfFPZRDh0rOzkolvqdcZFEEMKUh0_3lzOVaL4",{"id":416,"category":237,"extension":118,"icon":417,"level":131,"meta":418,"name":419,"stem":420,"url":421,"year":145,"__hash__":422},"skills\u002Fskills\u002Fsqlite.yml","i-logos-sqlite",{},"SQLite","skills\u002Fsqlite","https:\u002F\u002Fwww.sqlite.org","gHx-0xMVX6TE88ObCbbLoWfkLG1t3B_z6zSzT8m__fI",{"id":424,"category":117,"extension":118,"icon":425,"level":131,"meta":426,"name":427,"stem":428,"url":429,"year":163,"__hash__":430},"skills\u002Fskills\u002Fstripe.yml","i-logos-stripe",{},"Stripe","skills\u002Fstripe","https:\u002F\u002Fstripe.com","UGj0EO6yOfztwtcQ_wMiqUU1UYgTLbB5jxl9e-asFpA",{"id":432,"category":167,"extension":118,"icon":433,"level":169,"meta":434,"name":435,"stem":436,"url":437,"year":163,"__hash__":438},"skills\u002Fskills\u002Ftailwind.yml","i-logos-tailwindcss-icon",{},"Tailwind","skills\u002Ftailwind","https:\u002F\u002Ftailwindcss.com","VkKWaTtKA70dUgAsMIDKN8N94TH1MsU8-b1kPUx-Wq8",{"id":440,"category":167,"extension":118,"icon":441,"level":120,"meta":442,"name":443,"stem":444,"url":445,"year":286,"__hash__":446},"skills\u002Fskills\u002Ftiptap.yml","i-custom-tiptap",{},"Tiptap","skills\u002Ftiptap","https:\u002F\u002Ftiptap.dev","gBw3cx61wA-4kZNeChkBoB38Z2aS7Y5P7_ufagI8BSU",{"id":448,"category":129,"extension":118,"icon":449,"level":120,"meta":450,"name":451,"stem":452,"url":453,"year":163,"__hash__":454},"skills\u002Fskills\u002Ftraefik.yml","i-simple-icons-traefikproxy",{},"Traefik","skills\u002Ftraefik","https:\u002F\u002Ftraefik.io","o-rECQEfSq4kbulKrfx14EeER1PTEYFavnEQHhAuaBw",{"id":456,"category":167,"extension":118,"icon":457,"level":169,"meta":458,"name":459,"stem":460,"url":461,"year":259,"__hash__":462},"skills\u002Fskills\u002Ftypescript.yml","i-logos-typescript-icon",{},"TypeScript","skills\u002Ftypescript","https:\u002F\u002Fwww.typescriptlang.org","C6S0SKAC_EKz2ITnMm4hCCUKG2P5KsOfbGXqMzFI-EY",{"id":464,"category":149,"extension":118,"icon":465,"level":131,"meta":466,"name":467,"stem":468,"url":469,"year":183,"__hash__":470},"skills\u002Fskills\u002Fvite.yml","i-logos-vitejs",{},"Vite","skills\u002Fvite","https:\u002F\u002Fvite.dev","TpxW7LK8p6-A-XypTE_uBmHo2vAWbB_1Zy8pSt8Ih8A",{"id":472,"category":280,"extension":118,"icon":473,"level":131,"meta":474,"name":475,"stem":476,"url":477,"year":163,"__hash__":478},"skills\u002Fskills\u002Fvitest.yml","i-logos-vitest",{},"Vitest","skills\u002Fvitest","https:\u002F\u002Fvitest.dev","IS5nla0e3iC4ACuhoQjqBEdsXwdYY2WRZ118YrtMNHg",{"id":480,"category":167,"extension":118,"icon":481,"level":169,"meta":482,"name":483,"stem":484,"url":485,"year":259,"__hash__":486},"skills\u002Fskills\u002Fvue.yml","i-logos-vue",{},"Vue","skills\u002Fvue","https:\u002F\u002Fvuejs.org","F0ztv5f98yIVCbyfDGbwlJ22KROp3yL3Izjp0VBWlAU",{"id":488,"category":167,"extension":118,"icon":489,"level":120,"meta":490,"name":491,"stem":492,"url":493,"year":136,"__hash__":494},"skills\u002Fskills\u002Fvuetify.yml","i-logos-vuetifyjs",{},"Vuetify","skills\u002Fvuetify","https:\u002F\u002Fvuetifyjs.com","g2xXVDYSXlGLfnyLDkx3zPBVc3BCYEiGx5Ilh5-pTT4",{"id":496,"category":167,"extension":118,"icon":497,"level":131,"meta":498,"name":499,"stem":500,"url":501,"year":163,"__hash__":502},"skills\u002Fskills\u002Fvueuse.yml","i-logos-vueuse",{},"VueUse","skills\u002Fvueuse","https:\u002F\u002Fvueuse.org","-6U_Vo_7APwR3Oo6rLI2mWO_Emse0aAoL1vL4noxZEk",{"id":504,"category":149,"extension":118,"icon":505,"level":131,"meta":506,"name":507,"stem":508,"url":509,"year":163,"__hash__":510},"skills\u002Fskills\u002Fwhisper.yml","i-simple-icons-openai",{},"Whisper","skills\u002Fwhisper","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fwhisper","KtdfiQb3uVjd4DFgV3SN8y6xCAu-eP81lC8nH3NM0S8",{"id":512,"category":117,"extension":118,"icon":513,"level":131,"meta":514,"name":515,"stem":516,"url":517,"year":163,"__hash__":518},"skills\u002Fskills\u002Fzod.yml","i-logos-zod",{},"Zod","skills\u002Fzod","https:\u002F\u002Fzod.dev","DLk6ZAEEgRjsJqbGw9uXcZmhZaVQZj7gSbhWpolBDNk",1784578080523]