[{"data":1,"prerenderedAt":142},["ShallowReactive",2],{"work\u002Farchvr::{\"resolve_relations\":\"case_study_group.case_studies,work_history.roles,role.case_studies\",\"version\":\"published\"}":3,"datasource:sectors":125,"datasource:capabilities":133},{"data":4,"headers":102},{"story":5,"cv":99,"rels":100,"links":101},{"name":6,"created_at":7,"published_at":8,"updated_at":9,"id":10,"uuid":11,"content":12,"slug":89,"full_slug":90,"sort_by_date":91,"position":92,"tag_list":93,"is_startpage":94,"parent_id":95,"meta_data":91,"group_id":96,"first_published_at":8,"release_id":91,"lang":97,"path":91,"alternates":98,"default_full_slug":91,"translated_slugs":91},"ArchVR","2026-11-05T22:46:16.885Z","2026-11-05T23:19:35.917Z","2026-11-05T23:19:36.336Z",238506708547216,"b08b76bc-680e-4cf0-9dc9-e8c160cf3baf",{"_uid":13,"body":14,"title":6,"period":77,"my_role":78,"sectors":79,"summary":81,"question":82,"component":83,"work_type":84,"capabilities":85,"organisation":88},"fefae653-6df9-4cef-ad78-1c1b209cfd2b",[15,32,41,68],{"_uid":16,"text":17,"heading":30,"component":31},"0999268d-7236-432b-ace8-e188976673a7",{"type":18,"content":19},"doc",[20,26],{"type":21,"content":22},"paragraph",[23],{"text":24,"type":25},"ArchVR started life as 3D View Pro, a SaaS platform I founded for VR architectural visualisation, with automated conversion in the cloud. ArchVR is my solo rewrite of it.","text",{"type":21,"content":27},[28],{"text":29,"type":25},"The problem I keep coming back to is configurable, complex interfaces: how you give someone a lot of power without handing them a cockpit.","Where it came from","text_section",{"_uid":33,"text":34,"heading":40,"component":31},"95aa98b7-904e-492b-9b1d-ce6219c729c7",{"type":18,"content":35},[36],{"type":21,"content":37},[38],{"text":39,"type":25},"A visual node graph links device inputs, through transformations, to 3D objects and dashboard widgets.","How it works",{"_uid":42,"text":43,"heading":67,"component":31},"62e2ac20-71e5-4c49-8002-d45bbb5bad47",{"type":18,"content":44},[45],{"type":46,"content":47},"bullet_list",[48,55,61],{"type":49,"content":50},"list_item",[51],{"type":21,"content":52},[53],{"text":54,"type":25},"The BabylonJS 3D editor sits outside the main app, so its weight doesn't land on every page.",{"type":49,"content":56},[57],{"type":21,"content":58},[59],{"text":60,"type":25},"The Rete node-graph editor sits inside, because it renders through Vue anyway.",{"type":49,"content":62},[63],{"type":21,"content":64},[65],{"text":66,"type":25},"Zod validation is shared between the API and the forms, so the rules live in one place. The rest is Nuxt front and back end, tRPC, Prisma, NextAuth and Azure blob storage.","Decisions worth explaining",{"_uid":69,"text":70,"heading":76,"component":31},"9d0e79d7-ad97-49d1-a910-2610f306f93d",{"type":18,"content":71},[72],{"type":21,"content":73},[74],{"text":75,"type":25},"It's a prototype. Device data is simulated for now, and there's no real message broker connected yet.","Where it is","2023–2024 rewrite","Everything",[80],"architecture-property","A side project I've been chipping away at for years: a browser-based digital twin where you connect device data to 3D objects and dashboards with a visual node graph.","How do you let someone wire up a 3D digital twin without writing code?","case_study","zero_to_one",[86,87],"product-design","front-end","Personal project","archvr","work\u002Farchvr",null,-50,[],false,238506020350277,"17b44607-98db-4c2b-bae1-a2b09647d4e7","default",[],1793922325,[],[],{"cache-control":103,"connection":104,"content-encoding":105,"content-type":106,"date":107,"etag":108,"referrer-policy":109,"sb-be-version":110,"server":111,"strict-transport-security":112,"transfer-encoding":113,"vary":114,"via":115,"x-amz-cf-id":116,"x-amz-cf-pop":117,"x-cache":118,"x-content-type-options":119,"x-frame-options":120,"x-permitted-cross-domain-policies":121,"x-request-id":122,"x-runtime":123,"x-xss-protection":124},"max-age=0, public, s-maxage=604800, stale-if-error=3600","keep-alive","gzip","application\u002Fjson; charset=utf-8","Thu, 05 Nov 2026 23:46:01 GMT","W\u002F\"5f4d65887f842f7341c5210324ca4090\"","strict-origin-when-cross-origin","5.1002.0","nginx","max-age=31536000","chunked","Origin,Accept-Encoding","1.1 f82e3e1555f9d50f04945558eb46c72e.cloudfront.net (CloudFront)","j_EF4ltFWdBOMOuV-Q7EkNXv5tnrZG4mcn8e_aLDxR2c_d4XhbLzhA==","LAX54-P1","Miss from cloudfront","nosniff","SAMEORIGIN","none","bed20c96-0887-4017-987d-ffbea814d5e7","0.015258","0",{"manufacturing":126,"ict-managed-services":127,"hospitality":128,"print-ecommerce":129,"healthcare":130,"architecture-property":131,"home-services":132},"Manufacturing","ICT managed services","Hospitality","Print & e-commerce","Healthcare","Architecture & property","Home services",{"service-design":134,"product-design":135,"front-end":136,"product-direction":137,"facilitation":138,"technical-leadership":139,"ai-assisted-delivery":140,"discovery":141},"Service design","Product design","Front-end development","Product direction","Facilitation","Technical leadership","AI-assisted delivery","Discovery",1793922360906]