{"id":2980089,"date":"2026-08-27T00:12:17","date_gmt":"2026-08-27T07:12:17","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2980089"},"modified":"2026-08-27T08:52:30","modified_gmt":"2026-08-27T15:52:30","slug":"building-my-first-js-web-app-with-ai","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai","title":{"rendered":"Building my first JS web app with AI"},"author":312132,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[23771,770712],"tags":[25781,781189,781209],"industry":[],"product":[36591,36831,36551,769412,36601],"class_list":["post-2980089","blog","type-blog","status-publish","format-standard","hentry","category-3d-gis","category-geoai","tag-3d","tag-agentic-ai","tag-cultural-heritage","product-apps","product-js-api-arcgis","product-arcgis-online","product-arcgisrealitystudio","product-developers"],"acf":{"authors":[{"ID":312132,"user_firstname":"Agnieszka","user_lastname":"Rozniak","nickname":"Agnieszka Rozniak","user_nicename":"arozniak","display_name":"Agnieszka Rozniak","user_email":"arozniak@esri.com","user_url":"","user_registered":"2022-06-02 08:50:55","user_description":"Agnieszka is a Product Engineer at the Esri R&amp;D Center in Zurich. She enjoys storytelling, discovering new ways to use GIS, and making complex ideas accessible. She holds a Master's degree in Photogrammetry and GIS from ETH Zurich. Outside of work, she can usually be found reading novels, performing on stage in theatre productions and improv shows, or exploring the outdoors.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/DSC03000_Original-scaled-e1787844915297-213x200.jpeg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"short_description":"How I used agentic AI and the ArcGIS Maps SDK for JavaScript to build a custom 3D explorer for Malbork Castle.","flexible_content":[{"acf_fc_layout":"content","content":"<p>A few weeks ago, I came across publicly available data of Malbork Castle, a medieval stronghold in northern Poland. I had visited the castle a couple of times before, and seeing the model brought back memories. It sparked the idea for a simple cultural heritage app: an immersive 3D experience that would let people explore Malbork Castle virtually and discover the stories connected to it.<\/p>\n<p>I wanted the app to feel designed around the castle, with styling, navigation, and interactions that worked together as one experience. That need for creative control made the ArcGIS Maps SDK for JavaScript the right choice.<\/p>\n<p>At the same time, as a GIS professional rather than a software developer, I have limited experience building full web applications. For me, creating a custom web app would normally mean either involving software developers or investing significant time in learning development skills myself. Instead, I used this project to explore whether AI could help turn the idea into a working prototype.<\/p>\n"},{"acf_fc_layout":"content","content":"<h1>What you&#8217;ll find in this article<\/h1>\n<p>In this blog post, I share how I built the Malbork Castle Explorer with agentic AI and the ArcGIS Maps SDK for JavaScript. This is not a step-by-step tutorial for building the same application, but a practical walkthrough of the process: how I planned the app, gave AI useful context, reviewed its output, recovered from mistakes, and eventually shared the app. Along the way, I also highlight practical approaches and reusable patterns that can be applied to other projects.<\/p>\n<p>If you are a GIS professional curious about building your own app with AI, this post is for you!<\/p>\n"},{"acf_fc_layout":"content","content":"<h1>What I built<\/h1>\n<h3 style=\"text-align: center\"><a href=\"https:\/\/arozniak.github.io\/malbork-castle-explorer\/\" target=\"_blank\" rel=\"noopener\">Discover the Malbork Castle Explorer<\/a><\/h3>\n"},{"acf_fc_layout":"image","image":{"ID":2980232,"id":2980232,"title":"final_app_visual_2","filename":"final_app_visual_2-scaled.png","filesize":3489594,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/final_app_visual_2-scaled.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\/final_app_visual_2","alt":"","author":"312132","description":"","caption":"","name":"final_app_visual_2","status":"inherit","uploaded_to":2980089,"date":"2026-08-14 15:31:19","modified":"2026-08-18 14:57:30","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":2560,"height":1526,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/final_app_visual_2-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/final_app_visual_2-scaled.png","medium-width":438,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/final_app_visual_2-scaled.png","medium_large-width":768,"medium_large-height":458,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/final_app_visual_2-scaled.png","large-width":1812,"large-height":1080,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/final_app_visual_2-1536x916.png","1536x1536-width":1536,"1536x1536-height":916,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/final_app_visual_2-2048x1221.png","2048x2048-width":2048,"2048x2048-height":1221,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/final_app_visual_2-780x465.png","card_image-width":780,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/final_app_visual_2-1811x1080.png","wide_image-width":1811,"wide_image-height":1080}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>The final application is a lightweight 3D explorer for Malbork Castle. It opens with a full-screen web scene and a small set of navigation tabs for key areas of the castle. Each tab moves the camera to a predefined viewpoint and shows a short description based on the scene content.<\/p>\n<p>The app also includes a guided tour mode. When started, the tour moves calmly between selected viewpoints, allowing users to experience the castle as a sequence of places rather than as a static 3D model. The interaction is intentionally simple: users can explore manually, read more when they want additional context, or let the guided tour move them through the experience.<\/p>\n"},{"acf_fc_layout":"content","content":"<h1>My workflow at a glance<\/h1>\n<div>I divided the work into five stages. Use the links below to jump to the part of the workflow you\u2019re most interested in:<\/div>\n<ol>\n<li><strong><a href=\"#Planning\">Planning<\/a><\/strong><\/li>\n<li><strong><a href=\"#Setting-up\">Setting up<\/a><\/strong><\/li>\n<li><strong><a href=\"#Giving-AI-context\">Giving AI context<\/a><\/strong>: <a href=\"#Using-official-tools-and-references\">Using official tools and references<\/a>, <a href=\"#Keeping-things-simple\">Keeping things simple<\/a>, <a href=\"#Documenting-decisions\">Documenting decisions<\/a><\/li>\n<li><strong><a href=\"#Building-the-app\">Building the app<\/a><\/strong>: <a href=\"#Initial-version-of-the-app\">Initial version of the app<\/a>, <a href=\"#Iterating-on-the-AI-outcome\">Iterating on the AI outcome<\/a>, <a href=\"#When-things-go-south\">When things go south<\/a>, <a href=\"#Review-and-fix\">Review and fix<\/a><\/li>\n<li><strong><a href=\"#Deploying-and-sharing-the-application\">Deploying<\/a><\/strong><\/li>\n<\/ol>\n"},{"acf_fc_layout":"content","content":"<h1 id=\"Planning\">1. Planning<\/h1>\n<p>Before working with the AI agent, I spent some time thinking about the data and user experience. You might be surprised how much smoother the process becomes when you take some time to plan first! In that sense, working with AI is not so different from working with developers: the clearer the requirements, the better the result.<\/p>\n<p>I started by preparing the data as a <a href=\"https:\/\/zurich.maps.arcgis.com\/home\/webscene\/viewer.html?webscene=a032056172494a81a2105ef9232ea9a9\">web scene<\/a>, combining the Malbork Castle mesh layer with a basemap. I then selected a few locations to highlight and prepared the related story content.<\/p>\n<p>Next, I thought about the application itself: what functionality it should provide, how users would interact with it, and what kind of experience I wanted to create. To organize these ideas, I sketched a few rough concepts on paper and later used AI to turn them into more polished illustrations.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2980104,"id":2980104,"title":"UX_mixed","filename":"UX_mixed-scaled.png","filesize":2113065,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/UX_mixed-scaled.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\/ux_mixed","alt":"","author":"312132","description":"","caption":"AI-generated UX\/UI illustrations that later served as input during implementation.","name":"ux_mixed","status":"inherit","uploaded_to":2980089,"date":"2026-08-13 14:58:44","modified":"2026-08-13 14:59:44","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":2560,"height":785,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/UX_mixed-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/UX_mixed-scaled.png","medium-width":464,"medium-height":142,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/UX_mixed-scaled.png","medium_large-width":768,"medium_large-height":236,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/UX_mixed-scaled.png","large-width":1920,"large-height":589,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/UX_mixed-1536x471.png","1536x1536-width":1536,"1536x1536-height":471,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/UX_mixed-2048x628.png","2048x2048-width":2048,"2048x2048-height":628,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/UX_mixed-826x253.png","card_image-width":826,"card_image-height":253,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/UX_mixed-1920x588.png","wide_image-width":1920,"wide_image-height":588}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>I invested quite a bit of time in the UX design for this project, but that&#8217;s largely because I enjoy that part of the process. In practice, AI can work just as well from a simple description, sketch, or wireframe. The important thing is communicating the idea clearly.<\/p>\n"},{"acf_fc_layout":"sidebar","content":"<ul>\n<li style=\"text-align: left\">Some planning upfront can save a lot of time later.<\/li>\n<li style=\"text-align: left\">The clearer your idea, the easier it is for AI to help.<\/li>\n<li style=\"text-align: left\">AI can be a valuable brainstorming partner during planning and design.<\/li>\n<\/ul>\n","image_reference":false,"layout":"standard","image_reference_figure":"","snippet":"","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<h1 id=\"Setting-up\">2. Setting up<\/h1>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2980199,"id":2980199,"title":"tools_table_2","filename":"tools_table_2-scaled.png","filesize":97964,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/tools_table_2-scaled.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\/tools_table_2","alt":"","author":"312132","description":"","caption":"","name":"tools_table_2","status":"inherit","uploaded_to":2980089,"date":"2026-08-14 10:42:20","modified":"2026-08-14 12:30:27","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":2560,"height":1138,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/tools_table_2-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/tools_table_2-scaled.png","medium-width":464,"medium-height":206,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/tools_table_2-scaled.png","medium_large-width":768,"medium_large-height":341,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/tools_table_2-scaled.png","large-width":1920,"large-height":854,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/tools_table_2-1536x683.png","1536x1536-width":1536,"1536x1536-height":683,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/tools_table_2-2048x910.png","2048x2048-width":2048,"2048x2048-height":910,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/tools_table_2-826x367.png","card_image-width":826,"card_image-height":367,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/tools_table_2-1920x853.png","wide_image-width":1920,"wide_image-height":853}},"image_position":"right","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>For this project, I kept the toolset simple: VS Code, GitHub Copilot (using GPT-5.4 model), and GitHub. GitHub handled both version control and deployment for the finished application.<\/p>\n<p>Similar alternatives can be used for each part of the setup, but I chose to stick with tools I already knew and had available.<\/p>\n"},{"acf_fc_layout":"content","content":"<p>&nbsp;<\/p>\n<p>If you&#8217;re interested in the tools I used, setup instructions are available in the official documentation:<\/p>\n<ul>\n<li><a href=\"https:\/\/code.visualstudio.com\/\">Visual Studio Code<\/a><\/li>\n<li><a href=\"https:\/\/docs.github.com\/en\/enterprise-cloud@latest\/copilot\/get-started\/what-is-github-copilot\">GitHub Copilot<\/a><\/li>\n<li><a href=\"https:\/\/code.visualstudio.com\/docs\/setup\/copilot#_set-up-copilot-in-vs-code\">Set up GitHub Copilot in VS Code<\/a><\/li>\n<\/ul>\n"},{"acf_fc_layout":"sidebar","content":"<ul>\n<li>Keep the setup simple and don\u2019t let it become a barrier to getting started.<\/li>\n<li>Use the tools you already know and have access to.<\/li>\n<\/ul>\n","image_reference":false,"layout":"standard","image_reference_figure":"","snippet":"","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<h1 id=\"Giving-AI-context\">3. Giving AI context<\/h1>\n<p>With the basic setup in place, I was ready to start engaging with AI. Before asking AI to write any code, I shared the project context it would need to make good decisions. That included:<\/p>\n<ul>\n<li>how the project should be initialized,<\/li>\n<li>which technologies and components to use,<\/li>\n<li>references to official documentation and examples,<\/li>\n<li>implementation guidelines,<\/li>\n<li>expectations for how the AI should interact with me.<\/li>\n<\/ul>\n<p style=\"text-align: center\"><a href=\"https:\/\/github.com\/arozniak\/malbork-castle-explorer\/blob\/main\/documentation\/prompts.md#initial-scaffold-request\">See the initial setup prompt<\/a><\/p>\n<p>Let me highlight a few decisions that shaped the project.<\/p>\n"},{"acf_fc_layout":"content","content":"<h2 id=\"Using-official-tools-and-references\">Using official tools and references<\/h2>\n<div>\n<p>Instead of reinventing the wheel, I wanted to make sure AI uses established patterns.<\/p>\n<p>First, I asked it to initialize the project using the official <a href=\"https:\/\/www.npmjs.com\/package\/@arcgis\/create\">@arcgis\/create<\/a>\u00a0CLI tool. It creates a new project from a predefined template, giving AI a solid starting point.<\/p>\n<p>I also provided links to the official documentation, sample code, and showcases. I specified that the latest version of the Maps SDK for JavaScript should be used and that Map Components should be preferred where possible, with @arcgis\/core used only when needed.<\/p>\n<p>In my initial prompt, I also asked AI to use <a href=\"https:\/\/developers.arcgis.com\/calcite-design-system\/components\/\">Calcite components<\/a>. Calcite provides ready-made, purpose-built web components for web applications, so it was a sensible starting point. However, I later realized that custom components were a better fit because they gave me more control over layout, behavior, and visual style.<\/p>\n<h2 id=\"Keeping-things-simple\" style=\"text-align: left\">Keeping things simple<\/h2>\n<p>I decided not to implement authentication, as all data used in the application is public and the app is intended for a public audience. Adding sign-in functionality would only introduce unnecessary complexity.<\/p>\n<p>I also asked AI to leave the @arcgis\/create template unchanged at first. My goal was to get the basic setup working first and add functionality incrementally from there.<\/p>\n<h2 id=\"Documenting-decisions\" style=\"text-align: left\">Documenting decisions<\/h2>\n<p>Finally, I asked AI to create and maintain project documentation. This includes technical constraints, project decisions, and a list of all prompts used. Having that documentation made it easier to work across multiple sessions and keep the implementation aligned with the original goals.<\/p>\n<\/div>\n"},{"acf_fc_layout":"blockquote","content":"<p>Looking back, giving AI context was one of the most important parts of the workflow. The most helpful prompt was not simply \"build an app.\" It was the information around the app: what I wanted to create, which technologies to use, what to avoid, where the data came from, and how I wanted AI to collaborate with me.<\/p>\n"},{"acf_fc_layout":"sidebar","content":"<ul>\n<li>Give AI the project context before asking it to write code.<\/li>\n<li>Start with official tools, documentation, and examples so AI has a reliable foundation to build from.<\/li>\n<li>Define technical constraints early, including what to use, what to avoid, and where to keep things simple.<\/li>\n<li>Keep prompts and project decisions documented so they can guide later reviews and help continue the work across sessions.<\/li>\n<\/ul>\n","image_reference":false,"layout":"standard","image_reference_figure":"","snippet":"","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<h1 id=\"Building-the-app\">4. Building the app<\/h1>\n<p>From there, the project evolved through cycles of building, testing, and refining the app. The next sections highlight a few examples from that process.<\/p>\n<h2 id=\"Initial-version-of-the-app\" style=\"text-align: left\">Initial version of the app<\/h2>\n<p>First, I tailored the template to the project, replacing the default 2D map with a full-screen 3D scene and removing unnecessary functionality.<\/p>\n<p>Next, I provided AI with the materials needed for the implementation: the web scene, the UX description, and the UI mockups. I asked AI to propose an implementation plan before making any changes. This gave me a chance to review the approach and make adjustments before any code was generated.<\/p>\n<p style=\"text-align: center\"><a href=\"https:\/\/github.com\/arozniak\/malbork-castle-explorer\/blob\/main\/documentation\/prompts.md#scene-data-ux-concept-and-mockups\">See the initial app idea prompt<\/a><\/p>\n<p>The implementation plan consisted of three phases. Phase 1 connected the app to the public ArcGIS web scene and used its slides as the source of truth for locations, viewpoints, and descriptions. Phase 2 implemented the main user experience with minimal tab-based navigation and expandable descriptions. Phase 3 added the guided tour, including play\/pause controls, camera animation, and automatic transitions between locations.<\/p>\n<h2 id=\"Iterating-on-the-AI-outcome\" style=\"text-align: left\">Iterating on the AI outcome<\/h2>\n"},{"acf_fc_layout":"image","image":{"ID":2980202,"id":2980202,"title":"initial_app_version","filename":"initial_app_version-scaled.png","filesize":5487889,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/initial_app_version-scaled.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\/initial_app_version","alt":"","author":"312132","description":"","caption":"Application state after initial AI implementation.","name":"initial_app_version","status":"inherit","uploaded_to":2980089,"date":"2026-08-14 12:44:47","modified":"2026-08-14 12:45:25","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":2560,"height":1329,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/initial_app_version-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/initial_app_version-scaled.png","medium-width":464,"medium-height":241,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/initial_app_version-scaled.png","medium_large-width":768,"medium_large-height":399,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/initial_app_version-scaled.png","large-width":1920,"large-height":997,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/initial_app_version-1536x797.png","1536x1536-width":1536,"1536x1536-height":797,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/initial_app_version-2048x1063.png","2048x2048-width":2048,"2048x2048-height":1063,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/initial_app_version-826x429.png","card_image-width":826,"card_image-height":429,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/initial_app_version-1920x997.png","wide_image-width":1920,"wide_image-height":997}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>This was the result after the first implementation of Phase 2. While it captured much of the intended experience, some details differed from the original design. For example, the descriptive text was placed in a different location and included too many UI elements, while the navigation tabs were split across multiple lines. I worked through these differences one by one until the implementation better matched the design I had in mind. The <a href=\"https:\/\/github.com\/arozniak\/malbork-castle-explorer\/blob\/main\/documentation\/prompts.md#phase-2-ux-mismatch-feedback\">complete phase 2 feedback prompts<\/a> are available in the project repository.<\/p>\n<h2 id=\"When-things-go-south\" style=\"text-align: left\">When things go south<\/h2>\n<p>Not every AI-generated change was an improvement. Sometimes the implementation didn\u2019t work or didn\u2019t follow the design or my intentions. Often, the simplest solution was to undo the changes, adjust the prompt, and try again.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2980203,"id":2980203,"title":"undo_changes_button_shadow","filename":"undo_changes_button_shadow.png","filesize":31337,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/undo_changes_button_shadow.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\/undo_changes_button_shadow","alt":"","author":"312132","description":"","caption":"Use the Undo button in VS Code to revert changes introduced by your latest prompt.","name":"undo_changes_button_shadow","status":"inherit","uploaded_to":2980089,"date":"2026-08-14 12:49:28","modified":"2026-08-14 12:49:36","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1891,"height":161,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/undo_changes_button_shadow-213x161.png","thumbnail-width":213,"thumbnail-height":161,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/undo_changes_button_shadow.png","medium-width":464,"medium-height":40,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/undo_changes_button_shadow.png","medium_large-width":768,"medium_large-height":65,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/undo_changes_button_shadow.png","large-width":1891,"large-height":161,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/undo_changes_button_shadow-1536x131.png","1536x1536-width":1536,"1536x1536-height":131,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/undo_changes_button_shadow.png","2048x2048-width":1891,"2048x2048-height":161,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/undo_changes_button_shadow-826x70.png","card_image-width":826,"card_image-height":70,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/undo_changes_button_shadow.png","wide_image-width":1891,"wide_image-height":161}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p><span data-teams=\"true\">When an issue appeared to stem from a misunderstanding, I would often ask AI to review the original prompts and identify potential ambiguities<\/span>. This often helped me spot gaps in my thinking and rephrase the requests more clearly.<\/p>\n<p>Regular commits to GitHub provided an additional safety net and made it easy to return to earlier versions when needed.<\/p>\n<h2 id=\"Review-and-fix\" style=\"text-align: left\">Review and fix<\/h2>\n<p>Once the application was working and looking as intended, I moved on to testing and refinement. I started with manual testing to identify bugs and usability issues. After fixing these, I used AI for additional rounds of review.<\/p>\n<p>For example, I asked AI to compare the implementation against the project&#8217;s original technical constraints and point out anything that didn&#8217;t match the documented approach.<\/p>\n<p style=\"text-align: center\"><a href=\"https:\/\/github.com\/arozniak\/malbork-castle-explorer\/blob\/main\/documentation\/prompts.md#technical-constraints-compliance-review-request\">See the technical constraints review prompt<\/a><\/p>\n<p><span style=\"color: windowtext;font-style: normal\">I also asked AI to review the code as a senior software developer would, focusing on technical risks or performance concerns. <\/span><\/p>\n<p style=\"text-align: center\"><a href=\"https:\/\/github.com\/arozniak\/malbork-castle-explorer\/blob\/main\/documentation\/prompts.md#senior-engineering-review-report-request\">See the technical review prompt<\/a><\/p>\n<p>In both cases, AI produced reports that were saved alongside the rest of the project documentation: <a href=\"https:\/\/github.com\/arozniak\/malbork-castle-explorer\/blob\/main\/documentation\/technical-constraints-compliance-report.md\">technical constraints compliance report<\/a> and <a href=\"https:\/\/github.com\/arozniak\/malbork-castle-explorer\/blob\/main\/documentation\/engineering-review-report.md\">engineering review report<\/a>. I reviewed the recommendations and used AI to help plan the changes I decided to implement.<\/p>\n"},{"acf_fc_layout":"sidebar","content":"<ul>\n<li>Describe the experience, not just the features.<\/li>\n<li>Ask AI to propose an implementation plan before making any changes.<\/li>\n<li>Review the output against your original goals and refine it through iteration.<\/li>\n<li>Use AI for review and testing, not just implementation.<\/li>\n<li>Stay critical and make the final decisions yourself.<\/li>\n<\/ul>\n","image_reference":false,"layout":"standard","image_reference_figure":"","snippet":"","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<h1 id=\"Deploying-and-sharing-the-application\">5. Deploying and sharing the application<\/h1>\n<p>As a final step, I deployed the application with <a href=\"https:\/\/docs.github.com\/en\/pages\/getting-started-with-github-pages\/creating-a-github-pages-site\">GitHub Pages<\/a>. I asked AI to prepare the relevant deployment files and configuration in the repository, so the app could be built and published from GitHub. After that, the actual publishing step was straightforward: I enabled GitHub Pages in the repository settings, and a few seconds later the custom app was online and ready to share.<\/p>\n<h1>What I learned<\/h1>\n<p>The biggest lesson from this project was that AI worked best when I treated it as a collaborator, not as an autopilot. It could generate code, suggest implementation plans, and help debug issues, but I still needed to define the goal, test the result, and decide which recommendations to accept.<\/p>\n<p>I also found that asking AI to propose a plan before changing code helped me stay in control of the implementation. When something went wrong, the most effective approach was often to undo the change, clarify the request, and try again.<\/p>\n<p>For future projects, I would commit early and often, keep the project documentation up to date, and explicitly ask AI to review accessibility, performance, maintainability, and technical constraints before considering the prototype complete.<\/p>\n<h1>Conclusion<\/h1>\n<p>As GIS professionals, we can solve many problems using existing ArcGIS solutions. But sometimes we have a specific vision or workflow that calls for a custom application. For many of us, that usually means relying on software developers or spending significant time learning new development skills. Agentic AI is beginning to lower that barrier.<\/p>\n<p>My goal with the Malbork Castle Explorer was to see whether agentic AI could help turn an idea, available data, and an initial UX concept into a functional prototype. In my experience, the answer is yes.<\/p>\n<p>AI can accelerate the journey from idea to app, but clear thinking, careful review, and human judgment still matter. I hope this encourages you to experiment and try bringing your own ideas to life.<\/p>\n"},{"acf_fc_layout":"sidebar","content":"<h3>Resources<\/h3>\n<ul>\n<li><a href=\"https:\/\/www.gov.pl\/web\/gugik\/dane-ukosne-i-modele-siatkowe-3d-mesh-dla-malborka-dostepne-w-pzgik\">Malbork Castle data<\/a><\/li>\n<li><a href=\"https:\/\/arozniak.github.io\/malbork-castle-explorer\/\">Malbork Castle Explorer<\/a> (live application)<\/li>\n<li><a href=\"https:\/\/github.com\/arozniak\/malbork-castle-explorer\">Project repository<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/arozniak\/malbork-castle-explorer\/blob\/main\/documentation\/prompts.md\">Prompt history<\/a><\/li>\n<li><a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/\">ArcGIS Maps SDK for JavaScript<\/a><\/li>\n<li><a href=\"https:\/\/docs.github.com\/en\/pages\/getting-started-with-github-pages\/creating-a-github-pages-site\">GitHub Pages<\/a><\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/@arcgis\/create\">@arcgis\/create<\/a> CLI tool<\/li>\n<\/ul>\n","image_reference":false,"layout":"standard","image_reference_figure":"","snippet":"","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false}],"related_articles":"","show_article_image":true,"card_image":false,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/start_image_2_correct_size.png"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building my first JS web app with AI<\/title>\n<meta name=\"description\" content=\"How I used agentic AI and the ArcGIS Maps SDK for JavaScript to build a custom 3D explorer for Malbork Castle.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building my first JS web app with AI\" \/>\n<meta property=\"og:description\" content=\"How I used agentic AI and the ArcGIS Maps SDK for JavaScript to build a custom 3D explorer for Malbork Castle.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-27T15:52:30+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\"},\"author\":{\"name\":\"Agnieszka Rozniak\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/63e8cb4d78340051b3065d9e9a21fe9c\"},\"headline\":\"Building my first JS web app with AI\",\"datePublished\":\"2026-08-27T07:12:17+00:00\",\"dateModified\":\"2026-08-27T15:52:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\"},\"wordCount\":8,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"3D\",\"agentic AI\",\"Cultural Heritage\"],\"articleSection\":[\"3D Visualization &amp; Analytics\",\"AI\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\",\"name\":\"Building my first JS web app with AI\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2026-08-27T07:12:17+00:00\",\"dateModified\":\"2026-08-27T15:52:30+00:00\",\"description\":\"How I used agentic AI and the ArcGIS Maps SDK for JavaScript to build a custom 3D explorer for Malbork Castle.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building my first JS web app with AI\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/63e8cb4d78340051b3065d9e9a21fe9c\",\"name\":\"Agnieszka Rozniak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/DSC03000_Original-scaled-e1787844915297-213x200.jpeg\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/DSC03000_Original-scaled-e1787844915297-213x200.jpeg\",\"caption\":\"Agnieszka Rozniak\"},\"description\":\"Agnieszka is a Product Engineer at the Esri R&amp;D Center in Zurich. She enjoys storytelling, discovering new ways to use GIS, and making complex ideas accessible. She holds a Master's degree in Photogrammetry and GIS from ETH Zurich. Outside of work, she can usually be found reading novels, performing on stage in theatre productions and improv shows, or exploring the outdoors.\",\"jobTitle\":\"Product Engineer\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/arozniak\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Building my first JS web app with AI","description":"How I used agentic AI and the ArcGIS Maps SDK for JavaScript to build a custom 3D explorer for Malbork Castle.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai","og_locale":"en_US","og_type":"article","og_title":"Building my first JS web app with AI","og_description":"How I used agentic AI and the ArcGIS Maps SDK for JavaScript to build a custom 3D explorer for Malbork Castle.","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2026-08-27T15:52:30+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","twitter_misc":{"Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai"},"author":{"name":"Agnieszka Rozniak","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/63e8cb4d78340051b3065d9e9a21fe9c"},"headline":"Building my first JS web app with AI","datePublished":"2026-08-27T07:12:17+00:00","dateModified":"2026-08-27T15:52:30+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai"},"wordCount":8,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["3D","agentic AI","Cultural Heritage"],"articleSection":["3D Visualization &amp; Analytics","AI"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai","name":"Building my first JS web app with AI","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2026-08-27T07:12:17+00:00","dateModified":"2026-08-27T15:52:30+00:00","description":"How I used agentic AI and the ArcGIS Maps SDK for JavaScript to build a custom 3D explorer for Malbork Castle.","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/geoai\/building-my-first-js-web-app-with-ai#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Building my first JS web app with AI"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/63e8cb4d78340051b3065d9e9a21fe9c","name":"Agnieszka Rozniak","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/DSC03000_Original-scaled-e1787844915297-213x200.jpeg","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/DSC03000_Original-scaled-e1787844915297-213x200.jpeg","caption":"Agnieszka Rozniak"},"description":"Agnieszka is a Product Engineer at the Esri R&amp;D Center in Zurich. She enjoys storytelling, discovering new ways to use GIS, and making complex ideas accessible. She holds a Master's degree in Photogrammetry and GIS from ETH Zurich. Outside of work, she can usually be found reading novels, performing on stage in theatre productions and improv shows, or exploring the outdoors.","jobTitle":"Product Engineer","url":"https:\/\/www.esri.com\/arcgis-blog\/author\/arozniak"}]}},"text_date":"August 27, 2026","author_name":"Agnieszka Rozniak","author_page":"https:\/\/www.esri.com\/arcgis-blog\/author\/arozniak","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/10\/start_image_2_correct_size.png","primary_product":"ArcGIS Maps SDK for JavaScript","tag_data":[{"term_id":25781,"name":"3D","slug":"3d","term_group":0,"term_taxonomy_id":25781,"taxonomy":"post_tag","description":"","parent":0,"count":358,"filter":"raw"},{"term_id":781189,"name":"agentic AI","slug":"agentic-ai","term_group":0,"term_taxonomy_id":781189,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":781209,"name":"Cultural Heritage","slug":"cultural-heritage","term_group":0,"term_taxonomy_id":781209,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"category_data":[{"term_id":23771,"name":"3D Visualization &amp; Analytics","slug":"3d-gis","term_group":0,"term_taxonomy_id":23771,"taxonomy":"category","description":"","parent":0,"count":721,"filter":"raw"},{"term_id":770712,"name":"AI","slug":"geoai","term_group":0,"term_taxonomy_id":770712,"taxonomy":"category","description":"","parent":0,"count":76,"filter":"raw"}],"product_data":[{"term_id":36591,"name":"Apps","slug":"apps","term_group":0,"term_taxonomy_id":36591,"taxonomy":"product","description":"","parent":0,"count":655,"filter":"raw"},{"term_id":36831,"name":"ArcGIS Maps SDK for JavaScript","slug":"js-api-arcgis","term_group":0,"term_taxonomy_id":36831,"taxonomy":"product","description":"","parent":36601,"count":371,"filter":"raw"},{"term_id":36551,"name":"ArcGIS Online","slug":"arcgis-online","term_group":0,"term_taxonomy_id":36551,"taxonomy":"product","description":"","parent":0,"count":2489,"filter":"raw"},{"term_id":769412,"name":"ArcGIS Reality Studio","slug":"arcgisrealitystudio","term_group":0,"term_taxonomy_id":769412,"taxonomy":"product","description":"","parent":36591,"count":44,"filter":"raw"},{"term_id":36601,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":36601,"taxonomy":"product","description":"","parent":0,"count":787,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=js-api-arcgis","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2980089","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/312132"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=2980089"}],"version-history":[{"count":25,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2980089\/revisions"}],"predecessor-version":[{"id":2981127,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2980089\/revisions\/2981127"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2980089"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2980089"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2980089"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2980089"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2980089"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}