{"en":{"nav":{"home":"Home","about":"About me","references":"References","menu":"Open menu","close":"Close menu","skip":"Skip to content","language":"Language","main":"Main navigation","game":"Game","blog":"Blog","freelance":"Freelance","webmcp":"WebMCP"},"theme":{"toLight":"Switch to light mode","toDark":"Switch to dark mode"},"home":{"metaTitle":"Balázs Csorba – AI Engineer & B2B E-Commerce Developer","metaDescription":"Senior AI & B2B e-commerce engineer for companies: AI agents, MCP, SAP/Infor, Spryker & Pimcore integrations, Vue/Nuxt. Remote across Europe & UK.","hero":{"hello":"Hi, I'm Balázs","role":"Senior Fullstack & AI Engineer","titleStart":"I make AI-generated code and legacy systems","titleSparkle":"production-ready","titleEnd":"– without a big bang.","lead":"Coding agents ship in days what used to take a team months – but rarely production-ready. I audit, test and refactor AI-generated code and grown legacy systems while they keep running: tests as a safety net, CI gates and human review on every change. As a contractor or as an employee.","ctaPrimary":"Request a code audit","ctaSecondary":"See case studies","note":"// hover the network – it thinks faster","location":"Based in Styria, Austria · remote across Europe & the UK","h1Kicker":"Balázs Csorba · Senior engineer for AI code & legacy modernisation","available":"Available as contractor or employee","mailSubject":"Code audit"},"paths":{"eyebrow":"Two ways to work with me","title":"One senior engineer with AI instead of a whole team","lead":"Coding agents have changed the economics of software delivery. Concept, development, testing, integration and operations – for many roadmaps, work that needed an agency or a team of developers a year ago, I can now deliver on my own, with data protection built in. You choose the model that fits your company.","options":{"contract":{"label":"Path 01 · Contractor","title":"Replace your agency","audience":"For companies that buy development and AI projects from agencies today.","text":"You get the output of an agency without the typical agency overhead: no account managers, no hand-offs between sales, project management and developers, no change-request markups. One contract, one accountable senior – from the first spec to production.","points":["Fixed-price milestones, daily rate or monthly retainer – budgets you can plan","A written proposal within three working days","NDA and a data processing agreement under Art. 28 GDPR as standard – AI providers only as sub-processors you approve","Exclusive rights of use to everything built for you (open-source parts under their own licences) – no lock-in"],"cta":"Request a proposal","mailSubject":"Contractor – proposal request"},"employ":{"label":"Path 02 · Employee","title":"Hire one instead of a team","audience":"For companies that want AI expertise in-house for the long term.","text":"Instead of recruiting, onboarding and managing a whole development team, you hire one Senior AI Engineer who works with coding agents. The knowledge, the tooling and your AI governance stay inside your company.","points":["Full-time – for employers across Europe and the UK, remote from Austria or hybrid in Styria","Rolls out your enterprise AI toolchain – SSO and audit logs, with GDPR and EU AI Act requirements taken into account from day one","Makes your existing team productive with coding agents","No recruiter fee – and a work sample on a realistic problem from your domain before you decide"],"cta":"Discuss a role","mailSubject":"Permanent role – Senior AI Engineer"}},"cost":{"eyebrow":"The financial case","title":"What a year of delivery really costs","lead":"The same roadmap, staffed three ways. Estimated annual costs for a mid-sized company in Austria and Germany.","perYear":"per year","rows":{"agency":{"label":"Agency team","detail":"Project lead, 2–3 developers, QA – 3–4 FTE at €800–1,200 per person-day","amount":"€480,000–960,000"},"team":{"label":"In-house development team","detail":"3–4 developers incl. 20–30% employer costs, plus recruiting fees in year one","amount":"€250,000–510,000"},"me":{"label":"One Senior AI Engineer","amount":"By agreement","note":"Far below both alternatives","detail":"One senior plus an enterprise AI subscription – priced to your scope after a short call"}},"highlights":[{"value":"1","label":"accountable senior instead of a team of three to four"},{"value":"€0","label":"recruiter fees, agency markups and change-request surcharges"},{"value":"3","label":"working days to a written quote with your exact price"}],"assumptionsTitle":"How the numbers are calculated","assumptions":"Own estimates based on typical market rates in Austria and Germany, 2026: agency rates of €800–1,200 per person-day for 3–4 FTE at 200 billable days; salaries of €60,000–80,000 gross for 3–4 developers plus 20–30% employer costs; recruiting fees of 20–30% of an annual salary. My fee is agreed individually; even with the enterprise AI subscription it stays well below both alternatives. The comparison assumes comparable delivered output – which you check on a real task before you commit. As a contractor, you pay for agreed deliverables or booked days instead of a salary – with no employer costs, no recruiting fees and no long-term commitment.","cta":"Request your price","mailSubject":"Price request – Senior AI Engineer"},"trust":{"title":"Why it holds up in a mid-sized or large company","items":{"privacy":{"title":"Data protection by design","text":"AI tooling only in the setup you approve – an enterprise plan under commercial terms: no training on your code or data, a data processing agreement with the provider, configurable retention. Where data must not leave the EU or your network, the AI I build for you runs in EU cloud regions or on-premise."},"continuity":{"title":"No single point of failure","text":"Tests, CI, documentation and runbooks live in your repository, so your team or a successor can take over at any time."},"compliance":{"title":"Prepared for approval","text":"Technical documentation for your EU AI Act risk assessment, audit logs and role-based access – the basis IT security, your legal team and the works council need for their review and a works agreement."}}}},"stats":{"years":"years of shipping","products":"products migrated to a PIM","skills":"AI agent skills I've built","projects":"projects in my references"},"agentic":{"eyebrow":"Agentic engineering","title":"AI agents that ship – with tests as the guardrail.","lead":"I don't just prompt. I build the tooling that lets coding agents work safely inside real client codebases, ticket systems and CI.","points":{"pipeline":{"title":"Ticket-to-PR pipelines","text":"Agent skills that reproduce a production bug from real data, prove the root cause, fix it, add unit and Playwright tests and open the pull request."},"guardrails":{"title":"Guardrails, not vibes","text":"Tests, static analysis and CI gates decide what ships – and every change still goes through human review."}},"caption":"Replay of my bug-fix agent pipeline on a B2B shop (simplified)."},"services":{"eyebrow":"Services","title":"Where I create value for your business","lead":"Three areas where companies bring me in – each measured by results, not by lines of code.","items":{"commerce":{"title":"B2B commerce & integrations","text":"B2B shops, product configurators and customer portals on Spryker, Pimcore and TYPO3 – wired into SAP and Infor, so orders, prices and stock stay in sync."},"frontend":{"title":"Fast, maintainable front ends","text":"Vue, Nuxt, React and Next.js applications that load fast, rank well, meet accessibility rules and stay maintainable for years."},"ai":{"title":"AI agents & LLM integration","text":"AI agents and MCP servers on your own data – automating support, content and development work, measured against clear KPIs."}},"more":"Learn more"},"featured":{"eyebrow":"Selected work","title":"Results for B2B and enterprise clients","lead":"Industrial manufacturers, B2B shops and agent tooling – real projects with real constraints.","viewAll":"See all references"},"trusted":"Companies I’ve built for","cta":{"title":"A codebase nobody wants to touch any more?","text":"Tell me about your project or the role you want to fill, and we’ll see together whether I’m the right fit.","email":"Get in touch","linkedin":"Connect on LinkedIn","mailSubject":"Project or role"},"hire":{"badge":"Open to new roles · from 1 December","title":"Hire a senior fullstack & AI engineer – without the recruiter fee","lead":"An unusual proposal – a financial one, so here are the numbers.","costTitle":"The usual cost of hiring a senior engineer","costs":["Headhunter fee: 20–35% of annual salary (€12,000–21,000 at this level)","Job ads, screening, interview rounds: weeks of your team’s time","If it doesn’t work out: 3–6 months’ salary lost"],"offerTitle":"My offer – delete those cost lines","offerFirst":"{bold} – you talk to me directly.","offerBold":"No recruiter fee","offers":["A free trial task up front: name a typical problem from your day-to-day work and I'll solve it as a prototype before you decide.","The probation month can be ended at any time without giving reasons. Your risk: one month's salary instead of 20–35% of an annual salary."],"whyTitle":"Why me","whys":["10+ years fullstack (Zumtobel, Meusburger, Messerle) – PIM migrations, B2B e-commerce, headless platforms, ERP integrations.","Agentic engineering in production: my own MCP server and agent pipelines that go from ticket to tested pull request.","PHP, Python, Go, Rust, TypeScript – and any framework within them. With AI agents, a new stack costs me days, not months."],"availability":"Available from 1 December – remote across Europe and the UK, or hybrid in Styria.","cta":"Let’s talk it over","mailSubject":"Senior fullstack & AI engineer without the recruiter fee"},"hirePilot":{"badge":"Open to projects & permanent roles","title":"Senior Fullstack & AI Engineer – see results first, then decide","offerFirst":"{bold}: 2–6 weeks, one clearly defined result, at an introductory fixed price.","offerBold":"A pilot project","offers":["If the result convinces you and you hire me or keep working with me, you pay the difference to the regular price agreed up front. Otherwise you don't.","If not, we part as friends. Your only risk is the fixed price – a fraction of a recruiter fee. Once paid, all rights to the result are yours.","I bring my own tooling (Claude Max, Codex …) – you only provide access to the repository and a test environment."],"availability":"Remote across Europe and the UK, or hybrid in Styria.","cta":"Discuss a pilot project","mailSubject":"Pilot project – senior fullstack & AI engineer","models":"All engagement models"},"metaTitleBusiness":"Balázs Csorba – Freelance AI Engineer in Graz, Austria","metaDescriptionBusiness":"Freelance fullstack & AI engineer near Graz, Austria: AI agents, MCP servers, LLM integration, Vue and Nuxt. Pilot project, fixed scope or time & material.","value":{"eyebrow":"For your business","title":"What your company gets","lead":"Not more hours – better outcomes: shorter lead times, clean integrations and code your team can own.","items":{"speed":{"title":"Faster delivery","text":"Coding agents and ticket-to-PR pipelines turn routine work from days into hours – so your roadmap moves, not just the backlog."},"integration":{"title":"Systems that talk to each other","text":"Shop, PIM, ERP and CRM connected cleanly – SAP, Infor, Spryker, Pimcore – including a migration of 500,000+ products into a PIM."},"risk":{"title":"Low risk, no black boxes","text":"Tests, CI gates and human review on every change; AI setups designed for GDPR, with no training on your data; documented code with exclusive rights of use for you."},"fit":{"title":"Fits into your team","text":"Remote across Europe and the UK, in English, inside your tools – your repository, your tickets, your CI. No onboarding marathon."}}},"process":{"eyebrow":"How we start","title":"From first call to production – without a big-bang commitment","steps":[{"title":"30-minute call","text":"You describe the business problem; I tell you honestly whether and how I can help – and what it would take."},{"title":"A real task first","text":"We start with one clearly defined task from your backlog, so you judge the quality on your own code before anything bigger."},{"title":"Delivery with ownership","text":"Tested pull requests, documentation and regular demos – until it runs in production and your team can take it over."}]},"symptoms":{"eyebrow":"Sound familiar?","title":"When the prototype meets real users","lead":"AI tools get you to a first version fast. Real load, real data and the first security review show what was left behind.","items":{"untouchable":{"title":"Nobody dares to touch it","text":"A module no one understands any more – every change is a risk, so it never happens."},"regressions":{"title":"Every fix breaks something else","text":"Without tests, bugs show up in production. What should take a day takes a week."},"security":{"title":"Gaps nobody sees","text":"Open API endpoints, missing permission checks, secrets in the repository – the usual traces of unreviewed AI code."},"scale":{"title":"Slow as soon as it matters","text":"N+1 queries, no caching, the same logic in ten variants – invisible in the demo, expensive under load."},"releases":{"title":"Every release is manual work","text":"No CI, no rollback, no staging – a Friday deploy becomes a dare."},"knowledge":{"title":"Knowledge in one head – or one prompt","text":"No docs, no recorded architecture decisions. New developers need weeks instead of days."}}},"audit":{"eyebrow":"Where we start","title":"A fixed-price code audit","lead":"Before anyone rebuilds anything: an honest look at your code. I review architecture, security, tests, performance and deployment, and write down what is solid, where the risks are and what to fix first.","facts":{"duration":{"label":"Duration","value":"5–10 working days"},"result":{"label":"Result","value":"A prioritised list with severity and effort for every item"},"billing":{"label":"Billing","value":"Fixed price, agreed up front"},"scope":{"label":"Reviewed","value":"In-house software, agency code and apps built with Cursor, Claude Code or Copilot"}},"keep":"The report is yours – even if you do not continue with me.","cta":"Request an audit"},"method":{"eyebrow":"How I work","title":"Step by step instead of a big bang","lead":"Your system stays online while it gets better. Every step is small enough to roll back.","steps":{"understand":{"title":"Understand","text":"Audit, map the dependencies, sort the risks by severity – agents get me through large codebases fast, and I check every statement myself."},"secure":{"title":"Secure","text":"Characterisation tests pin down today's behaviour; CI gates and static analysis stop it from getting worse."},"rebuild":{"title":"Rebuild","text":"Module by module, the strangler-fig way: new parts grow next to the old ones and traffic moves over one function at a time."},"handover":{"title":"Hand over","text":"Tested pull requests, docs and architecture decisions in your repository – so your team can carry on without me."}}},"faq":{"eyebrow":"FAQ","title":"What teams ask before we start","items":{"rebuild":{"q":"Do you refactor or rebuild?","a":"Mostly I refactor. The AI often got the structure roughly right; the problems sit in edge cases and missing safeguards. Where a part cannot be saved, I rebuild it and document why."},"tools":{"q":"Do you review code from Cursor, Claude Code or Copilot?","a":"Yes – that is the core of my work. I use coding agents every day myself and know their typical failure patterns."},"downtime":{"q":"Does the system have to stop?","a":"No. Changes go live in small, tested steps, and each one can be rolled back."},"data":{"q":"What happens to our code and data?","a":"I work in your repository and your infrastructure, with AI setups designed for the GDPR and no training on your data. An NDA is a given."},"stack":{"q":"Which stacks?","a":"PHP (TYPO3, Symfony, Spryker, Pimcore), TypeScript (Vue, Nuxt, React, Next.js, Node), Python and Go. With coding agents, a new stack costs me days, not months."},"engage":{"q":"Contractor or employee?","a":"Both. As a contractor for an audit or a clearly scoped rebuild – or on your team, when AI code and legacy systems are a permanent topic. Remote across DACH, Europe and the UK, or hybrid in Styria."}}},"contact":{"eyebrow":"Contact","fields":{"name":"Name","email":"Email","company":"Company (optional)","topic":"What is it about?","message":"Your message"},"topics":{"audit":"Code audit","project":"Project / freelance","job":"Permanent role","other":"Something else"},"consent":"I agree that my details are used to answer my enquiry. More in the","privacy":"privacy policy","submit":"Send message","sending":"Sending…","note":"No newsletter, no tracking – just a reply.","sentTitle":"Thanks – your message is on its way.","sentText":"I read every message myself and will get back to you personally.","errors":{"email":"Please check your email address.","short":"Please write a little more (at least 20 characters).","consent":"Please agree to the processing of your details.","links":"Please include at most three links.","rate":"Too many messages in a short time – please try again later or write an email.","too-fast":"That was quick – please check your message and send it again.","expired":"The form was open for a long time – please send it again.","generic":"Something went wrong. Please try again or write an email."}}},"about":{"metaTitle":"About Balázs Csorba – Senior Fullstack & AI Engineer","metaDescription":"Senior Fullstack & AI Engineer near Graz, Austria: 10+ years of Vue.js, Nuxt, Node.js and PHP – headless commerce, MCP servers and agentic AI workflows.","eyebrow":"About me","title":"Hello again! I'm Balázs.","intro":["I'm a Senior Fullstack & AI Engineer living in Voitsberg, Austria. For 10+ years I've built web applications – from small calculators that help people make better financial decisions to enterprise platforms for global market leaders.","Today AI agents are part of how I build – and I write the tooling that makes them useful in real projects: agent skills that reproduce bugs from real data, fix them and open tested pull requests.","What hasn't changed: I love taking something complicated and making it feel simple – migrating half a million products into a new PIM, untangling a legacy shop until it's fast again, or turning a huge catalogue into a guided configurator. Clean architecture, measurable wins and teams where people help each other grow."],"facts":{"title":"Quick facts","items":["10+ years of fullstack experience","Built my own MCP server & agent pipelines","Clients like Zumtobel, Meusburger, Messerle, ujszo.com & diginomica.com","Led a full Vue 2 → Vue 3 migration","Remote, hybrid, full-time or contract"]},"journey":{"eyebrow":"Experience","title":"My journey so far","present":"today"},"jobs":{"antiloop":{"title":"Senior Full Stack Engineer","points":["Delivered end-to-end B2B and B2C e-commerce solutions for clients across the DACH region – PHP, Node.js and Commercetools backends with Vue.js/Nuxt frontends.","Zumtobel Group: part of a PIM migration that moved 500,000+ products, 14,000 categories and 50 product classes into Pimcore within 3 months – with a stable delta sync between SAP, PDB and Pimcore.","Messerle: rescued and modernised a legacy B2B shop (TYPO3/PHP) integrated with Infor ERP and a PIM – refactored performance bottlenecks, fixed critical order-flow bugs and cut page load time by 65% (4.6 s → 1.6 s).","Meusburger: built a headless product configurator for 100,000+ precision engineering articles with Nuxt.js, TypeScript and the Spryker Glue API, including guided configuration and automated pricing.","Built an agentic delivery pipeline: agent skills that reproduce production bugs from synced data, prove the root cause, create the Jira ticket, implement the fix with unit and Playwright E2E tests and open the pull request – behind PHPUnit/PHPStan gates and human review.","Daily AI-native workflow with Claude Code, OpenCode, Codex and GitHub Copilot for implementation, code review and documentation."]},"ingenious":{"title":"Senior Software Engineer (contract)","points":["Led the front-end team in migrating a large SaaS application from Vue 2 to Vue 3 and TypeScript with strict typing.","Cut item-creation processing time by 45% through targeted UX and component architecture improvements.","Shipped features with 95% Playwright test coverage and built a reusable Vue.js component library.","Ran structured code reviews and mentored junior developers."]},"vioma":{"title":"Senior Software Engineer (contract)","points":["Built a high-traffic hotel management dashboard with real-time analytics, used daily by thousands of hoteliers.","Built a customer-facing booking widget serving hundreds of thousands of end users – availability, pricing and reservation logic.","Migrated a tightly coupled legacy system to a modern headless Vue.js architecture.","Owned the Hungarian localisation of the application UI."]},"array":{"title":"Software Engineer","points":["Built credit score calculators and financial optimisation tools for multiple vendors with Svelte and vanilla JavaScript.","Worked in a globally distributed, multicultural engineering team."]},"brainsum":{"title":"Full-Stack Web Developer (contract)","points":["Recurring and one-time donation platform for a major Hungarian news site.","Real-time ad pricing calculator in Nuxt.js, PWA features with offline pages and a Text-to-Speech microservice.","Mobile and SPA proofs of concept with Nuxt + Capacitor and Next.js."]},"coreconsult":{"title":"Full-Stack Developer","points":["Multi-option loan calculator with lead flow management and a REST API wrapper for Bankmonitor.hu.","Full personal savings calculator including frontend, lead flow and API integration."]},"creativesales":{"title":"PHP Developer","points":["Built a complete business platform from the ground up: authentication, customer management, multi-language support and an e-mail campaign system."]},"blackjuice":{"title":"Web Developer","points":[]}},"skills":{"eyebrow":"Toolbox","title":"Things I work with","groups":{"ai":"AI & agents","frontend":"Frontend","backend":"Backend","commerce":"Commerce & CMS","craft":"Craft & practice"}},"values":{"eyebrow":"How I work","title":"What you can expect","items":{"ownership":{"title":"Ownership","text":"I take a problem from “hmm” to “done” – including the boring but important bits."},"performance":{"title":"Measurable results","text":"Faster pages, fewer bugs, happier users. I like numbers that go in the right direction."},"people":{"title":"Kind collaboration","text":"Clear communication, thoughtful reviews and making sure everyone on the team levels up."}}},"portraitAlt":"Portrait photo of Balázs Csorba, Senior Fullstack & AI Engineer"},"references":{"metaTitle":"Portfolio & References – Balázs Csorba, AI Engineer","metaDescription":"19 projects by Balázs Csorba: AI agent tooling and MCP servers, headless B2B e-commerce (Spryker, Pimcore), SaaS, PWAs – for Zumtobel, Meusburger and more.","eyebrow":"References","title":"Things I've helped build","lead":"From AI agent tooling to enterprise commerce – every project here taught me something. Filter by type and click through to the live sites.","filterLabel":"Filter projects","all":"All","categories":{"ai":"AI & agents","commerce":"E-commerce & PIM","saas":"SaaS & platforms","media":"Media & community","finance":"Fintech","mobile":"Mobile & PoC","tools":"Tools & services"},"visit":"Visit site","internal":"Internal project","via":"via {company}","own":"Own project","count":"no projects | 1 project | {count} projects","items":{"agent-pipeline":{"title":"Ticket-to-PR agent pipeline","desc":"Agent skills that take a bug from report to pull request: reproduce it from synced data, prove the root cause, create the Jira ticket, fix it with unit + Playwright E2E tests and pass the PHPUnit/PHPStan gate."},"agent-ready-site":{"title":"Agent-ready portfolio","desc":"This site talks to AI agents: WebMCP tools in the browser, llms.txt and llms-full.txt, and every page as Markdown via content negotiation – all generated from the same build."},"zumtobel":{"title":"PIM migration to Pimcore","desc":"500,000+ products, 14,000 categories and 50 product classes moved into Pimcore in 3 months, with a stable delta sync between SAP, PDB and Pimcore – ready for an on-time go-live in Italy."},"meusburger":{"title":"Headless product configurator","desc":"A guided configurator for 100,000+ precision engineering articles with automated pricing, built with Nuxt.js on top of the Spryker Glue API."},"messerle":{"title":"B2B shop refactor & speed-up","desc":"Complete codebase refactor of a TYPO3/PHP B2B shop: 65% faster page loads (4.6 s → 1.6 s), a reliable order flow and stable Infor ERP and PIM integrations."},"ingenious":{"title":"Vue 2 → Vue 3 migration","desc":"Led the migration of a large construction-management SaaS app to Vue 3, removing technical debt and making it ready for the long run."},"vioma":{"title":"Headless Vue.js architecture","desc":"Moved a tightly coupled legacy system to a headless Vue.js setup and owned the Hungarian localisation of the UI."},"array":{"title":"Credit score tools","desc":"Credit score calculators and financial optimisation widgets for multiple vendors, built with Svelte and vanilla JavaScript."},"remp":{"title":"Reader donation platform","desc":"Recurring and one-time donations on the REMP platform, helping a large Hungarian news site build sustainable reader revenue."},"ujszo":{"title":"Ad pricing calculator","desc":"A real-time advertising price calculator built with Nuxt.js that made the ad sales workflow a lot smoother."},"diginomica-pwa":{"title":"Progressive Web App","desc":"PWA features and offline access – including a time-sensitive page that stays readable without a connection."},"diginomica-tts":{"title":"Text-to-Speech microservice","desc":"An Express.js microservice that turns articles into audio, improving accessibility for visually impaired readers."},"xshore":{"title":"Mobile app proof of concept","desc":"A cross-platform mobile PoC for an electric boat maker, built with Nuxt.js and Capacitor.js."},"mobily":{"title":"Single-page app PoC","desc":"A Next.js single-page application proof of concept for a mobile network provider."},"css-converter":{"title":"CSS animation → video","desc":"A tool that records websites and CSS animations and exports them as MOV videos using FFmpeg and Node.js."},"tudatosvasarlo":{"title":"Consumer testing platform","desc":"An accredited product testing platform with user ratings and reviews, built with React and Drupal."},"bankmonitor":{"title":"Loan calculator","desc":"A multi-option loan calculator with lead flow management, a REST API and a multi-logic API wrapper for a financial comparison site."},"lakastakarek":{"title":"Savings calculator","desc":"A personal savings calculator with the complete frontend, lead flow and API integration."},"vivarent":{"title":"Business platform from scratch","desc":"Authentication, forms, customer and user management, multi-language support and an e-mail campaign system – end to end."}},"cta":{"title":"Your project could be next","text":"Let's talk about what you're building."},"readArticle":"Read the article"},"game":{"metaTitle":"Dragon Voyage – a 3D sailing game in the browser","metaDescription":"Sail a dragon-prowed junk through a lantern-lit harbour with everyone on the page: five quests, pirate battles and live multiplayer, built with three.js.","eyebrow":"Playground","title":"Dragon Voyage","intro":"A small real-time 3D game that runs right here in your browser – and everyone on this page right now sails in the same harbour. Light the floating lanterns, race through the torii gates, rescue castaways and fight off a pirate fleet together, aboard a junk with a golden dragon figurehead. Between quests, trade tea, porcelain, silk and spice across the bay to pay for ship upgrades.","facts":["three.js · WebGL","Live multiplayer","5 quests · pirate fleet","2 ports · trading & upgrades","0 image or model files","Keyboard, mouse, touch and gamepad"],"name":"Dragon Voyage","kicker":"A harbour at dusk","tagline":"Five quests, a pirate fleet and one shared harbour – sail with everyone who is here right now.","regionLabel":"Dragon Voyage – interactive 3D game","load":"Load the 3D scene","loadHint":"Loads about 1 MB and uses your graphics card.","loading":"Raising the harbour…","start":"Set sail","save":{"continue":"Continue voyage","detail":"Quest {n} of {total} · {time}","new":"New voyage"},"touchHint":"Steer with ◀ ▶, trim the sails with ▲ ▼, fire with ✹ and drag to look around.","keys":{"sails":"raise / lower sails","steer":"steer","boost":"gust of wind","camera":"camera","dragKey":"Drag","drag":"look around","left":"Steer left","right":"Steer right","lower":"Lower the sails","raise":"Raise the sails","broadside":"port / starboard broadside","space":"Space","fire":"fire at the nearest pirate","fireTouch":"Fire the cannons","pause":"pause","trade":"trade at a port"},"camera":{"chase":"Chase","cinematic":"Cinematic","bow":"Bow"},"hud":{"time":"Time","speed":"Speed","sails":"Sails","quest":"Quest {n}/{total}","finished":"Complete","hull":"Hull","guns":"Guns","aboard":"{n} castaway aboard → dock | {n} castaways aboard → dock","online":"{n} online","net":{"connecting":"Connecting…","offline":"Solo","full":"Harbour full – solo"},"wind":"Wind","windFrom":"Wind from the {dir}","irons":"In irons – bear away","inRange":"In range","port":"P","starboard":"S","hit":"HIT","purse":"Purse","hold":"hold {n}/{cap}"},"tools":{"camera":"Change camera (now: {mode})","sound":"Sound","restart":"Start again","fullscreen":"Fullscreen","pause":"Pause"},"toast":{"collect":"Lantern {n} of {total} released","bump":"Shallow water – bear away!","boundary":"The open sea is for another voyage – turning back","camera":"Camera: {mode}","questDone":"Quest complete: {title}","gate":"Gate {n} of {total}","raceStart":"The clock is running – {s} seconds!","raceFail":"Out of time – back to the first gate","pickup":"Castaway aboard ({n}) – head for the dock","deliver":"Castaways safe · {n}/{total}","enemySunk":"Pirate sunk! {n} left","bossSunk":"The flagship goes down!","newRound":"A new round begins!","critical":"Hull critical – repair at the harbour dock","sunk":"Your junk is going down…","respawn":"Towed back to the harbour","repaired":"Hull repaired","reloading":"Reloading…","playerJoin":"{name} joined the harbour","playerLeave":"{name} left the harbour","windShift":"The wind is shifting – now from the {dir}","irons":"In irons – steer off the wind (A / D) until the sails fill","portEnter":"{port} – press T to trade","cargoLost":"{n} crate lost with the ship | {n} crates lost with the ship","upgraded":"{name} fitted","portEnterTouch":"{port} – tap Trade to open the market","bumpPier":"Easy – that’s the pier! Moor alongside, not into it"},"won":{"kicker":"Voyage complete","title":"The harbour is saved","text":"Lanterns lit, race won, castaways home and the pirate flagship sunk – in {time}.","again":"Start over","newRound":"A new round begins in {s} s.","keep":"Keep sailing"},"error":{"noWebgl":"Your browser or device doesn't support WebGL, so the 3D scene can't run here.","lost":"The graphics context was lost. Reload the scene to continue sailing.","failed":"The game couldn't start. Please try again."},"making":{"eyebrow":"How it's made","title":"Everything you see is generated in code","intro":"There are no downloaded models, textures or sounds. The whole harbour – water, mountains, town, ships, pirates and dragon – is built by about 7,700 lines of TypeScript and GLSL when the scene loads.","items":[{"title":"Native in the browser","text":"Built with three.js on WebGL instead of a Unity or Unreal export: no plugin, no multi-megabyte runtime, loaded only when you open this page."},{"title":"One shared harbour","text":"A tiny dependency-free WebSocket relay puts everyone on the page into the same session. The longest-connected player hosts the quests and the pirate AI; ships, cannon fire and progress are synchronised about ten times a second, and the game falls back to solo play when offline."},{"title":"Physically based ocean","text":"Six Gerstner waves run identically on the GPU and the CPU, so the ship pitches and rolls on exactly the waves you see. Sky and mountain reflections, fresnel, foam and lantern glitter are computed per pixel."},{"title":"Procedural world","text":"Noise functions shape the bay, the ridged mountains and the islets; five thousand instanced pines, a terraced town with glowing windows and a five-tier pagoda are placed by rules, not by hand."},{"title":"A living ship","text":"The junk's hull is lofted from mathematical sections. Its battened sails are cloth meshes that billow to leeward and reef as you lower them, and the golden dragon is sculpted from curves and scale textures painted on a canvas."},{"title":"Cinematic image","text":"An HDR pipeline with image-based lighting from the dusk sky, bloom on every lantern, ACES tone mapping, aerial perspective that melts into the sunset, a vignette and film grain."},{"title":"Built to run smoothly","text":"Adaptive resolution holds the frame rate, the game pauses when it scrolls out of view or the tab is hidden, and every GPU resource is released when you leave the page."}],"note":"Built in an agentic workflow with Claude Code as AI pair programmer – the same way I build production software."},"banner":"Quest {n} of {total}","quest":{"lanterns":{"title":"Lantern Festival","goal":"Release the lanterns · {progress}/{goal}","intro":"Twelve lotus lanterns drift on the bay. Sail through each one to send it into the sky."},"race":{"title":"Dragon Boat Race","goal":"Sail through the gates · {progress}/{goal}","intro":"Sail through the seven torii gates in order. The clock starts at the first gate – follow the golden beam."},"rescue":{"title":"Castaways","goal":"Castaways brought home · {progress}/{goal}","intro":"Pirates sank a trader. Pick up the survivors on the rafts and bring them to the harbour dock."},"pirates":{"title":"Pirate Raiders","goal":"Raiders sunk · {progress}/{goal}","intro":"Raiders are coming out of the north. Bring them abeam and fire broadsides with Q and E."},"flagship":{"title":"The Black Flagship","goal":"Break the flagship · {pct}%","intro":"The pirate lord's flagship is here with its escorts. Sink it and the harbour is safe."},"done":{"title":"Harbour saved","goal":"A new round begins in {s} s"},"next":"Next quest coming up…"},"mp":{"nameLabel":"Your captain's name","defaultName":"Captain"},"wind":{"dir":["N","NE","E","SE","S","SW","W","NW"]},"padHint":"Gamepad: left stick sails & steers · A fires · LB/RB broadsides · RT gust · Y camera · X trade · Start pauses.","records":{"line":"Best voyage {best} · {voyages} completed · {sunk} pirates sunk","newBest":"New best time!"},"pause":{"kicker":"Anchors down","title":"Paused","solo":"The harbour holds its breath until you return.","shared":"Other captains are sailing – the harbour keeps moving, but your helm is lashed.","resume":"Resume"},"stats":{"sunk":"Sunk","accuracy":"Accuracy","shots":"Hits","taken":"Damage"},"ports":{"harbour":"Harbour Town","market":"Lotus Market"},"goods":{"tea":"Tea","porcelain":"Porcelain","silk":"Silk","spice":"Spice"},"trade":{"kicker":"Moored at","open":"Trade","close":"Close the market","goods":"Market","yard":"Shipwright","good":"Goods","aboard":"Aboard","buy":"Buy","sell":"Sell","elsewhere":"Sells at {port}","holdFull":"The hold is full","noGold":"Not enough gold","noneToSell":"None aboard to sell","hintHarbour":"Tea and porcelain are made here – carry them to the Lotus Market. The shipwright fits upgrades.","hintMarket":"Silk and spice are cheap here – Harbour Town pays well for them. Prices drift, and flooding a market lowers them."},"yard":{"hull":{"name":"Ironwood hull","desc":"Takes 30% less damage from cannon fire."},"guns":{"name":"Bronze cannons","desc":"Broadsides reload in 1.7 s instead of 2.4 s."},"sails":{"name":"Silk battens","desc":"10% more speed on every point of sail."},"hold":{"name":"Deep hold","desc":"Room for 18 crates instead of 10."},"owned":"Fitted ✓"},"sky":{"dusk":"Dusk","night":"Night","dawn":"Dawn","day":"Day"}},"like":{"label":"Send some love","thanks":"Thank you!","max":"Wow, maximum love! 💜","count":"{count} of {max}"},"footer":{"tagline":"Senior Fullstack & AI Engineer. Building for the web since 2016 – now with agents.","built":"Built with Nuxt, three.js & a few AI agents.","rights":"All rights reserved.","backToTop":"Back to top","navTitle":"Navigate","contactTitle":"Contact","legalTitle":"Legal","privacy":"Privacy","imprint":"Imprint","cookieSettings":"Cookie settings","accessibility":"Accessibility"},"notFound":{"title":"404 – this route isn't in the index","text":"It might have moved, or it never existed. Let's get you back home.","back":"Take me home","errorTitle":"Something went wrong"},"seo":{"keywords":"AI engineer, AI engineer Austria, fullstack AI engineer, agentic engineering, AI agents developer, MCP server developer, LLM integration, vector search, embeddings, semantic search, LLM evals, multi-agent systems, tool calling, prompt engineering, context engineering, generative AI developer, Claude Code, fullstack developer, senior fullstack developer, full stack engineer, web developer Austria, web developer Graz, freelance web developer, Vue.js developer, Nuxt developer, React developer, Node.js developer, TypeScript developer, frontend developer, headless commerce developer, composable commerce, B2B e-commerce, B2C e-commerce, D2C, direct-to-consumer, omnichannel commerce, ERP integration, SAP integration, PIM integration, API-first, Spryker developer, Pimcore developer, PWA developer, remote developer Europe, freelance AI engineer, freelance fullstack developer Austria, freelance developer Graz, contract developer Austria, Vue.js freelancer, Nuxt freelancer, AI consultant Austria, LLM consultant, software developer Graz, hire AI engineer, hire Vue developer, AI agent development, MCP server development"},"consent":{"region":"Cookie consent","title":"Cookies & analytics","text":"May I use Google Analytics to see how this site is used? “Accept all” also turns on Google signals for aggregated demographics and cross-device reports. Nothing loads unless you agree – change your mind any time in the footer.","more":"Privacy policy","analyticsOnly":"Analytics only","accept":"Accept all","reject":"Reject"},"legal":{"role":"Senior Fullstack & AI Engineer","country":"Austria","email":"Email","seePrivacy":"How personal data is handled on this website:","privacyLink":"Privacy policy","seeImprint":"Media owner and legal disclosure:","imprintLink":"Imprint","business":{"trade":"Business activity","gisa":"GISA number","authority":"Trade authority","chamber":"Member of","law":"Professional law","lawText":"Austrian Trade Regulation Act (GewO), available at","uid":"VAT ID"}},"privacy":{"metaTitle":"Privacy policy – Balázs Csorba","metaDescription":"How balazscsorba.com and balazscsorba.at handle personal data: hosting, server logs, cookies, optional Google Analytics and your rights under the GDPR.","eyebrow":"Privacy","title":"Privacy policy","updated":"Last updated: October 2026","intro":"Your privacy matters to me. This page explains which personal data is processed when you visit balazscsorba.com or balazscsorba.at, why, and which rights you have under the General Data Protection Regulation (GDPR) and the Austrian Telecommunications Act (TKG 2021).","sections":[{"title":"Who is responsible","kind":"contact","body":["The controller within the meaning of Art. 4(7) GDPR is:"],"note":["For any privacy question, just send me an email."]},{"title":"Hosting and server log files","body":["This website runs on a virtual private server that I rent from Contabo GmbH, Welfenstraße 22, 81541 Munich, Germany (contabo.com). The server is located in Contabo's EU region, so your data is processed inside the EU. I administer the server myself; Contabo provides the hardware and the network and processes the data only on my behalf under a data processing agreement (Art. 28 GDPR). Contabo's own privacy policy is at contabo.com/en/legal/privacy.","Every time a page is requested, the web server automatically writes a log entry: your IP address, date and time, the requested address, the referring page, the HTTP status code, the amount of data transferred and your browser's user agent. This is needed to deliver the website securely and to detect errors and attacks. The legal basis is my legitimate interest in a secure, working website (Art. 6(1)(f) GDPR). The log files and the server's system log are deleted automatically after 14 days.","The online mode of the Dragon Voyage game also runs on this server. While you play online, a relay passes the player name you choose, your colour and your ship's position to the other players online at that moment. None of this is stored: once you leave, it is gone. The system log only records that a random session ID joined or left – never your player name. The legal basis is my legitimate interest in offering the multiplayer game you choose to join (Art. 6(1)(f) GDPR)."]},{"title":"Cookies and local storage (necessary)","body":["A few small pieces of information are stored in your browser because they are strictly necessary for features you use yourself. They don't need consent (§ 165(3) TKG 2021) and never leave your device – except the language cookie, which is only sent to this website's own server:"],"items":["bc_pick (cookie, 1 year): the language you picked in the language switcher, so balazscsorba.at doesn't switch you back to German.","bc-consent (local storage): your choice in the cookie banner and when you made it.","bc-theme (local storage): light or dark mode.","bc-motion (local storage): whether you paused the animations with the “Pause animations” button.","bc-likes (local storage): how often you clicked the heart in the footer.","bc-tetris-highscore (local storage): your high score in the hidden console game."],"note":["This website also uses a service worker and your browser's Cache Storage to keep copies of its pages, scripts and images on your device, so it loads faster and works offline. No personal data is stored there, and you can remove it at any time by clearing this site's data in your browser.","You can delete them at any time in your browser settings."]},{"title":"Google Analytics (only with your consent)","body":["Only if you choose “Analytics only” or “Accept all” in the cookie banner does this website use Google Analytics 4, a web analytics service of Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Ireland (“Google”). Before that, no connection to Google is made at all.","Google Analytics helps me understand how the website is used – for example which pages are read and for how long, on which kind of device and roughly from which country – so I can improve it. For this, the cookies _ga and _ga_9WM1TQG2PT are set, which store a random, pseudonymous identifier for up to 2 years. GA4 does not log or store IP addresses. Google keeps the analytics data for 14 months.","Only if you choose “Accept all”, Google signals and the advertising consent signals are switched on as well: for visitors who are signed in to a Google account and have allowed ad personalisation there, Google links the visit to that account, so I can see aggregated reports on age, gender, interests and use across devices. I only see aggregated reports that never identify individual people, and I don't run ads on this site; Google may use this data under its own terms, including for advertising. With “Analytics only”, Google signals and the advertising signals stay off. You can switch between the two levels at any time via “Cookie settings” in the footer.","The data may also be transferred to Google LLC in the USA. Google LLC is certified under the EU–US Data Privacy Framework, for which the European Commission adopted an adequacy decision on 10 July 2023 (Art. 45 GDPR).","The legal basis is your consent (Art. 6(1)(a) GDPR, § 165(3) TKG 2021). You can withdraw it at any time with effect for the future via “Cookie settings” in the footer of every page; the Google Analytics cookies are then deleted. More in Google’s privacy policy: policies.google.com/privacy."]},{"title":"Contacting me by email","body":["If you send me an email, I use your email address and the content of your message only to reply and, where relevant, to prepare a possible collaboration (Art. 6(1)(b) and (f) GDPR). I delete the correspondence once it is no longer needed, unless legal retention obligations apply. My emails are handled by Zoho Mail (Zoho Corporation); the data is processed in data centres in the USA.","If you use the contact form, your name, email address, optional company, topic and message are sent over an encrypted connection to a small service on my server, which forwards them as an email to me and stores nothing. To keep spam out without third-party services, your browser solves a small computing task; your IP address is used only briefly in memory to limit repeated submissions and appears in the email only as a one-way hash. Legal basis and deletion are the same as for emails."]},{"title":"External links and fonts","body":["All fonts, images and scripts of this website are served from its own server – there are no third-party fonts, embedded content, social media plugins or tracking pixels. Links to other websites (for example LinkedIn or client websites) are ordinary links: data is only transferred to them once you click, and their own privacy policies apply there."]},{"title":"Your rights","body":["Under the GDPR you have the right to:"],"items":["access your data (Art. 15)","rectification (Art. 16)","erasure (Art. 17)","restriction of processing (Art. 18)","data portability (Art. 20)","object to processing based on legitimate interests (Art. 21)","withdraw your consent at any time, without affecting the lawfulness of processing before the withdrawal (Art. 7(3))"],"note":["To exercise them, just send me an email. If you believe the processing of your data violates data protection law, you can also lodge a complaint with the Austrian Data Protection Authority (Österreichische Datenschutzbehörde), Barichgasse 40–42, 1030 Vienna, www.dsb.gv.at."]}]},"imprint":{"metaTitle":"Imprint – Balázs Csorba","metaDescription":"Imprint and legal disclosure for balazscsorba.com and balazscsorba.at according to § 25 of the Austrian Media Act (MedienG).","eyebrow":"Legal","title":"Imprint","updated":"Disclosure according to § 25 Mediengesetz (MedienG)","sections":[{"title":"Media owner and responsible for the content","kind":"contact"},{"title":"Information under § 5 of the Austrian E-Commerce Act (ECG)","kind":"business","only":"business"},{"title":"About this website","body":["Personal website and portfolio of Balázs Csorba: information about his work as a senior fullstack & AI engineer, his professional experience and references. The website contains no advertising."],"only":"private"},{"title":"About this website","body":["Website of Balázs Csorba, self-employed software developer: information about his services as a senior fullstack & AI engineer, his professional experience and references."],"only":"business"},{"title":"Liability for links","body":["This website contains links to external websites. I have no influence on their content and therefore cannot accept any liability for it; the respective provider is always responsible for the content of linked pages. If I become aware of any legal violation, I will remove the link immediately."]},{"title":"Copyright","body":["Texts, illustrations and the design of this website are protected by copyright. Client names and brands belong to their respective owners and are mentioned only to describe projects I have worked on."]}]},"a11y":{"newTab":"(opens in a new tab)","pauseMotion":"Pause animations","techStack":"Tech stack"},"standards":{"title":"Standards & compliance","note":"Self-assessed, last reviewed September 2026 –","statementLink":"read the statement","items":{"wcag":"Accessibility · ISO/IEC 40500:2025","en301549":"European accessibility standard","gdpr":"Privacy · analytics only with consent","security":"security.txt · ISO/IEC 29147","iso":"Dates, languages & countries","schema":"Structured data for search engines"}},"accessibility":{"metaTitle":"Accessibility statement – Balázs Csorba","metaDescription":"Accessibility statement for balazscsorba.com: WCAG 2.2 AA and EN 301 549 conformance, how it was tested and how to report a barrier.","eyebrow":"Accessibility","title":"Accessibility statement","updated":"Last reviewed: 23 September 2026","intro":"Everyone should be able to use this website – with a mouse, a keyboard, a screen reader, zoomed in or with animations turned off. This statement explains which standards the site meets, how that was checked and where you can reach me if something gets in your way.","sections":[{"title":"Conformance status","body":["According to the tests described below, this website is fully conformant with the Web Content Accessibility Guidelines (WCAG) 2.2, level AA. WCAG 2.2 is also published as the international standard ISO/IEC 40500:2025. It thereby also meets the web requirements of the European standard EN 301 549 (clause 9).","Fully conformant means that the content meets the standard without exceptions. The conformance is self-assessed; no certification body was involved."]},{"title":"What that means in practice","items":["Everything works with the keyboard alone, in a logical order, with a clearly visible focus ring and a \"skip to content\" link.","Text and controls meet the AA contrast ratios in both the light and the dark theme.","Pages can be zoomed to 400 % and used at 320 px width without horizontal scrolling or lost content.","Animations respect the \"reduce motion\" system setting, and the header has a button to pause them at any time.","Interactive targets are at least 24 × 24 CSS pixels, or have enough space around them that they cannot be hit by mistake (WCAG 2.5.8).","Pages have meaningful titles, headings, landmarks and language attributes; images have text alternatives or are marked as decorative.","The cookie banner can be operated with the keyboard, is labelled as its own region for assistive technology, and never hides the element that has focus."]},{"title":"Known limitations","items":["The animated 3D network on the home page is decorative. It is hidden from assistive technology and stops moving when motion is reduced.","The Tetris game in the browser console is a hidden easter egg for developers. It is not part of the content and is not designed for screen readers.","Linked external websites (for example client or LinkedIn pages) are outside my control and may not meet the same standard."]},{"title":"How this was checked","body":["Every page was tested in all three languages (English, German, Hungarian), in both colour themes and at phone and desktop widths: automated checks with axe-core and Lighthouse, plus scripted browser tests of keyboard navigation, focus order and visibility, the cookie banner, reflow at 320 px, 200 % text and increased text spacing, reduced motion and colour contrast. A test with a real screen reader has not been done yet – if you use one and something does not work, I would be grateful to hear about it. The tests are repeated with every larger change to the site."]},{"title":"Other standards this site follows","items":["GDPR / DSGVO: analytics only loads after explicit consent, which can be withdrawn at any time – see the privacy policy.","RFC 9116: a security contact is published at /.well-known/security.txt, following the vulnerability disclosure approach of ISO/IEC 29147.","ISO 8601, ISO 639-1 and ISO 3166-1 for dates, language and country codes (for example \"de-AT\").","schema.org structured data, so search engines understand who is behind the site."]},{"title":"Feedback and contact","body":["Did you run into a barrier, or is something hard to use? Please let me know – I read every message personally and usually reply within a few days. If you need content in a different format, I am happy to send it to you."],"kind":"contact"},{"title":"About this statement","body":["This is a private personal website, so the statement is voluntary. It follows the structure of the EU model accessibility statement (Implementing Decision (EU) 2018/1523)."]}]},"expertise":{"eyebrow":"Expertise","navTitle":"Expertise","pointsTitle":"What I bring","projectsTitle":"Projects that prove it","projectsLead":"Real projects, real numbers – the full list is on the references page.","allRefs":"See all references","toolboxTitle":"Toolbox","faqTitle":"Frequently asked questions","otherTitle":"Also on this site","ctaTitle":"Sounds like what you need?","ctaText":"Tell me about your project or role – I’d love to hear from you.","contact":"Get in touch","shared":[{"q":"Where are you based – and do you work remotely?","a":"In Voitsberg, west of Graz in Styria, Austria. {availability}"},{"q":"Are you available?","a":"{badge}. The quickest way to reach me is e-mail or LinkedIn."},{"q":"Which languages do you work in?","a":"English and Hungarian. Project communication, tickets, documentation and code are in English – I don’t work in German."}],"topics":{"ai-engineer":{"metaTitle":"AI Engineer in Austria – MCP & AI Agents · Balázs Csorba","metaDescription":"Senior AI Engineer in Styria, Austria: MCP servers, LLM integration and agent pipelines that turn a ticket into a tested pull request. Remote or near Graz.","nav":"AI engineering & MCP servers","title":"AI engineer for MCP servers, LLM integration and coding agents","lead":"I build the tooling that lets AI agents work inside real codebases, ticket systems and CI – and tests, static analysis and human review still decide what ships.","points":[{"title":"Ticket-to-PR agent pipelines","text":"Agent skills that reproduce a production bug from synced data, prove the root cause, create the Jira ticket, fix it with unit and Playwright tests and open the pull request."},{"title":"LLM integration","text":"LLM features wired into existing products: embeddings and vector search, tool calling and structured outputs – with evals and guardrails instead of black boxes."},{"title":"Agent-ready websites","text":"This site talks to AI agents: WebMCP tools in the browser, llms.txt and every page as Markdown – generated from the same build as the HTML."}],"faq":[{"q":"What is an MCP server?","a":"The Model Context Protocol (MCP) is an open standard that lets AI assistants and coding agents use tools and data from other systems. An MCP server wraps a system – Jira, for example – in well-described tools, so an agent can search issues or log test runs without custom glue code."},{"q":"Can AI agents work safely in an existing codebase?","a":"Yes, if the guardrails are real. In my pipelines unit and end-to-end tests, static analysis and CI gates decide what ships – and every change still goes through human review."},{"q":"Which AI tools and models do you work with?","a":"Claude Code and agent skills, OpenCode and Codex day to day, and the Anthropic and OpenAI APIs for LLM features inside products."}]},"vue-nuxt-developer":{"metaTitle":"Senior Vue.js & Nuxt Developer in Austria · Balázs Csorba","metaDescription":"Senior Vue.js and Nuxt developer, 10+ years of frontend and fullstack: headless configurators, Vue 2 → 3 migrations, PWAs and fast sites. Styria, Austria.","nav":"Vue.js & Nuxt development","title":"Senior Vue.js & Nuxt developer","lead":"Vue, Nuxt, React and Next.js apps that load fast, scale well and stay pleasant to work on years later – from headless product configurators to large SaaS migrations.","points":[{"title":"Headless frontends","text":"A guided product configurator for 100,000+ precision engineering articles with automated pricing – built with Nuxt.js on top of the Spryker Glue API for Meusburger."},{"title":"Vue 2 → Vue 3 migrations","text":"I led the Vue 3 migration of a large construction-management SaaS app at INGENIOUS.BUILD, removing technical debt along the way."},{"title":"Fast, accessible and multilingual","text":"This site is a statically generated Nuxt app in three languages with an accessibility statement – and a real-time 3D multiplayer game built with three.js."},{"title":"Fullstack when it’s needed","text":"Node.js, Express.js, PHP and REST APIs behind the frontend – for example an Express.js text-to-speech microservice that turns articles into audio."}],"faq":[{"q":"Vue or React?","a":"Both. Most of my work is Vue and Nuxt, but I have shipped React and Next.js projects too, and Svelte widgets for Array."},{"q":"Can you migrate a Vue 2 app to Vue 3?","a":"Yes – I led exactly that migration for INGENIOUS.BUILD’s construction-management SaaS."},{"q":"Do you also build the backend?","a":"Yes: Node.js and Express, PHP and REST APIs – from a text-to-speech microservice to loan-calculator APIs with lead flow management."}]},"b2b-ecommerce-developer":{"metaTitle":"B2B E-Commerce Developer – Spryker & Pimcore · Balázs Csorba","metaDescription":"B2B e-commerce developer in Austria: Pimcore PIM migrations (500,000+ products), Spryker headless configurators, TYPO3 shops and SAP / Infor ERP.","nav":"B2B e-commerce & PIM","title":"B2B e-commerce developer for Spryker, Pimcore and TYPO3","lead":"Headless B2B shops, product configurators and PIM platforms – wired into SAP and Infor without drama.","points":[{"title":"PIM migrations","text":"500,000+ products, 14,000 categories and 50 product classes moved into Pimcore in 3 months for Zumtobel Group, with a stable delta sync between SAP, PDB and Pimcore."},{"title":"Headless configurators","text":"A Nuxt.js configurator on the Spryker Glue API that guides buyers through 100,000+ articles with automated pricing."},{"title":"Shop refactors that pay off","text":"A complete refactor of Messerle’s TYPO3/PHP B2B shop: 65% faster page loads (4.6 s → 1.6 s), a reliable order flow and stable Infor ERP and PIM integrations."}],"faq":[{"q":"Which e-commerce platforms do you work with?","a":"Spryker, Pimcore and TYPO3, headless and composable setups, PIM/DAM – and ERP integrations with SAP and Infor."},{"q":"How large were the catalogues?","a":"The Zumtobel migration moved 500,000+ products and 14,000 categories; the Meusburger configurator covers 100,000+ precision engineering articles."},{"q":"Can you make a slow shop fast?","a":"The Messerle B2B shop went from 4.6 s to 1.6 s page loads – 65% faster – after a complete codebase refactor."}]}},"articlesTitle":"Articles on this topic","articlesAll":"All articles"},"blog":{"eyebrow":"Blog","nav":"Blog","title":"AI agents, MCP & web engineering: notes from the workshop","lead":"Engineering notes on AI agents, MCP, LLM evals and AI security – and the web apps around them. Sourced, with diagrams, written for people who ship.","metaTitle":"Blog – AI agents, MCP and web engineering · Balázs Csorba","metaDescription":"Technical articles by Balázs Csorba, AI engineer in Austria: agent loops, MCP servers, LLM evals, prompt injection, the EU AI Act and Nuxt.","readingTime":"{n} min read","tags":"Tags","more":"More articles","authorTitle":"Written by Balázs Csorba","authorText":"Senior fullstack & AI engineer in Styria, Austria – 10+ years of Vue, Nuxt, Node.js and PHP, now building tooling for AI agents.","filter":"Filter by topic","all":"All","categories":{"agents":"AI agents","rag":"Retrieval & search","llmops":"LLMOps & evals","security":"Security & compliance","web":"Web engineering"},"takeaways":"Key takeaways","toc":"On this page","faq":"Frequently asked questions","updated":"updated","writtenBy":"Written by","readingLabel":"Reading time","englishOnly":"This article is only available in English.","englishOriginal":"Open the English page","englishBadge":"In English","audio":"Listen to this article","audioPlay":"Play","audioPause":"Pause","audioSeek":"Playback position","audioSpeed":"Playback speed","audioShort":"Listen","codeCopy":"Copy","codeCopied":"Copied","allArticles":"All articles","topicMore":"More on this topic","tagEyebrow":"Tag","categoryEyebrow":"Topic","tagTitle":"Articles about {tag}","tagLead":"{n} articles tagged {tag}, newest first. Each one is sourced and written for people who ship.","tagMetaTitle":"{tag} articles · Balázs Csorba","tagMetaDescription":"{n} articles by Balázs Csorba about {tag}: sourced technical notes from an AI engineer in Austria, newest first.","categoryMetaTitle":"Topic: {label} · Balázs Csorba","categoryIntro":{"agents":"Building AI agents: agent loops, tool design, memory, identity, and the review and tests that make agent code mergeable.","rag":"Retrieval for LLM apps: hybrid search, chunking, reranking, vector stores, GraphRAG, and how to evaluate RAG answers.","llmops":"LLMOps and evals: model routing and cost, prompt caching, eval gates in CI, and tracing for LLM agents in production.","security":"AI security and compliance: prompt injection, MCP tool poisoning, least-privilege agents, PII and the EU AI Act.","web":"Web engineering with AI: Nuxt and Vue features, agent-ready websites, structured data, Core Web Vitals and commerce."}},"freelance":{"metaTitle":"Freelance AI & Nuxt Developer in Austria · Balázs Csorba","metaDescription":"Hire a freelance senior fullstack & AI engineer from Graz, Austria: AI agents, MCP servers and Vue/Nuxt apps. Pilot, fixed scope, time & material or retainer.","keywords":["freelance AI engineer","freelance AI developer Austria","freelance fullstack developer","freelance Vue.js developer","Nuxt freelancer","contract developer Austria","freelance developer Graz","AI consultant Austria","LLM integration consultant","MCP server development","AI agent development","Vue 3 migration","Nuxt migration","headless commerce freelancer","hire AI engineer","remote developer EU"],"eyebrow":"Freelance & contracting","title":"Freelance senior fullstack & AI engineer for your product","lead":"I join your team as an external engineer – for a pilot, a fixed-scope project or ongoing contracting. AI agents, MCP servers and LLM features, plus the Vue, Nuxt and Node.js work around them, delivered with tests and code review.","facts":["Registered business in Austria","Attractive hourly, daily & per-task rates","Contracts under Austrian law","NDA & GDPR data processing agreement","EU reverse-charge invoicing","Working language: English · Magyar"],"cta":"Request a proposal","mailSubject":"Freelance project inquiry","services":{"title":"What you can hire me for","lead":"Senior work across the stack – I take ownership from the first spec to the merged, tested pull request.","items":[{"title":"AI agents & MCP servers","text":"MCP servers that give coding and business agents safe access to your tools, ticket-to-PR pipelines, agent skills and evals."},{"title":"LLM features & search","text":"Search, assistants and document workflows on your own data: retrieval, hybrid search, prompt caching, streaming UIs and cost control."},{"title":"Vue & Nuxt development","text":"New apps, Vue 2 → 3 and Nuxt 2 → 4 migrations, design systems and SSR/SSG setups that stay fast and maintainable."},{"title":"Headless commerce & integrations","text":"B2B shops, product configurators, PIM and ERP integrations (Spryker, Pimcore, SAP, Infor) – APIs first, no drama."},{"title":"Performance, SEO & accessibility","text":"Core Web Vitals, Lighthouse, structured data, AI-search readiness (llms.txt, Markdown for agents) and WCAG 2.2 / European Accessibility Act."},{"title":"Consulting, reviews & workshops","text":"Architecture and code reviews, AI-readiness assessments and hands-on workshops that get your team productive with coding agents."}]},"models":{"title":"Engagement models","lead":"Pick the model that fits your risk and your planning – we can switch later.","billingLabel":"Billing","contractLabel":"Contract","items":[{"title":"Pilot project","bestFor":"Best for: trying the collaboration with low risk.","text":"2–6 weeks, one clearly defined result at an introductory fixed price. If you continue with me, the difference to the regular price agreed up front becomes due – otherwise it doesn’t.","billing":"Introductory fixed price, invoiced on acceptance.","contract":"Pilot contract (Werkvertrag) with acceptance criteria."},{"title":"Fixed-scope project","bestFor":"Best for: a clear goal, a budget and a deadline.","text":"Specification, milestones and acceptance up front – or ready-made per-task packages for tickets, audits, migrations and prototypes. You get a fixed quote and a working, tested and documented result.","billing":"Fixed price per milestone.","contract":"Framework agreement + statement of work (Werkvertrag)."},{"title":"Time & material contracting","bestFor":"Best for: extending your team for weeks or months.","text":"I work in your backlog, part-time or full-time, remote or on site – with a monthly timesheet and the same standards as your team.","billing":"Daily rate, monthly invoice with timesheet.","contract":"Framework agreement + order per engagement."},{"title":"Retainer","bestFor":"Best for: maintenance, reviews and a senior on call.","text":"A fixed contingent of days per month for updates, security fixes, code reviews, AI tooling and questions from your team.","billing":"Monthly flat fee for the agreed contingent.","contract":"Framework agreement + retainer order, cancellable monthly."}],"pricing":"Attractive rates – noticeably below typical senior freelance rates in the DACH region and the UK, because coding agents let me deliver faster without cutting corners. Choose hourly, daily or per-task pricing (fixed prices for tickets, audits and prototypes); you get the exact figures in a written quote within three working days."},"process":{"title":"How we start","steps":[{"title":"Intro call","text":"30 minutes, free: your goal, your stack, your timeline."},{"title":"Proposal","text":"Within three working days: scope, model, timeline and a written quote."},{"title":"Contract","text":"Framework agreement and statement of work; NDA and data processing agreement if needed."},{"title":"Kick-off","text":"Access to the repository, environments and your communication tools."},{"title":"Delivery","text":"Small pull requests with tests, a weekly demo and a short written status."},{"title":"Handover","text":"Documentation, knowledge transfer and the rights of use – no lock-in."}]},"terms":{"title":"Clear terms from day one","lead":"The paperwork is ready before we start, so the project can focus on the work.","items":[{"title":"You own the result","text":"On payment you receive the exclusive, unlimited right to use and change everything built for you. Open-source parts keep their licences."},{"title":"Confidentiality","text":"A mutual NDA before the first details are shared, if you want one – confidentiality is part of every contract anyway."},{"title":"GDPR","text":"A data processing agreement under Art. 28 GDPR whenever I touch personal data, with documented technical and organisational measures."},{"title":"AI tools with your consent","text":"Coding agents only in the configuration you approve – business plans without training on your code, and every change goes through human review."},{"title":"Invoicing","text":"Invoices in euros with Austrian VAT, or VAT reverse charge for businesses in other EU countries; payment by bank transfer within 14 days."},{"title":"Remote or on site","text":"Remote across Europe and the UK; on site in Styria, Graz and Vienna by arrangement."}]},"faq":[{"q":"Do you work as a freelancer or as an employee?","a":"Both are possible. As a freelancer I run a registered business (Einzelunternehmen) in Austria and work on projects for several clients; for the right team I am also open to a permanent role."},{"q":"Do you work in German?","a":"No – my working languages are English and Hungarian. Meetings, tickets, documentation, code and contracts are in English, which most tech teams in the DACH region already use. German-language content for your users can still be part of a project, translated and reviewed by your team."},{"q":"What does a project cost?","a":"Less than you might expect: my rates are attractive compared with senior freelancers in the DACH region and the UK, and per-task packages give you a fixed price for tickets, audits and prototypes. There is no price list on the website – after a free 30-minute call you get a written quote within three working days."},{"q":"Who owns the code?","a":"You do. On payment you receive the exclusive and unlimited right to use, change and pass on everything built for you. I keep only my general know-how and pre-existing tools, which you may use as part of the result."},{"q":"Do you sign an NDA and a GDPR data processing agreement?","a":"Yes. I have a mutual NDA and a data processing agreement under Art. 28 GDPR ready, and I am happy to sign yours after a review."},{"q":"Do you use AI coding agents on client code?","a":"Only with your consent and in the setup you approve – for example business plans without model training on your data, or your own company accounts. Tests, static analysis and human review decide what ships."},{"q":"How do you invoice clients outside Austria?","a":"Businesses in other EU countries get an invoice without Austrian VAT under the reverse-charge rule (please send your VAT ID). Clients outside the EU – for example in the UK or Switzerland – are invoiced without Austrian VAT as well; Austrian clients pay 20% VAT."},{"q":"Can you work on site?","a":"Yes, by arrangement: in Styria and Graz on short notice, in Vienna or elsewhere in Europe for workshops, kick-offs and planning weeks. Most of the work happens remotely, across Europe and the UK."},{"q":"How quickly can you start?","a":"Usually within two to four weeks after the contract is signed; small pilots and audits often sooner. Just ask for my current availability."}],"ctaTitle":"Tell me about your project","ctaText":"A short e-mail with your goal, your stack and your timeline is enough – you get an answer within one working day."},"webmcp":{"metaTitle":"WebMCP for AI agents – Balázs Csorba","metaDescription":"This site registers five tools for AI agents through the W3C WebMCP API. Try each one on this page, or read the definitions behind them.","eyebrow":"WebMCP","title":"This site talks to AI agents","lead":"The site registers five tools through the W3C WebMCP API, so a browser agent can search and read articles, fetch contact details and open pages instead of scraping the HTML. Below, you can run each tool yourself.","status":{"checking":"Checking this browser…","visible":"Supported: no tools visible yet | Supported: 1 tool visible | Supported: {count} tools visible","unknown":"Supported, but the number of tools could not be read","unsupported":"Not supported in this browser. You can still try every tool below."},"tools":{"eyebrow":"Tools","title":"The five tools","lead":"Each card shows what an agent sees: the name, the description and the input schema. The page runs the same definitions that the site registers, so you can try any of them here."},"toolNotes":{"get_page_content":"Reads a page of the site as Markdown.","search_articles":"Finds blog posts and tool reviews by words, newest first when the query is empty.","get_article":"Reads one blog post or tool review as Markdown.","get_contact_details":"Returns name, role, e-mail, LinkedIn, location and languages.","open_page":"Opens a page or an article in this tab."},"toolTitles":{"get_page_content":"Read a page","search_articles":"Search articles","get_article":"Read an article","get_contact_details":"Contact details","open_page":"Open a page"},"chips":{"readOnly":"Read-only","changesPage":"Changes the page"},"agentSees":"What the agent sees","parameters":"Parameters","noParameters":"No parameters.","required":"required","optional":"optional","values":"Values","tryIt":"Try it","default":"Default","run":"Run tool","running":"Running…","result":"Result","errorTitle":"Error","truncated":"… {count} more characters","navigatesAway":"Running this tool leaves the page: the target opens in this tab.","connect":{"eyebrow":"Connect","title":"Connect an agent","lead":"Support is still limited, and some of it is in trials. As of October 2026:","chrome":"Chrome 149 runs an origin trial. For local testing, enable chrome://flags/#enable-webmcp-testing and relaunch Chrome.","edge":"Edge 150 has an origin trial.","chatgpt":"ChatGPT Desktop supports WebMCP. Brave has experimental support in Leo.","inspector":"Chrome's Model Context Tool Inspector extension lists and runs a page's tools.","spec":"WebMCP specification (W3C)","guide":"Chrome's WebMCP guide"},"build":{"eyebrow":"Under the hood","title":"How it is built","text":"The five tool definitions live in one module. The plugin registers them with the browser, and this page runs the same definitions, so the two cannot drift apart.","readMore":"Further reading:","guide":"WebMCP in practice: making a website agent-ready with declared tools","review":"WebMCP: publishing tools instead of pixels"},"doors":{"eyebrow":"For agents","title":"Other doors for agents","llms":"A table of contents for agents, with a summary of every article and tool.","llmsFull":"The full text of every English page, in one file.","markdown":"Every page is also available as Markdown: add .md to the address, or send the header Accept: text/markdown."},"privacy":{"eyebrow":"Privacy","title":"Where the tools run","text":"The tools run in your browser. The site's server only sees the normal page and Markdown requests, and the site sends nothing to any AI provider."}}}}