[{"data":1,"prerenderedAt":385},["ShallowReactive",2],{"sanity-sT87EFzxmL89ksW7DrX_4A2Bgp6KHtX6OkGHC3ca4fg":3},{"data":4,"sourceMap":303},{"_createdAt":5,"_id":6,"_rev":7,"_type":8,"_updatedAt":9,"author":10,"category":20,"content":26,"excerpt":262,"highlights":263,"mainImage":295,"publishedAt":299,"slug":300,"summary":262,"title":302},"2025-08-14T08:05:06Z","759c8491-6aa5-4a72-914b-f3a61d96b446","H6rFpJfiHOfEF1cTwqUcoH","blog","2026-05-19T09:26:41Z",{"_id":11,"image":12,"name":17,"role":18,"slug":19},"a03418bd-7501-45a7-b038-656420b8a9e5",{"_type":13,"asset":14},"image",{"_ref":15,"_type":16},"image-103e2c2cb3900ec5a73707e0980c897e3a4d5463-2400x2400-jpg","reference","Alexandru Popovici","Graphics Engineer",null,{"_id":21,"slug":22,"title":25},"d30a2a64-890e-4e49-b71c-683e1793ddbe",{"_type":23,"current":24},"slug","making-speckle","Making Speckle",[27,38,56,64,72,104,112,132,141,149,157,165,189,197,207,215,223,231,239,251],{"_key":28,"_type":29,"children":30,"markDefs":36,"style":37},"bb5d489d5fe3","block",[31],{"_key":32,"_type":33,"marks":34,"text":35},"8d07123d253d","span",[],"What Does This Mean for Speckle?",[],"h2",{"_key":39,"_type":29,"children":40,"markDefs":54,"style":55},"668b4f76d881",[41,45,50],{"_key":42,"_type":33,"marks":43,"text":44},"b510ffbfad30",[],"We’ve been planning this shift for a while — moving from a single, monolithic Viewer API to a more modular approach. The new ",{"_key":46,"_type":33,"marks":47,"text":49},"e7a683029764",[48],"strong","Viewer Extensions",{"_key":51,"_type":33,"marks":52,"text":53},"836b1f1f9ed9",[]," model will give you a rich library of packages and add-ons to choose from when building your applications.",[],"normal",{"_key":57,"_type":29,"children":58,"markDefs":63,"style":37},"63d9053bf4e2",[59],{"_key":60,"_type":33,"marks":61,"text":62},"c90eb8a24047",[],"Limitations of the Current API",[],{"_key":65,"_type":29,"children":66,"markDefs":71,"style":55},"1bebe1b23753",[67],{"_key":68,"_type":33,"marks":69,"text":70},"d80b1d33fceb",[],"The current API was originally built with Speckle’s own frontend needs in mind. This made it less flexible for general-purpose applications and harder to customise or build on top of.",[],{"_key":73,"_type":29,"children":74,"markDefs":103,"style":55},"2f21f8959bb9",[75,79,84,88,92,95,99],{"_key":76,"_type":33,"marks":77,"text":78},"30e4424a4ffd",[],"It also only supports Speckle streams as input data, but we’ve seen growing demand for other formats — such as ",{"_key":80,"_type":33,"marks":81,"text":83},"371a260f6527",[82],"code",".gltf",{"_key":85,"_type":33,"marks":86,"text":87},"7591b30e5d43",[],", ",{"_key":89,"_type":33,"marks":90,"text":91},"473cb7e3cff3",[82],".obj",{"_key":93,"_type":33,"marks":94,"text":87},"1feb27026ba1",[],{"_key":96,"_type":33,"marks":97,"text":98},"d92e362ef429",[82],".fbx",{"_key":100,"_type":33,"marks":101,"text":102},"31567a9a5d0a",[],", and even custom, non-standard data formats.",[],{"_key":105,"_type":29,"children":106,"markDefs":111,"style":37},"b604ad9298e5",[107],{"_key":108,"_type":33,"marks":109,"text":110},"83c27e8de3f8",[],"Customising Viewer Applications",[],{"_key":113,"_type":29,"children":114,"markDefs":128,"style":55},"479a72026101",[115,119,124],{"_key":116,"_type":33,"marks":117,"text":118},"328c3be7e0c0",[],"Many of you are already using our Viewer APIs in creative ways — from ",{"_key":120,"_type":33,"marks":121,"text":123},"51f2440ea432",[122],"20f1e5940ed0","Urban Decarb",{"_key":125,"_type":33,"marks":126,"text":127},"765831c7e3ed",[]," tools to interactive visualisation platforms and dynamic dashboards. Speckle’s Viewer library is helping bring these applications to life, but we want to make it even more capable.",[129],{"_key":122,"_type":130,"href":131},"link","http://urbandecarb.henninglarsen.com/",{"_key":133,"_type":134,"images":135},"e1ff94128c31","gallery",[136],{"_key":137,"_type":13,"alt":138,"asset":139,"caption":138},"6e328819f6a4","Urban Decarb Tool with Henning Larsen",{"_ref":140,"_type":16},"image-94b05c9f82cfacaf7419593b0c9522bebe54008d-1000x794-png",{"_key":142,"_type":29,"children":143,"markDefs":148,"style":55},"8e49c326b03c",[144],{"_key":145,"_type":33,"marks":146,"text":138},"1a0a516d5c49",[147],"em",[],{"_key":150,"_type":29,"children":151,"markDefs":156,"style":55},"cfaeeea18e4b",[152],{"_key":153,"_type":33,"marks":154,"text":155},"cad3762ed71b",[],"",[],{"_key":158,"_type":29,"children":159,"markDefs":164,"style":37},"312d62ec4a97",[160],{"_key":161,"_type":33,"marks":162,"text":163},"d22ea75451cc",[],"Introducing Viewer API 2.0",[],{"_key":166,"_type":29,"children":167,"markDefs":188,"style":55},"986126c2abe2",[168,172,176,180,184],{"_key":169,"_type":33,"marks":170,"text":171},"01033af6737d",[],"Viewer API 2.0 changes how you work with Viewer as a library by introducing multiple API layers. Instead of one big API, it’s now split into a ",{"_key":173,"_type":33,"marks":174,"text":175},"0a8861f0448c",[48],"core Viewer",{"_key":177,"_type":33,"marks":178,"text":179},"a80f50eb70e4",[]," and ",{"_key":181,"_type":33,"marks":182,"text":183},"dafce70e5b3d",[48],"extensions",{"_key":185,"_type":33,"marks":186,"text":187},"391a779e470f",[],", giving you more customisation options and freedom to work the way you want.",[],{"_key":190,"_type":29,"children":191,"markDefs":196,"style":55},"e7444ffcf03d",[192],{"_key":193,"_type":33,"marks":194,"text":195},"dda6eded5777",[],"You can:",[],{"_key":198,"_type":29,"children":199,"level":204,"listItem":205,"markDefs":206,"style":55},"3983ce28c392",[200],{"_key":201,"_type":33,"marks":202,"text":203},"a23a0d1bbb73",[],"Extend existing stock extensions.",1,"bullet",[],{"_key":208,"_type":29,"children":209,"level":204,"listItem":205,"markDefs":214,"style":55},"822b1bb1e9bf",[210],{"_key":211,"_type":33,"marks":212,"text":213},"5dcfb2c70405",[],"Create your own custom extensions.",[],{"_key":216,"_type":29,"children":217,"level":204,"listItem":205,"markDefs":222,"style":55},"d1fdb119a162",[218],{"_key":219,"_type":33,"marks":220,"text":221},"4702c3478cd8",[],"Load any input data format using your own loaders and converters.",[],{"_key":224,"_type":29,"children":225,"markDefs":230,"style":55},"20fe721427fb",[226],{"_key":227,"_type":33,"marks":228,"text":229},"bd7a4c850870",[],"Viewer will still look and feel the same — but now it’s far more adaptable for your projects.",[],{"_key":232,"_type":29,"children":233,"markDefs":238,"style":55},"fecffa83c7c0",[234],{"_key":235,"_type":33,"marks":236,"text":237},"c31139974895",[],"In short, Viewer API 2.0 is made of:",[],{"_key":240,"_type":29,"children":241,"level":204,"listItem":205,"markDefs":250,"style":55},"d11796b2094d",[242,246],{"_key":243,"_type":33,"marks":244,"text":245},"a11b33d038dd",[48],"Viewer Core",{"_key":247,"_type":33,"marks":248,"text":249},"80950c6a05a2",[]," – handles the fundamental workings of the Viewer and provides a base API.",[],{"_key":252,"_type":29,"children":253,"level":204,"listItem":205,"markDefs":261,"style":55},"7758811ddfe0",[254,257],{"_key":255,"_type":33,"marks":256,"text":49},"c7245c9a4b8e",[48],{"_key":258,"_type":33,"marks":259,"text":260},"c02a4e53fd5a",[]," – add specific features, built on top of Viewer Core, each with their own APIs.",[],"Read this article for an update on our latest Viewr APIs.",[264,280],{"_key":265,"_type":266,"content":267},"4767d796e400","highlight",[268],{"_key":269,"_type":29,"children":270,"markDefs":279,"style":55},"c2762133d77f",[271,275],{"_key":272,"_type":33,"marks":273,"text":274},"905690991ec4",[48],"Viewer API 2.0 introduces a modular system",{"_key":276,"_type":33,"marks":277,"text":278},"f059f321e5e3",[]," — separating Viewer Core from Extensions to give developers more flexibility, customisation options, and support for multiple data formats.",[],{"_key":281,"_type":266,"content":282},"cc15c8f4d33c",[283],{"_key":284,"_type":29,"children":285,"markDefs":294,"style":55},"81fc119fe8f5",[286,290],{"_key":287,"_type":33,"marks":288,"text":289},"e8e515cd6f30",[48],"Developers can now create and extend Viewer Extensions",{"_key":291,"_type":33,"marks":292,"text":293},"5a307503f009",[]," — enabling richer features, custom loaders, and broader use cases without changing Viewer’s familiar look and feel.",[],{"_type":13,"alt":296,"asset":297},"speckle viewer api 2.0",{"_ref":298,"_type":16},"image-d349c2fc6bc9f6d9dc8c4118da85d3e6a1c9f634-960x540-jpg","2023-09-21",{"_type":23,"current":301},"introducing-viewers-new-apis","Introducing Viewer’s New APIs",{"documents":304,"paths":310,"mappings":327},[305,306,308],{"_id":6,"_type":8},{"_id":11,"_type":307},"person",{"_id":21,"_type":309},"blogCategory",[311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326],"$['_createdAt']","$['_id']","$['_rev']","$['_type']","$['_updatedAt']","$['content']","$['excerpt']","$['highlights']","$['image']","$['mainImage']","$['name']","$['publishedAt']","$['role']","$['slug']","$['summary']","$['title']",{"$['_createdAt']":328,"$['_id']":333,"$['_rev']":335,"$['_type']":338,"$['_updatedAt']":341,"$['author']['_id']":344,"$['author']['image']":346,"$['author']['name']":349,"$['author']['role']":352,"$['category']['_id']":355,"$['category']['slug']":357,"$['category']['title']":360,"$['content']":363,"$['excerpt']":366,"$['highlights']":369,"$['mainImage']":372,"$['publishedAt']":375,"$['slug']":378,"$['summary']":380,"$['title']":383},{"source":329,"type":332},{"document":330,"path":330,"type":331},0,"documentValue","value",{"source":334,"type":332},{"document":330,"path":204,"type":331},{"source":336,"type":332},{"document":330,"path":337,"type":331},2,{"source":339,"type":332},{"document":330,"path":340,"type":331},3,{"source":342,"type":332},{"document":330,"path":343,"type":331},4,{"source":345,"type":332},{"document":204,"path":204,"type":331},{"source":347,"type":332},{"document":204,"path":348,"type":331},8,{"source":350,"type":332},{"document":204,"path":351,"type":331},10,{"source":353,"type":332},{"document":204,"path":354,"type":331},12,{"source":356,"type":332},{"document":337,"path":204,"type":331},{"source":358,"type":332},{"document":337,"path":359,"type":331},13,{"source":361,"type":332},{"document":337,"path":362,"type":331},15,{"source":364,"type":332},{"document":330,"path":365,"type":331},5,{"source":367,"type":332},{"document":330,"path":368,"type":331},6,{"source":370,"type":332},{"document":330,"path":371,"type":331},7,{"source":373,"type":332},{"document":330,"path":374,"type":331},9,{"source":376,"type":332},{"document":330,"path":377,"type":331},11,{"source":379,"type":332},{"document":330,"path":359,"type":331},{"source":381,"type":332},{"document":330,"path":382,"type":331},14,{"source":384,"type":332},{"document":330,"path":362,"type":331},1779361863386]