[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fjxxWxx7fToXTFljCnPg1AYra-m_vCKxWYGzPELSrlXQ":3},[4,21,34,48,64],{"id":5,"slug":6,"title":7,"projectType":8,"client":9,"tools":10,"year":11,"summary":12,"problem":13,"approach":14,"outcome":15,"previewUrl":16,"repoUrl":16,"thumbnailUrl":17,"images":18,"sortOrder":19,"active":20},5,"azure-devops-mcp-server","Azure DevOps MCP Server","Developer Tooling","TransPerfect — internal developer platform","TypeScript, Node.js, Model Context Protocol, Azure DevOps REST API, PowerShell","2025","An MCP server that exposes Azure DevOps as structured tools, so an LLM can carry out routine developer workflows through tool calling instead of a human clicking through the portal.","A lot of day-to-day engineering time went into Azure DevOps chores — checking build and release state, moving work items, pulling pull request context, setting up environments. Each one is small, but they interrupt whatever you were actually doing, and the Azure DevOps UI makes you navigate several screens for answers that are one API call away.","I built a Model Context Protocol server in TypeScript and Node.js that wraps the Azure DevOps REST API. Rather than exposing raw endpoints, each operation is published as a tool with an explicit schema — a clear name, typed arguments, and a description an LLM can reason about — so the model picks the right call and gets a validated payload back. Auth and scoping happen server-side, so the model never handles tokens, and destructive operations are deliberately kept out of the tool surface. PowerShell scripting handles the Windows-side environment setup steps that sit outside the REST API.","Now a daily-use internal tool — routine Azure DevOps work runs through the assistant rather than the portal, and adding a new automated workflow means defining one tool instead of writing a bespoke script. It also became the reference implementation for how we expose internal systems to agentic tooling.","","\u002Fimg\u002Fprojects\u002Fcover-mcp-server.svg","[]",1,true,{"id":22,"slug":23,"title":24,"projectType":25,"client":26,"tools":27,"year":11,"summary":28,"problem":29,"approach":30,"outcome":31,"previewUrl":16,"repoUrl":16,"thumbnailUrl":32,"images":18,"sortOrder":33,"active":20},6,"rag-knowledge-assistant","AI-Powered Knowledge Assistant","AI \u002F ML","Personal project","React, TypeScript, Zustand, Pinecone, embeddings, semantic search, LLM APIs","A retrieval-augmented chat assistant over 1,200+ technical documents, with streamed answers, source citations, and a relevance-feedback loop.","A large body of technical documentation is only useful if you can find the one paragraph you need. Keyword search misses anything phrased differently, and asking a general model straight out produces confident answers that are not grounded in the actual documents.","I built the ingestion side first: chunk the corpus, embed it, and index it in Pinecone so retrieval runs on semantic similarity rather than keyword overlap. The answer path retrieves the relevant chunks, grounds the model on them, and returns citations alongside the response so a reader can check the source. The front end is React and TypeScript with Zustand for state and streaming responses over SSE — which means treating loading, partial, error, and empty states as first-class, since a streamed answer can fail halfway through. A relevance-feedback loop captures which retrievals were actually useful, and the whole thing sits behind a REST API so it can be embedded in other applications.","Retrieval over the 1,200+ document corpus returns in under 400ms, and prompt engineering evaluated against a fixed question set cut hallucinated answers by roughly a third against the ungrounded baseline.","\u002Fimg\u002Fprojects\u002Fcover-rag-assistant.svg",2,{"id":35,"slug":36,"title":37,"projectType":38,"client":39,"tools":40,"year":41,"summary":42,"problem":43,"approach":44,"outcome":45,"previewUrl":16,"repoUrl":16,"thumbnailUrl":46,"images":18,"sortOrder":47,"active":20},7,"java-ee-to-spring-boot-migration","Java EE to Spring Boot Migration","Platform","Codingmart Technologies — client application","Spring Boot, Spring MVC, Spring Security, Spring Data JPA, Hibernate, React, TypeScript, SQL Server, Docker","2024–2025","Moved a legacy Java EE application off JSP, Servlets and raw JDBC onto Spring Boot with a React front end — incrementally, without a big-bang cutover.","The application was built on JSP, Servlets, JSTL, and hand-written JDBC. Business logic lived in the view layer, every data access path repeated its own connection handling, and there was no clean seam to test against. It still had to keep serving users throughout, so a rewrite-and-swap was never an option.","I rebuilt the back end on Spring Boot — Spring MVC for routing, Spring Security for authentication and authorisation, and Spring Data JPA with Hibernate to replace the hand-rolled JDBC — exposing REST and JAX-RS endpoints that the old and new front ends could both call. On the database side I reworked the SQL Server objects the application depended on, tuning queries and rewriting stored procedures and triggers around the new access patterns. The front end moved page by page: JSP views were replaced with React and TypeScript screens, with Bootstrap and jQuery kept alive at the boundary so half-migrated pages kept working during the cutover. Docker-based environments and CI\u002FCD pipelines made each increment deployable on its own.","Interaction performance improved by about 28%, and the application came off Java EE with no big-bang release — onto a stack the team could actually test and extend.","\u002Fimg\u002Fprojects\u002Fcover-springboot-migration.svg",3,{"id":49,"slug":50,"title":51,"projectType":52,"client":53,"tools":54,"year":55,"summary":56,"problem":57,"approach":58,"outcome":59,"previewUrl":60,"repoUrl":16,"thumbnailUrl":61,"images":62,"sortOrder":63,"active":20},8,"ar-vr-foundation-website","AR-VR Foundation Website","Website","La Fondation Dassault Systèmes","React, JavaScript, responsive CSS","2023","A public site for a Dassault Systèmes education programme, presenting VR learning experiments to students and teachers.","The programme needed a public home that could explain VR-based learning to a non-technical audience — students, teachers, and programme partners — and present a growing set of experiments without a redesign each time one was added.","Built as a React single-page application with a component structure that treats each experiment as content rather than a bespoke page, so new ones drop into the existing gallery and detail patterns. Layout is responsive from phone through desktop, since a good share of the audience arrives on a school device.","Live and in use as the programme’s public face. Adding an experiment is a content change, not a front-end task.","https:\u002F\u002Fla-fondation-dassault-systemes.vercel.app\u002F","\u002Fimg\u002FScreenshot (667)-cropped.png","[\"\u002Fimg\u002FScreenshot (667)-cropped.png\",\"\u002Fimg\u002FScreenshot (668)-cropped.png\"]",4,{"id":65,"slug":66,"title":67,"projectType":68,"client":69,"tools":70,"year":55,"summary":71,"problem":72,"approach":73,"outcome":74,"previewUrl":75,"repoUrl":16,"thumbnailUrl":76,"images":77,"sortOrder":5,"active":20},9,"multi-vendor-ecommerce","Multi-vendor E-commerce Platform","E-commerce","Ammu Collection LLC","WooCommerce, WordPress, PHP, payment gateway integration","A multi-vendor storefront where independent sellers manage their own catalogue, orders, and payouts.","The client wanted to sell across multiple independent vendors rather than a single catalogue, which means per-vendor product management, order routing, and payout splitting — none of which a default store gives you.","Built on WooCommerce with multi-vendor extensions, configured so each seller gets a scoped dashboard over their own products and orders. Set up the payment gateway, shipping rules, and order routing so a single customer basket resolves to the right vendor, and adapted the storefront theme for the catalogue and checkout flow.","Running in production as a live storefront with multiple sellers onboarded and managing their own listings.","https:\u002F\u002Fdesisinusa.net\u002F","\u002Fimg\u002FScreenshot (671)-cropped.png","[\"\u002Fimg\u002FScreenshot (671)-cropped.png\",\"\u002Fimg\u002FScreenshot (699)-cropped.png\"]"]