[{"data":1,"prerenderedAt":478},["ShallowReactive",2],{"projects-en-my-website\u002F":3,"projects-job-en-my-website\u002F":6,"all-projects-pages-en":124},{"id":4,"title":5,"audience":6,"body":7,"carouselItems":103,"client":6,"companyName":6,"date":6,"description":107,"end_date":6,"eventDate":6,"eventDuration":6,"eventName":6,"extension":108,"highlightWord":6,"icon":6,"images":6,"job":6,"kind":109,"label":6,"launch_date":6,"link":110,"logo":111,"mainTitle":6,"meta":112,"navigation":113,"order":99,"path":114,"podcastId":6,"related":6,"repo":6,"role":115,"seo":116,"series":6,"start_date":117,"stats":6,"status":118,"stem":119,"subtitle":120,"tags":6,"techs":121,"titleHighlight":122,"updates":6,"videoId":6,"views":6,"watchTime":6,"__hash__":123},"projects\u002Fprojects\u002Fen\u002Fmy-website.md","marius-hoegger.ch",null,{"type":8,"value":9,"toc":94},"minimark",[10,17,22,26,30,33,37,40,84,88],[11,12],"image-carousel",{":height":13,":items":14,":label":15,":width":16},"375","carouselItems","title","600",[18,19,21],"h3",{"id":20},"starting-point","Starting point",[23,24,25],"p",{},"Talks, webinars, podcast episodes and blog posts were scattered across YouTube,\nSpotify, LinkedIn and event pages. I wanted one place that brings it all\ntogether and shows how I think about AI and what I build.",[18,27,29],{"id":28},"the-website","The website",[23,31,32],{},"Technically the site is deliberately simple: Nuxt with Nuxt Content, all\ncontent as Markdown files, built statically and served from GitHub Pages. Every\nmerge to the main branch is published automatically. The visual motif is the\nhexagon, from the image grid on the home page to the timeline of all posts.\nSince May 2026 the site is also available in English.",[18,34,36],{"id":35},"ai-in-the-workflow","AI in the workflow",[23,38,39],{},"More interesting than the site itself is how it is maintained. I work with\nClaude Code directly in the repository, and the repository is set up for it:",[41,42,43,56,62,68,78],"ul",{},[44,45,46,50,51,55],"li",{},[47,48,49],"strong",{},"Project knowledge for the agent",": a ",[52,53,54],"code",{},"CLAUDE.md"," describes the site's\nstructure, conventions and rules, so every session starts from the same\nbaseline instead of exploring the code first.",[44,57,58,61],{},[47,59,60],{},"Translation as a subagent",": German is the source. A dedicated translation\nagent mirrors every file into the English folder, carries frontmatter, image\npaths and embedded components over unchanged and keeps the interface's\nlanguage files in sync. Tone and rules live in the agent definition, not in my\nhead.",[44,63,64,67],{},[47,65,66],{},"Skills for recurring copy",": for LinkedIn there are skills that write the\nprofile summary and the experience entries straight from the website's\ncontent. The website is the single source everything else is built from.",[44,69,70,73,74,77],{},[47,71,72],{},"Readable for AI",": the site serves an ",[52,75,76],{},"llms.txt"," generated at build time\nfrom the same content as the pages themselves. New posts appear there\nautomatically, without anyone touching the file.",[44,79,80,83],{},[47,81,82],{},"A feed that fills itself",": talks, podcast episodes, blog posts and project\nupdates flow from their own collections into one shared timeline. A new\nproject with a launch date creates its own entry under \"Latest\".",[18,85,87],{"id":86},"what-i-learned","What I learned",[23,89,90,91,93],{},"An AI works in a repository only as well as the repository lets it. Since the\nrules live in ",[52,92,54],{},", agents and skills instead of being re-explained every\nsession, the results are more consistent and I review more than I write. It is\nthe same lesson I pass on in client projects.",{"title":95,"searchDepth":96,"depth":96,"links":97},"",2,[98,100,101,102],{"id":20,"depth":99,"text":21},3,{"id":28,"depth":99,"text":29},{"id":35,"depth":99,"text":36},{"id":86,"depth":99,"text":87},[104,105,106],"\u002Fimages\u002Fprojects\u002Fmy-website\u002Fscreen_home_1200x750.png","\u002Fimages\u002Fprojects\u002Fmy-website\u002Fscreen_timeline_1200x750.png","\u002Fimages\u002Fprojects\u002Fmy-website\u002Fscreen_llms_1200x750.png","The site you are on right now: talks, podcast, projects and career in German and English. Technically a static Nuxt site; the interesting part is the workflow behind it, where translation, copy and discoverability run through my own agents and skills in Claude Code.","md","private","https:\u002F\u002Fmarius-hoegger.ch","\u002Fimages\u002Fprojects\u002Fmy-website\u002Fmy_website.png",{},true,"\u002Fprojects\u002Fen\u002Fmy-website","Concept, design, development, content",{"title":5,"description":107},"2024-06-06","live","projects\u002Fen\u002Fmy-website","My personal website, maintained with AI agents","Nuxt, Nuxt Content, Tailwind CSS, Nuxt i18n, Claude Code, GitHub Actions, GitHub Pages",".ch","4hn2EnrASedRgotGwIjcjBK1fsq65jAEyIS-K5svsgU",[125,183,274,373],{"id":4,"title":5,"audience":6,"body":126,"carouselItems":180,"client":6,"companyName":6,"date":6,"description":107,"end_date":6,"eventDate":6,"eventDuration":6,"eventName":6,"extension":108,"highlightWord":6,"icon":6,"images":6,"job":6,"kind":109,"label":6,"launch_date":6,"link":110,"logo":111,"mainTitle":6,"meta":181,"navigation":113,"order":99,"path":114,"podcastId":6,"related":6,"repo":6,"role":115,"seo":182,"series":6,"start_date":117,"stats":6,"status":118,"stem":119,"subtitle":120,"tags":6,"techs":121,"titleHighlight":122,"updates":6,"videoId":6,"views":6,"watchTime":6,"__hash__":123},{"type":8,"value":127,"toc":174},[128,130,132,134,136,138,140,142,168,170],[11,129],{":height":13,":items":14,":label":15,":width":16},[18,131,21],{"id":20},[23,133,25],{},[18,135,29],{"id":28},[23,137,32],{},[18,139,36],{"id":35},[23,141,39],{},[41,143,144,150,154,158,164],{},[44,145,146,50,148,55],{},[47,147,49],{},[52,149,54],{},[44,151,152,61],{},[47,153,60],{},[44,155,156,67],{},[47,157,66],{},[44,159,160,73,162,77],{},[47,161,72],{},[52,163,76],{},[44,165,166,83],{},[47,167,82],{},[18,169,87],{"id":86},[23,171,90,172,93],{},[52,173,54],{},{"title":95,"searchDepth":96,"depth":96,"links":175},[176,177,178,179],{"id":20,"depth":99,"text":21},{"id":28,"depth":99,"text":29},{"id":35,"depth":99,"text":36},{"id":86,"depth":99,"text":87},[104,105,106],{},{"title":5,"description":107},{"id":184,"title":185,"audience":6,"body":186,"carouselItems":257,"client":6,"companyName":6,"date":6,"description":261,"end_date":6,"eventDate":6,"eventDuration":6,"eventName":6,"extension":108,"highlightWord":6,"icon":6,"images":6,"job":6,"kind":109,"label":6,"launch_date":262,"link":263,"logo":264,"mainTitle":6,"meta":265,"navigation":113,"order":266,"path":267,"podcastId":6,"related":6,"repo":6,"role":268,"seo":269,"series":6,"start_date":262,"stats":6,"status":118,"stem":270,"subtitle":271,"tags":6,"techs":272,"titleHighlight":122,"updates":6,"videoId":6,"views":6,"watchTime":6,"__hash__":273},"projects\u002Fprojects\u002Fen\u002Fpapaircraft.md","papaircraft.ch",{"type":8,"value":187,"toc":250},[188,190,192,195,197,200,203,205,208,234,238,245,247],[11,189],{":height":13,":items":14,":label":15,":width":16},[18,191,21],{"id":20},[23,193,194],{},"Paper airplanes have been with me since childhood, from my Matura thesis on the\nphysics of paper flight to four Red Bull Paper Wings competitions. That turned\ninto a series of wall pieces: always the same silhouette, each time in different\nmaterials, from leather and gears to felt and sunflower seeds, butterflies and\ndriftwood. These pieces needed a place where people can look at them, borrow\nthem or buy them.",[18,196,29],{"id":28},[23,198,199],{},"A gallery, not a shop. The design is deliberately restrained: a white background\nlike the wall the pieces hang on, neutral type, few elements per screen. Only the\npieces are loud. Each piece has its own page with materials, techniques, size\nand weight, and a discreet \"Make an offer\" instead of a buy button. An\n\"Exhibitions\" page speaks to restaurants, galleries and public spaces that want\nto show a piece.",[23,201,202],{},"Technically it is a static Nuxt site on GitHub Pages: every piece one Markdown\nfile, images optimised through Nuxt Image, German and English. The contact form\nuses the same small backend as my personal website.",[18,204,36],{"id":35},[23,206,207],{},"I built the site with Claude Code, and here too most of the work went into the\nguardrails:",[41,209,210,219,225],{},[44,211,212,215,216,218],{},[47,213,214],{},"Rules instead of rework",": vision, audience, tone and design principles live\nin ",[52,217,54],{}," and a separate design document. New pages and copy are written\nagainst those rules, not against my memory.",[44,220,221,224],{},[47,222,223],{},"Hooks as a style check",": one hook blocks any write that would put a spaced\ndash into the content, because it quickly makes copy sound AI-written. A\nsecond one formats every Markdown file automatically after it is edited. The\nrules apply before I even have to look.",[44,226,227,230,231,233],{},[47,228,229],{},"Discoverability in phases",": keyword research turned into a phased plan\nthat was worked through step by step: a sitemap with language variants,\n",[52,232,76],{}," for AI assistants, per-page metadata, structured data describing\neach piece as an artwork with material and size, and alt texts that name the\nmaterial.",[18,235,237],{"id":236},"timeline","Timeline",[23,239,240,241,244],{},"The site went live on ",[47,242,243],{},"3 June 2026",". In mid-June the \"Exhibitions\" page with\nits contact form and the discoverability work followed. Since then the gallery\ngrows with every new piece, each added as a single Markdown file.",[18,246,87],{"id":86},[23,248,249],{},"On an art website the hardest decision is what to leave out. And a hook that\nenforces a rule is more reliable than the same rule in a prompt.",{"title":95,"searchDepth":96,"depth":96,"links":251},[252,253,254,255,256],{"id":20,"depth":99,"text":21},{"id":28,"depth":99,"text":29},{"id":35,"depth":99,"text":36},{"id":236,"depth":99,"text":237},{"id":86,"depth":99,"text":87},[258,259,260],"\u002Fimages\u002Fprojects\u002Fpapaircraft\u002Fscreen_gallery_1200x750.png","\u002Fimages\u002Fprojects\u002Fpapaircraft\u002Fscreen_piece_1200x750.png","\u002Fimages\u002Fprojects\u002Fpapaircraft\u002Fscreen_about_1200x750.png","A plain, bilingual gallery for my wall pieces: always the same paper airplane silhouette, each time in different materials. Built as a static Nuxt site, with Claude Code and hooks that guard the tone and form of the copy.","2026-06-03","https:\u002F\u002Fpapaircraft.ch","\u002Fimages\u002Fprojects\u002Fpapaircraft\u002Fpapaircraft.png",{},4,"\u002Fprojects\u002Fen\u002Fpapaircraft","Concept, design, development, content, art",{"title":185,"description":261},"projects\u002Fen\u002Fpapaircraft","Online gallery for my paper airplane art","Nuxt, Nuxt Content, Nuxt UI, Nuxt Image, Nuxt i18n, Schema.org, Claude Code, GitHub Pages","FfNGRdYAU2f16DSS4ZM1xeaVKw-er4E4itE8DJRsUSI",{"id":275,"title":276,"audience":6,"body":277,"carouselItems":352,"client":6,"companyName":6,"date":6,"description":358,"end_date":6,"eventDate":6,"eventDuration":6,"eventName":6,"extension":108,"highlightWord":6,"icon":6,"images":6,"job":359,"kind":360,"label":6,"launch_date":6,"link":361,"logo":362,"mainTitle":6,"meta":363,"navigation":113,"order":364,"path":365,"podcastId":6,"related":6,"repo":6,"role":366,"seo":367,"series":6,"start_date":6,"stats":6,"status":118,"stem":368,"subtitle":369,"tags":6,"techs":370,"titleHighlight":371,"updates":6,"videoId":6,"views":6,"watchTime":6,"__hash__":372},"projects\u002Fprojects\u002Fen\u002Fswiss-ai-hub.md","Swiss AI Hub",{"type":8,"value":278,"toc":346},[279,281,283,286,290,293,296,300,303,341,343],[11,280],{":height":13,":items":14,":label":15,":width":16},[18,282,21],{"id":20},[23,284,285],{},"Swiss companies that want to use AI seriously keep building the same stack: a\nvector database, an ingestion pipeline, an LLM gateway, a chat interface. The\nprototype is quick to build. Running it is the hard part: login across all\nservices, cost per department, protection of personal data, traceability of\nevery answer and upgrading dozens of containers. On top of that, much of the\ndata may not leave the company's own infrastructure, or at least Switzerland.\nThat often rules out cloud platforms from US providers.",[18,287,289],{"id":288},"the-platform","The platform",[23,291,292],{},"The Swiss AI Hub does not reinvent these building blocks. It wires proven\nopen-source projects into a stack that installs with a single command: LiteLLM\nas the gateway to local and external models, Milvus and LlamaIndex for RAG,\nDagster for the data pipelines, Keycloak for login and tenants, Langfuse and\nOpenTelemetry for tracing. Agents communicate through a shared event protocol\non NATS JetStream and are reachable via API, MCP, Teams and Slack. If needed,\neverything runs fully on-premises, without data leaving the building.",[23,294,295],{},"The platform was developed by bbv's AI team and is open source today.",[18,297,299],{"id":298},"my-contribution","My contribution",[23,301,302],{},"I was dev lead and solution architect of the hub, responsible for deployment\nand DevOps, and as project lead I ran the client projects built on top of the\nplatform. The now public repository holds more than 100 commits of mine. My\nfocus areas were:",[41,304,305,311,317,323,329,335],{},[44,306,307,310],{},[47,308,309],{},"Deployment and DevOps",": I was responsible for how the hub is built,\nshipped and run: infrastructure as code for Azure, the Docker Compose\ninstallation, versioned GitHub releases as an installable bundle, and the\nCI\u002FCD pipelines that build and tag every image.",[44,312,313,316],{},[47,314,315],{},"Client projects on the hub",": as dev lead and project lead I took client\nprojects from identifying use cases in workshops through proof of concept to\nthe MVP, including architecture and security concepts. What those projects\nneeded fed straight back into the platform.",[44,318,319,322],{},[47,320,321],{},"Agent runtime",": agent types such as the few-shot agent, agent-agnostic\nmanagement of conversation threads and hand-over to humans (human in the\nloop), plus guards that check whether the retrieved context is sufficient for\nan answer.",[44,324,325,328],{},[47,326,327],{},"RAG pipeline",": passing files directly through the API, enriched metadata at\ningest, retrievers with runtime metadata filters, and alerting when a Dagster\npipeline fails.",[44,330,331,334],{},[47,332,333],{},"Login and tenants",": integrating Keycloak into the platform, a user service\nbased on the Keycloak data, tenant handling at login and integration tests for\nall of it.",[44,336,337,340],{},[47,338,339],{},"Evaluation and tracing",": the infrastructure for tracing and assessing the\nagents' answers, first with Phoenix, later with Langfuse.",[18,342,87],{"id":86},[23,344,345],{},"Most of the effort in an AI platform is not in the agents but in everything\naround them: login, tenants, releases, upgrades and traceability. That work\ndecides whether a company can run a platform itself. And if you combine proven\nopen-source projects instead of rebuilding them, you get their further\ndevelopment for free.",{"title":95,"searchDepth":96,"depth":96,"links":347},[348,349,350,351],{"id":20,"depth":99,"text":21},{"id":288,"depth":99,"text":289},{"id":298,"depth":99,"text":299},{"id":86,"depth":99,"text":87},[353,354,355,356,357],"\u002Fimages\u002Fprojects\u002Fswiss-ai-hub\u002Fscreen_architecture_1200x750.png","\u002Fimages\u002Fprojects\u002Fswiss-ai-hub\u002Fscreen_agent_1200x750.png","\u002Fimages\u002Fprojects\u002Fswiss-ai-hub\u002Fscreen_knowledge_1200x750.png","\u002Fimages\u002Fprojects\u002Fswiss-ai-hub\u002Fscreen_pipeline_1200x750.png","\u002Fimages\u002Fprojects\u002Fswiss-ai-hub\u002Fscreen_models_1200x750.png","A self-hosted AI platform that wires proven open-source building blocks into a production-ready stack: LLM gateway, RAG, agents, login and observability. Co-developed at bbv as dev lead and responsible for deployment and DevOps, now open source.","bbv_ai","work","https:\u002F\u002Fgithub.com\u002Fbbvch-ai\u002Faihub-core","\u002Fimages\u002Fprojects\u002Fswiss-ai-hub\u002Fswiss_ai_hub.png",{},1,"\u002Fprojects\u002Fen\u002Fswiss-ai-hub","Dev lead, solution architect, deployment and DevOps",{"title":276,"description":358},"projects\u002Fen\u002Fswiss-ai-hub","Sovereign open-source AI platform for Swiss enterprises","Python, FastAPI, NATS JetStream, LlamaIndex, Milvus, LiteLLM, Keycloak, Langfuse, Dagster, Docker","AI Hub","r9-cemCK2AXmybztVDaFvebIbvR4irrXeDDWGHz68wg",{"id":374,"title":375,"audience":6,"body":376,"carouselItems":451,"client":6,"companyName":6,"date":6,"description":457,"end_date":6,"eventDate":6,"eventDuration":6,"eventName":6,"extension":108,"highlightWord":6,"icon":6,"images":6,"job":6,"kind":109,"label":6,"launch_date":458,"link":459,"logo":460,"mainTitle":6,"meta":461,"navigation":113,"order":96,"path":462,"podcastId":6,"related":463,"repo":6,"role":465,"seo":466,"series":6,"start_date":467,"stats":6,"status":118,"stem":468,"subtitle":469,"tags":6,"techs":470,"titleHighlight":122,"updates":471,"videoId":6,"views":6,"watchTime":6,"__hash__":477},"projects\u002Fprojects\u002Fen\u002Fwas-ist-mcp.md","was-ist-mcp.ch",{"type":8,"value":377,"toc":444},[378,380,382,385,389,392,395,398,401,404,408,430,432,439,441],[11,379],{":height":13,":items":14,":label":15,":width":16},[18,381,21],{"id":20},[23,383,384],{},"Since late 2024 the Model Context Protocol (MCP) has appeared in almost every\nannouncement from AI vendors. Yet it is explained almost exclusively for\ndevelopers, in terms like server, client, JSON-RPC and tool calling. Anyone who\nwants to know what MCP means for their own work with ChatGPT or Claude finds\nhardly any answer in German. In talks and client conversations I kept noticing\nthat exactly this explanation was missing.",[18,386,388],{"id":387},"the-gap-you-dont-need-to-know-mcp-but-you-cant-use-it-without","The gap: you don't need to know MCP, but you can't use it without",[23,390,391],{},"MCP is infrastructure. Ideally nobody would ever hear the word, just as nobody\nneeds to know the USB-C specification to plug in a charger. At first glance,\nthen, MCP is not something end users need to care about.",[23,393,394],{},"In practice it looks different. Most of what MCP makes possible is only open to\npeople who know what an MCP server is, where to find its address and where to\nenter it. Claude calls it a \"connector\"; ChatGPT asks you to switch on developer\nmode before you can add a connection of your own. If you don't know the term,\nyou never go looking for it and stay with what the AI can do out of the box.",[23,396,397],{},"There are exceptions: plugins in Claude and apps in ChatGPT can be added with\none click, without understanding MCP. But they work against the idea of MCP to\nsome extent. They are tied to one vendor's catalogue and rules and can't simply\nbe taken along to another AI. Yet that interchangeability is exactly what the\nprotocol promises: one plug that fits everywhere.",[23,399,400],{},"was-ist-mcp.ch addresses exactly this gap. It explains what a connection is,\nwhat it is allowed to do, what to watch out for and how to set it up in your\nown AI. It also goes further and shows how MCP works and how an AI behaves\nwith it, in plain language and without technical detail.",[23,402,403],{},"It started with audience, narrative arc and tone, and only then copy,\nillustrations and code: factual rather than hype, no technical terms on the\nfirst pages, and fixed analogies such as USB-C and Twint instead.",[18,405,407],{"id":406},"what-i-built","What I built",[41,409,410,415,421],{},[44,411,412,414],{},[47,413,29],{},": an overview page and deep dives for private users,\nbusinesses, security, how it works, limits and an overview of available MCP\nservers, plus an FAQ and guides for Claude, ChatGPT and Gemini. Nuxt 4 with\nNuxt Content, all copy in Markdown, static on GitHub Pages, light and dark\nmode, cookieless analytics.",[44,416,417,420],{},[47,418,419],{},"Its own MCP server",": the site does not just explain MCP, it offers an MCP\nserver itself. Anyone who adds the address to Claude, ChatGPT or Cursor can\nsearch the site's content straight from their AI. The server is built in\nPython with FastMCP, uses hybrid search (BM25 plus vector search with Milvus\nLite) and follows a clean architecture whose layer boundaries are checked in\nthe build. Two of its ten tools require a demo login through an OAuth sign-in\nwindow, so readers also see what authorisation looks like in MCP.",[44,422,423,426,427,429],{},[47,424,425],{},"Discoverability",": structured data, ",[52,428,76],{}," for AI crawlers and an SEO\nstrategy based on real search data.",[18,431,237],{"id":236},[23,433,434,435,438],{},"I started in late March 2026 in my spare time. From late April a placeholder\npage was online, and the full website went live on ",[47,436,437],{},"7 September 2026",". The MCP\nserver followed on 23 September. Since then I have been refining the site\ncontinuously based on reader feedback.",[18,440,87],{"id":86},[23,442,443],{},"Writing for people without a technical background was harder than any technical\ncomponent. Every phrase that seemed obvious to me had to be tested against the\naudience. And the MCP server confirmed what I also recommend in client projects:\na few clearly described tools make an AI more reliable than many. That is why\nthe server has exactly ten, and it will stay that way.",{"title":95,"searchDepth":96,"depth":96,"links":445},[446,447,448,449,450],{"id":20,"depth":99,"text":21},{"id":387,"depth":99,"text":388},{"id":406,"depth":99,"text":407},{"id":236,"depth":99,"text":237},{"id":86,"depth":99,"text":87},[452,453,454,455,456],"\u002Fimages\u002Fprojects\u002Fwas-ist-mcp\u002Fscreen_landing_1200x750.png","\u002Fimages\u002Fprojects\u002Fwas-ist-mcp\u002Fscreen_wie-funktioniert_1200x750.png","\u002Fimages\u002Fprojects\u002Fwas-ist-mcp\u002Fscreen_unternehmen_1200x750.png","\u002Fimages\u002Fprojects\u002Fwas-ist-mcp\u002Fscreen_server_1200x750.png","\u002Fimages\u002Fprojects\u002Fwas-ist-mcp\u002Fscreen_ausprobieren_1200x750.png","An independent German-language website that explains the Model Context Protocol without jargon, with its own MCP server that readers can connect straight to Claude or ChatGPT. Conceived, written, designed and developed in my spare time.","2026-09-07","https:\u002F\u002Fwas-ist-mcp.ch","\u002Fimages\u002Fprojects\u002Fwas-ist-mcp\u002Fwas_ist_mcp.png",{},"\u002Fprojects\u002Fen\u002Fwas-ist-mcp",[464],"\u002Fblogs\u002Fen\u002Fmodel-context-protocol-mcp-der-standard-der-ki-mit-ihren-business-daten-verbindet","Concept, content, design, development, operations",{"title":375,"description":457},"2026-03-24","projects\u002Fen\u002Fwas-ist-mcp","MCP explained clearly, for people without a technical background","Nuxt, Nuxt Content, UnoCSS, Python, FastMCP, Milvus Lite, BM25, Docker, GitHub Actions",[472],{"date":473,"title":474,"description":475,"image":476},"2026-09-23","Own MCP server is live","The content of was-ist-mcp.ch can now be searched directly from Claude, ChatGPT or Cursor, including a demo login via OAuth.","\u002Fimages\u002Fprojects\u002Fwas-ist-mcp\u002Fuse-mcp.png","Bn4KtSiOBiup_0Ew1HVKr6ak-ftA33SfcBgmJ3j9dbY",1793631855133]