<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Thom</title>
    <description>The latest articles on DEV Community by Thom (@23thom).</description>
    <link>https://dev.to/23thom</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F526455%2F4df88b51-cea7-40c2-bc4e-4b5472587e0c.jpeg</url>
      <title>DEV Community: Thom</title>
      <link>https://dev.to/23thom</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/23thom"/>
    <language>en</language>
    <item>
      <title>Launch ServiceNow ai voice agents from mobile, no Telephony provider required</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Fri, 06 Mar 2026 07:38:26 +0000</pubDate>
      <link>https://dev.to/23thom/launch-servicenow-ai-voice-agents-from-mobile-no-telephony-provider-required-3d1k</link>
      <guid>https://dev.to/23thom/launch-servicenow-ai-voice-agents-from-mobile-no-telephony-provider-required-3d1k</guid>
      <description>&lt;p&gt;This article walks you through setting up a voice launcher in your mobile app so you can use ServiceNow voice agents without a telephony system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This is not official product documentation. It's just me sharing what I figured out. I'm sure this will get much easier in future releases. :) Everything below was configured on a &lt;strong&gt;Zürich Patch 6 Hotfix 2&lt;/strong&gt; instance.&lt;/p&gt;

&lt;p&gt;So, if you have Now Assist licences and want to try ServiceNow's voice agent capability, but don't have access to a telephony provider like Twilio or Genesys, you're in the right place.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we're doing
&lt;/h2&gt;

&lt;p&gt;We need to configure a few backend tables to wire up the voice launcher. Eventually, this will probably all be handled natively in the Mobile App Builder, but until then, here's the manual approach.&lt;/p&gt;

&lt;p&gt;I changed my scope to &lt;strong&gt;Now Mobile&lt;/strong&gt; and created everything there. You could also use a separate update set or a different scope, whatever works for your dev setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Create a new function
&lt;/h2&gt;

&lt;p&gt;Navigate to the &lt;code&gt;sys_sg_button&lt;/code&gt; table and create a new record. In the &lt;strong&gt;Type&lt;/strong&gt; field, select &lt;strong&gt;Voice Launcher&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lcmuju91hcx0fpjx8hs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lcmuju91hcx0fpjx8hs.png" alt="Creating a new voice launcher function in the sys_sg_button table" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Create a function instance
&lt;/h2&gt;

&lt;p&gt;Go to the &lt;code&gt;sys_sg_button_instance&lt;/code&gt; table and create a new record. Make sure you set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parent table&lt;/strong&gt; → &lt;code&gt;sys_sg_native_client&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parent&lt;/strong&gt; → Now Mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbn53pll9ciodrh4ymc2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbn53pll9ciodrh4ymc2.png" alt="Configuring the function instance with parent table and parent values" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Add the function to a mobile screen
&lt;/h2&gt;

&lt;p&gt;Now head into the &lt;strong&gt;Mobile App Builder&lt;/strong&gt; and place your newly created function somewhere on a screen. I added mine to the &lt;strong&gt;Quick Actions&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6vxonllo5c7zv6sojxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6vxonllo5c7zv6sojxk.png" alt="Adding the voice launcher function to Quick Actions in the Mobile App Builder" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once that's done, the mobile app should show something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwxj9grlgwcgz8xqyy62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwxj9grlgwcgz8xqyy62.png" alt="The voice launcher button visible in the mobile app" width="369" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Link it to your assistant profile
&lt;/h2&gt;

&lt;p&gt;Open the &lt;strong&gt;Assistant designer&lt;/strong&gt; and select the voice assistant profile you want to use:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftulk7n05gy17s8nhaudn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftulk7n05gy17s8nhaudn.png" alt="Selecting the voice assistant profile in the Assistant Launcher" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the profile settings, set the &lt;strong&gt;Voice Launcher Function&lt;/strong&gt; to the function you created earlier:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c6shw4wjzs8yn853qfb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c6shw4wjzs8yn853qfb.png" alt="Assigning the voice launcher function in the assistant profile settings" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  One gotcha
&lt;/h3&gt;

&lt;p&gt;I believe this is a bug, but you can't currently activate a voice assistant profile in the UI without a telephony system configured. The workaround: go directly to the &lt;code&gt;sys_now_assist_deployment&lt;/code&gt; table, open your voice assistant profile record, and activate it manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  That's it!
&lt;/h2&gt;

&lt;p&gt;Make sure you have some voice agents activated (or create your own), and you're good to go; launch them straight from the mobile app.&lt;/p&gt;

&lt;p&gt;Have fun, and let me know if you build something cool with it!&lt;/p&gt;

</description>
      <category>servicenow</category>
      <category>voiceagent</category>
      <category>voice</category>
      <category>mobile</category>
    </item>
    <item>
      <title>How to create a Web Search AI Agent on ServiceNow</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Mon, 24 Mar 2025 10:34:25 +0000</pubDate>
      <link>https://dev.to/23thom/how-to-create-a-web-search-ai-agent-on-servicenow-5gjo</link>
      <guid>https://dev.to/23thom/how-to-create-a-web-search-ai-agent-on-servicenow-5gjo</guid>
      <description>&lt;p&gt;This is a guide on how to create a Web Search AI Agent on ServiceNow.&lt;br&gt;
I'm using patch Yokohama Patch 1 and AI Agent plugin 3.0.9.&lt;/p&gt;

&lt;p&gt;For the Web search, there are two flows that can be used as shown on the flow diagram below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzjg1jzik84rwmveke7s2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzjg1jzik84rwmveke7s2.png" alt=" " width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first path is searching and scraping, where we first search with Bing or Google. Then, on those URLs, we scrape with Scrapping Bee or Crawlbase. The last step is to send that scraped data to our NowLLM to create an answer. This is the default path that the Websearch tool would use.&lt;/p&gt;

&lt;p&gt;The second path is to use an AI search engine like Perplexity or Google Gemini to create the answer for the search query.&lt;/p&gt;

&lt;p&gt;You’ll need to go into the credentials tables in ServiceNow and enter your own API keys for each of those services.&lt;/p&gt;

&lt;p&gt;The following image shows the credentials table (discovery_credentials) and is filtered to the "AI Websearch" application.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F082z6c35f6q6p4fj3vmx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F082z6c35f6q6p4fj3vmx.png" alt=" " width="800" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the moment, I'm using mostly perplexity because that's a key I have. For Scraping Bee and Crawlbase, you can get test keys with your personal email to test. If you are using Perplexity, don't forget to add 'Baerer' as well when you parse in the API key. &lt;/p&gt;

&lt;p&gt;Now, we also need to define the default definition (which provider) every capability should use. For this, we are going to the 'one extend capability' table (sys_one_extend_capability). Filter for the type (column) 'Websearch', and you will see five entries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqpe9rq6helgwrpzzsihh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqpe9rq6helgwrpzzsihh.png" alt=" " width="323" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's open the 'AI Search answers' record. Here, we can choose between Perplexity or Gemini; this depends on which API key you added to the credentials table. I'm using Perplexity, so you need to change Gemini default to false and Perplexity to true:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnsyk55fb04huf3j6uobw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnsyk55fb04huf3j6uobw.png" alt=" " width="775" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you also want to use the default path for searching and scraping, you need to change to the right providers in the 'one extend capability' for 'Web Search APIs', which would be Google or Bing, and 'Web Scraping APIs', which would be Crawlbase or ScrapingBee. &lt;/p&gt;

&lt;p&gt;Now that everything is set up for the 'Websearch' tool, we can create our Websearch AI agent in the AI Agent Studio.&lt;/p&gt;

&lt;p&gt;First, create a new AI Agent and then you can write your instructions, which can be very simple like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpzb9s5r7vfohp7hy43td.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpzb9s5r7vfohp7hy43td.png" alt=" " width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important!!&lt;/strong&gt; You can see that I also wrote, &lt;strong&gt;'Use as search_type input 'ai_answers'&lt;/strong&gt;, in the instructions. As described above, there are two ways how the search can be done: the searching and scraping or the AI answer path. With that instruction, I'm telling the tool to go the AI answers way, which is using, in my case, Perplexity. This is up to you which path you want to use. Just remember that the default path is the searching and scraping, so you need to have that set up and all API keys need to be valid.&lt;/p&gt;

&lt;p&gt;On the next page of the AI agent you can now just add the 'web search' tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkm5hgo78lf1ozcxwopmu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkm5hgo78lf1ozcxwopmu.png" alt=" " width="793" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvspl58y8331hb5trowaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvspl58y8331hb5trowaj.png" alt=" " width="789" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the instructions above, I'm setting the value in the inputs field 'search_type' to 'ai_answers' to ensure it uses the second path. Again, this is up to you to design the tool. You can also see that there are other input values, which you can play around with.&lt;/p&gt;

&lt;p&gt;I hope that helps and have fun creating awesome AI Agents on ServiceNow!&lt;/p&gt;

</description>
      <category>servicenow</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>Skill kit: use output from LLM and save to custom field</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Fri, 30 Aug 2024 15:29:38 +0000</pubDate>
      <link>https://dev.to/23thom/skill-kit-use-output-from-llm-and-save-to-custom-field-454j</link>
      <guid>https://dev.to/23thom/skill-kit-use-output-from-llm-and-save-to-custom-field-454j</guid>
      <description>&lt;p&gt;The newly released skill kit to build your own Now Assist (Gen AI) skills is amazing. If you had that chance to test it already, I'm sure you agree! :)&lt;/p&gt;

&lt;p&gt;The newly created skill can then be used via a UI action in your forms. This means you may also want to store the output from the LLM in a field on your form.&lt;/p&gt;

&lt;p&gt;An easy way is to already apply a postprocessing script first in the skill kit:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(function(payload) {&lt;br&gt;
    var response = JSON.parse(payload.response);&lt;br&gt;
    payload.response[0] = response["model_output"];&lt;br&gt;
    return payload;&lt;br&gt;
})(payload);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And then, in your UI Action, you can add directly in the try part:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var returnObj = sn_one_extend.OneExtendUtil.execute(request);&lt;br&gt;
    current.u_custom_field = returnObj.capabilities["capabilitySysId"].response;&lt;br&gt;
    current.update();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Please also replace the "capabilitySysId" with the sysId of your capability. You find it in the generated UI action.&lt;br&gt;
You can then also replace the 'u_custom_field' with the field on your form you want to save the output into. For one skill I told the LLM to output me HTML and saved it into a HTML field. Worked very well!&lt;/p&gt;

&lt;p&gt;Happy coding! :)&lt;/p&gt;

</description>
      <category>servicenow</category>
    </item>
    <item>
      <title>Text-to-Code for ServiceNow</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Sat, 20 Apr 2024 08:37:22 +0000</pubDate>
      <link>https://dev.to/23thom/text-to-code-for-servicenow-13n8</link>
      <guid>https://dev.to/23thom/text-to-code-for-servicenow-13n8</guid>
      <description>&lt;p&gt;In this blog post, I want to share some good practices for code generation in ServiceNow and some hints about prompt engineering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Generation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generate programming code has become one of the most popular applications of LLMs, and on the ServiceNow platform, you can generate ServiceNow-specific javascript code through an LLM.&lt;/p&gt;

&lt;p&gt;Firstly, the Model that is used for code generation (as of April 2024) is a fine-tuned version of StarCoder (&lt;a href="https://downloads.docs.servicenow.com/resource/enus/infocard/text-to-code-llm.pdf"&gt;model card&lt;/a&gt;). StarCoder 2 was released on February 28, 2024 (&lt;a href="https://www.servicenow.com/company/media/press-room/huggingface-nvidia-launch-starcoder2.html"&gt;StarCoder 2 press release&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;StarCoder was trained using sentinel tokens to enable support for Fill In the Middle (FIM) style prompts, and it also expected prompts in a certain format for code generation and code completion. &lt;/p&gt;

&lt;p&gt;This means if you create a new prompt, it will use the above code for the context.&lt;/p&gt;

&lt;p&gt;Let's go into ServiceNow and create our first prompt. Almost all script editors in ServiceNow now support text-to-code. These steps are based on the assumption, that you already activated the Text-to-code capability in the Now Assist admin console. &lt;/p&gt;

&lt;p&gt;Our first try:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof5s00jki8y1kxjwgh3l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof5s00jki8y1kxjwgh3l.png" alt="first prompt" width="800" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To write a prompt you can use the comment function. Either you do the "//prompt" or for longer prompts, you can also use the "/* prompt here */". Once the prompt is completed hitting ctrl + Enter will then trigger Now Assist to generate the code.&lt;/p&gt;

&lt;p&gt;Every output comes first as a draft (greyed out), so you can refine your prompt or accept it by pressing "tab".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adding instructions to the prompt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I found out, that if you give the LLM instructions, you can get better results. I like to add the variable name to my prompt like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14hsl29ix1h4mg3e4oue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14hsl29ix1h4mg3e4oue.png" alt="instructions" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that, you can incorporate name conventions into your prompts and get better results. As a general rule of thumb, and this applies to LLMs usage in general too, always ask yourself – could an intern at my company carry out this task based on the description that was given in the prompt?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fill in the middle&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As the model was trained to support code that was written before, it will also use parts above the prompt, which can look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6y6u8nb1boa0mt9eeby.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6y6u8nb1boa0mt9eeby.png" alt="FIM" width="609" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here I just referred to the array, and it knew I meant the fruits array.&lt;/p&gt;

&lt;p&gt;Those are a couple of tricks I learned when using the Text-to-code features (Now Assist for Creator) over the last weeks. I will try to update this post if I learn more. &lt;/p&gt;

&lt;p&gt;Happy coding :)&lt;/p&gt;

&lt;p&gt;P.S. Credit to my colleague Badrul Alom for the review and feedback&lt;/p&gt;

</description>
      <category>servicenow</category>
      <category>text2code</category>
    </item>
    <item>
      <title>Composite Record Producer, a upgrade to Record Producer</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Tue, 22 Aug 2023 17:25:34 +0000</pubDate>
      <link>https://dev.to/23thom/composite-record-producers-a-upgrade-to-record-producer-3140</link>
      <guid>https://dev.to/23thom/composite-record-producers-a-upgrade-to-record-producer-3140</guid>
      <description>&lt;p&gt;We all love our ServiceNow Record Producer (RP). They are a great tool to collect information on a portal to kick off a process. &lt;br&gt;
Record Producer are creating one record in a table of your choice. Personally, I prefer Record Producer compared to Catalog Items.&lt;/p&gt;

&lt;p&gt;Maybe you also have the requirement to not only create one record in a table, instead create two or more records in different tables. &lt;br&gt;
With Composite Record Producer (CRP) you can do that! The only thing is, the second record table needs to have a connection to your main table as a reference. That means you can create a new material request and also directly create the associated account if needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_c5WKr2I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hgmhykspu6a8jkgdx85a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_c5WKr2I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hgmhykspu6a8jkgdx85a.png" alt="Image description" width="800" height="668"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you create a new CRP you will see the normal RP form where you can choose the table in which the record will be saved in. You can create variables, the same way you would with Record Producers. The biggest difference is that you have a related list entry to "Create a producer set". &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yDt8vRRM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2s76de85vfhqd4o8t058.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yDt8vRRM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2s76de85vfhqd4o8t058.png" alt="Image description" width="774" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the producer set you will need to define the target table and the reference field that links the target table to your original CRP table. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l26C3t1s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zqw34359r9p2faxsdr1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l26C3t1s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zqw34359r9p2faxsdr1r.png" alt="Image description" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that you can add variables to that producer set the same way you always did. The values of those variables will be then saved in the second record created from your producer set.&lt;/p&gt;

&lt;p&gt;Pretty powerful no? Have fun exploring and happy building :)&lt;/p&gt;

</description>
      <category>servicenow</category>
      <category>recordproducer</category>
    </item>
    <item>
      <title>Moving away from Update Sets (to AppRepo)</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Wed, 19 Jul 2023 14:43:24 +0000</pubDate>
      <link>https://dev.to/23thom/moving-away-from-update-sets-to-apprepo-9ba</link>
      <guid>https://dev.to/23thom/moving-away-from-update-sets-to-apprepo-9ba</guid>
      <description>&lt;p&gt;Update Sets, we love them and hate them at the same time. As you maybe already heard, ServiceNow wants to slowly move away from Update Sets. They will of course always be there and have still a lot of value, but for releasing new versions of a customisation or a custom app, there are, in my humbled opinion, better ways! :)&lt;/p&gt;

&lt;p&gt;In this post I want to describe how you can transition from using update sets or Git to deploy to production to using our Application Repository. Most of the time, we are not starting from scratch or greenfield and you may already started developing custom extension of the OOTB workflows or even custom applications. You even created your custom extensions or apps in scopes, great, this is good practice!&lt;/p&gt;

&lt;p&gt;An architecture could look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n98dcr47q3or6bj4mxj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n98dcr47q3or6bj4mxj.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this example here, I'm using two instances. The application was developed on my dev instance and then I used GitHub for the first deployment of the app to my Prod Instance. (I could have done the same thing with Update Sets.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pucoqdn08d4cmh8c7x8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pucoqdn08d4cmh8c7x8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The app on PROD is now also stored in the "sys_app" table. As we now want to do new deployments via Application Repository, we need to convert our application. You can go to the sys_app table and click on the application you want to convert and in the related link list you will find the link "Convert to application Repository Mode"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyyi1lkveacqqzqoseaq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyyi1lkveacqqzqoseaq.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;THIS YOU ARE ONLY DOING ON YOUR PRODUCTION INSTANCE!! Very important!&lt;/p&gt;

&lt;p&gt;What this is doing, is moving the application from the "sys_app" table to "sys_store_app" table. New upgrades will now only be pushed via the application repository.&lt;/p&gt;

&lt;p&gt;Lets go back to our development instance and add something to our application. This can be done in Studio or App Engine Studio (AES), that does not matter. You will also see that the app on DEV is still in the "sys_app" table.&lt;/p&gt;

&lt;p&gt;I added a new business rule in studio to my application:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk08gpa1u8dkohr53pveq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk08gpa1u8dkohr53pveq.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I can now publish my change to the App Repo via Studio or if I want to use the pipeline functionality of App Engine (shown in the architecture picture above) I can go into AppEngine Studio and do a Submit there.&lt;/p&gt;

&lt;p&gt;Publish in Studio:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwjm1j3i5747olllqx6z7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwjm1j3i5747olllqx6z7.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Submit in App Engine Studio:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3hvo1u2y7u6zack8095.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3hvo1u2y7u6zack8095.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are using App Engine Studio, it will use the pipeline capability and will also show up as a deployment request in App Engine Management Center. If you are not using AES and only using Studio, it will directly deploy it to the App Repo.&lt;/p&gt;

&lt;p&gt;On you production instance you can then install the update via the "My Company Applications":&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fco2584d15twqxj5tegel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fco2584d15twqxj5tegel.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are using AppEngine Studio and the App Engine Pipelines, it will do that automatically, as soon as you approved the deployment request (uses the CI/CD APIs).&lt;/p&gt;

&lt;p&gt;Some important information about deleting, as this question comes up quite often. Until New York we did not ship delete operations, so you had to deactivate if you for example had a business rule that you were not using anymore. After New York we now use the author_elective_update folder to ship deletes. Some more information here:&lt;br&gt;
&lt;a href="https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0794114" rel="noopener noreferrer"&gt;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0794114&lt;/a&gt;&lt;br&gt;
&lt;em&gt;In short, you have control over how the author_elective_update folder is handled. You can turn it off totally by setting com.glide.apps.include_my_deletes to false. You can set the specific level of records you want to apply (everything, everything except schema changes, or only Choice Sets) for your company instances only. You can also make sure that the apps you develop will ship Deletes in the author_elective_update folder, but you skip all incoming changes from any vendor app's author_elective_update folder by setting com.glide.apps.disable_elective_skip_history to true and also setting com.glide.apps.force_skips to true.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>servicenow</category>
      <category>appengine</category>
      <category>apprepo</category>
    </item>
    <item>
      <title>Show a second record form as a tab in your workspace</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Wed, 07 Dec 2022 15:58:07 +0000</pubDate>
      <link>https://dev.to/23thom/show-a-second-record-form-as-a-tab-in-your-workspace-1c9j</link>
      <guid>https://dev.to/23thom/show-a-second-record-form-as-a-tab-in-your-workspace-1c9j</guid>
      <description>&lt;p&gt;This blog post shows you how to create a second record page as a tab in your workspace page. This was done on a Tokyo instance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2r5cn8nczw0ojy8hp82z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2r5cn8nczw0ojy8hp82z.png" alt="Image description" width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fowdkj69v6crv154b3mdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fowdkj69v6crv154b3mdk.png" alt="Image description" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To achieve this we need to do following:&lt;/p&gt;

&lt;p&gt;First let's create another tab entry in our main-tab component:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0wssplky5ntznnpdxdw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0wssplky5ntznnpdxdw.png" alt="Image description" width="305" height="437"&gt;&lt;/a&gt;&lt;br&gt;
I called the tab 'User Record'. Then I added a viewport component to that body of my newly created tab.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2tjor16jtm2r27km9tx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2tjor16jtm2r27km9tx.png" alt="Image description" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can then click on the 'Edit content' on the canvas and you will get redirect to the sub-page. We then need to create a new sub-page and remember the route to the sub-page.&lt;/p&gt;

&lt;p&gt;We now need to configure an event on page ready, so the viewport gets loaded. This event is on the "parent" page and not on the sub-page.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbfa1qbtkmqn7jz9jtsv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbfa1qbtkmqn7jz9jtsv.png" alt="Image description" width="800" height="515"&gt;&lt;/a&gt;&lt;br&gt;
The viewportElementId is the ID of your viewport component and route is the name of your sub-page from the step above. If we would not configure that event, the viewport would be empty when we open the page.&lt;/p&gt;

&lt;p&gt;After that we will add a new data resource to get the information we need for our viewport component. In our case we want to show the user from the caller_id field in the newly created form. It is a very simple look up record data resource: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94tdu08yqjdjib9klp1o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94tdu08yqjdjib9klp1o.png" alt="Image description" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we want to assign the caller sysId to a client state parameter to then use that in our viewport sub-page, I created a little client script to assign the state parameter.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffcvenc7r0z1zudgbtard.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffcvenc7r0z1zudgbtard.png" alt="Image description" width="800" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Important: don't forget to create a event mapping on your look up record data resource and run the client script on the 'Data Fetch Succeeded' event.&lt;/p&gt;

&lt;p&gt;Next we need to create a property on our sub-page configuration where we send the data from our main page to our sub-page. I called my new property 'parentUserId' and assigned my client state parameter.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1d2psren4odwu9nr7lb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs1d2psren4odwu9nr7lb.png" alt="Image description" width="304" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last step is to add the form component in our subpage and use the preset so we don't need to do the hole configuration. On the preset configuration we can add the table and as Sys Id we do the data banding to our newly created page property via context.props:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5pemv6r6k9123ri1r3z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5pemv6r6k9123ri1r3z.png" alt="Image description" width="310" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is it :) Have fun!&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
    <item>
      <title>How to check IntegrationHub Usage</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Wed, 09 Nov 2022 12:34:04 +0000</pubDate>
      <link>https://dev.to/23thom/how-to-check-integrationhub-usage-3kh0</link>
      <guid>https://dev.to/23thom/how-to-check-integrationhub-usage-3kh0</guid>
      <description>&lt;p&gt;You can find a detailed breakdown in the table 'ua_ih_usage'.&lt;/p&gt;

&lt;p&gt;There you can see nicely how many transaction where consumed by which spoke. &lt;br&gt;
Its split up by month and you can drill in and see which action the call came from. Super handy to drill in and find out more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DPw4Ofd4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eyiix3hpx72njzvf6jll.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DPw4Ofd4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eyiix3hpx72njzvf6jll.png" alt="Image description" width="800" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>servicenow</category>
      <category>integrationhub</category>
      <category>integrations</category>
    </item>
    <item>
      <title>ServiceNow: When to use Customer Workflow (CSM) and when to go with Creator Workflow (AppEngine)</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Mon, 07 Nov 2022 16:46:55 +0000</pubDate>
      <link>https://dev.to/23thom/servicenow-when-to-use-customer-workflow-csm-and-when-to-go-with-creator-workflow-appengine-2ajf</link>
      <guid>https://dev.to/23thom/servicenow-when-to-use-customer-workflow-csm-and-when-to-go-with-creator-workflow-appengine-2ajf</guid>
      <description>&lt;p&gt;ServiceNow offers with Customer Workflow a competitive application for Customer Service Management (CSM). You buy a product with ready-to-use processes, tables, forms, and experiences. It helps you orchestrate activities between your customers, consumers, partners, and other stakeholders involved in serving your customers. So, you get a lot of pre-packed stuff like data models, processes, tables, forms, portals, workspaces, and roles.&lt;/p&gt;

&lt;p&gt;If you want to implement competitive Customer Service Management within your organization, this is pretty cool.&lt;/p&gt;

&lt;p&gt;With Creator Workflow, or sometimes we call it AppEngine, you get all the tools that were used to build CSM. With those tools, you can develop your own applications and workflows on the platform. You start with great groundspeed using the App Engine toolset, to create your process and leverage all platform capabilities and some specific AppEngine features.&lt;/p&gt;

&lt;p&gt;ServiceNow is a low-code platform at its core. Fred Luddy, the founder of ServiceNow, had that in mind when he built the platform. He was just a couple of years ahead, so he built the ITSM module on top of the platform. But now, we are ready and have the governance capabilities to support those endeavors.&lt;/p&gt;

&lt;p&gt;AppEngine brings the AppEngine Studio (AES), our low-code developer IDE to you. It is tailored for low-code developers, but that doesn't mean you can't use it as a pro-code developer as well. I love it, and I also love to code ;), as it is not an all-or-nothing decision. You can use AES to create the app and use all the helpful features to modify, faster adopt requirements and if you need, jump into the backend or the old studio.&lt;/p&gt;

&lt;p&gt;So, the big question is when you should use CSM an when you should create your own application with AppEngine. I genuinely believe you need to understand CSM and the processes behind it to make a good decision. Because with CSM, you get a lot of preconfigured processes out-of-the-box. This can be great, but you also need to adopt them. One rumor that floats around,  I would like to address at the beginning, you don't need CSM automatically, just because your use case includes external customers/users. That can also be covered by AppEngine (external requestors).&lt;/p&gt;

&lt;p&gt;I see "80/20" as a good rule of thumb when thinking about this decision. Can I use 80% of the processes I get and maybe need to change/modify not more than 20%? If yes, you could consider going with CSM. But if the methodology and data model don't work for you and you would need to customize/change more than 20%, I urge you to consider building your own application with AppEngine. That helps you start smaller, which means you don't need to implement the whole application and have a big-bang approach. You can start slowly and build it up over time.&lt;/p&gt;

&lt;p&gt;That should show, that you need to understand the processes you get with CSM and see if you can adapt your organization to it. Because if you buy the application and customize it to your needs, you will have regularly trouble with future upgrades! With CSM, you also get preconfigured roles. This is great, but you need to adopt those roles, and if you want to re-write or completely change the whole role structure, you could get in trouble as there are so many flows and business rules depending on those standard roles.&lt;/p&gt;

&lt;p&gt;I think it should also be ok to start with AppEngine, and then if you see in the future that you could adopt more from CSM, switch to the OOTB application.&lt;/p&gt;

&lt;p&gt;The attractiveness of buying a fully functional application is high; I understand that. But you must consider its implication, as the CSM space is not as standardized as ITSM. With ITIL and the whole ITSM movement, we have excellent and well-documented incident processes that are widely adapted and match most of the time around 80% of your requirements.&lt;/p&gt;

&lt;p&gt;Regarding licenses, CSM and AppEngine are both getting counted with the Requester, Business Stakeholder, and Fulfiller model. So, nothing different there.&lt;/p&gt;

&lt;p&gt;There are so many processes in a company that needs to be digitalized. Sometimes it is as small as replacing an Excel. ServiceNow as a platform is such a powerful tool. With AppEngine, you get the features to leverage the full potential of the low-code platform to build your processes and achieve digitalization. With the help of the AppEngine Management Center, you also have the governance tool to get visibility over your deployments and new development requests.&lt;/p&gt;

&lt;p&gt;I hope my summary of thoughts helps you deciding when you are thinking about going with an OOTB application or leveraging the platform to build your processes the way you want with AppEngine.&lt;/p&gt;

</description>
      <category>servicenow</category>
      <category>appengine</category>
      <category>csm</category>
    </item>
    <item>
      <title>Set up Document Intelligence Component in Contextual Sidebar</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Mon, 05 Sep 2022 19:06:57 +0000</pubDate>
      <link>https://dev.to/23thom/set-up-document-intelligence-component-in-contextual-sidebar-379h</link>
      <guid>https://dev.to/23thom/set-up-document-intelligence-component-in-contextual-sidebar-379h</guid>
      <description>&lt;p&gt;!This post was made for the ServiceNow Tokyo Release!&lt;/p&gt;

&lt;p&gt;With the Tokyo Release of ServiceNow we got some nice improvements to the Record page. I assume here, that you installed the Document Intelligence component already.&lt;/p&gt;

&lt;p&gt;First we need to open UI Builder (UIB) and navigate to the Record page. Then lets go to our tab sidebar component:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--reGviy5z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fnb5lqcda0h3vktvc9j7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--reGviy5z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fnb5lqcda0h3vktvc9j7.png" alt="Image description" width="348" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and add a new tab.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kRcgKQ8J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g37h5qfoa7om43y8am4v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kRcgKQ8J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g37h5qfoa7om43y8am4v.png" alt="Image description" width="384" height="874"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm selecting the "start from an empty container".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V3nnBIIu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nfslc7so8e90bnsc6kse.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V3nnBIIu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nfslc7so8e90bnsc6kse.png" alt="Image description" width="800" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then creating a tab and selecting an icon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--snD36jhR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0qfe0dsqc155v3c2y99p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--snD36jhR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0qfe0dsqc155v3c2y99p.png" alt="Image description" width="800" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In that newly created tab I can now select a component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B2g0Aivs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h719aond0abr28a7eq5s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B2g0Aivs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h719aond0abr28a7eq5s.png" alt="Image description" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we need to do some wiring. I created a GraphQL Data Broker to fetch me the the right DI task (di_task). As we have a source_table and source_record field on the di_task table, we can use that to get our di_task.&lt;/p&gt;

&lt;p&gt;The Properties of my GraphQL data broker is a filter, so I can set the right filter in the UIB.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt; 
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;filter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;label&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Filter for getting the right docIntel Task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Query conditions in the 'encoded query' format, for filtering the di_task table&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;readOnly&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fieldType&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;condition_string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mandatory&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;defaultValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;typeMetadata&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;table&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;di_task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;}]&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then a simple query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="nx"&gt;GlideRecord_Query&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;di_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;queryConditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;$filter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;_results&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;display_name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;value&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
         &lt;span class="nx"&gt;sys_id&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;value&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets now wire up the Filter on the UIB and do the data binding. We can also use the props data of the record page in the filter conditions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vuUXrE-y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kqj7vpt71umv2afhbssm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vuUXrE-y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kqj7vpt71umv2afhbssm.png" alt="Image description" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the last point is to do the data binding on the component.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dwUcZkzk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jynqhz93fcn9mp1z5i2w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dwUcZkzk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jynqhz93fcn9mp1z5i2w.png" alt="Image description" width="700" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thats it, have fun!&lt;/p&gt;

</description>
      <category>servicenow</category>
      <category>tokyo</category>
    </item>
    <item>
      <title>Create a Theme variant for your configurable Workspace</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Tue, 09 Aug 2022 19:34:00 +0000</pubDate>
      <link>https://dev.to/23thom/create-a-theme-for-your-configurable-workspace-5000</link>
      <guid>https://dev.to/23thom/create-a-theme-for-your-configurable-workspace-5000</guid>
      <description>&lt;p&gt;The following tutorial should help you create your own theme variant that is used for your hole instance including your configurable workspace.&lt;/p&gt;

&lt;p&gt;If we go in the UI Builder to the experience settings and then to Branding and theming we can see that the Polaris theme is locked in and can't be changed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8bzwwgbapeizxrkuawd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8bzwwgbapeizxrkuawd.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is two approaches. We could create our own Theme and then create a sys_property called 'glide.ui.polaris.theme.custom' and add the sysId of the theme or just add a variant to our polaris theme (I'm creating a variant in this example).&lt;/p&gt;

&lt;p&gt;To generate a full color theme, I'm using the color generator here: &lt;a href="https://theme.deoprototypes.com/color-generator-p/" rel="noopener noreferrer"&gt;https://theme.deoprototypes.com/color-generator-p/&lt;/a&gt;&lt;br&gt;
Click on the 'Auto Generate' button on the top right and add three color as brand neutral, primary and secondary.&lt;/p&gt;

&lt;p&gt;If you generated your color theme, you can copy the JSON with the button 'copy JSON' on the top right. There is also a 'Dark' toggle if you fancy a dark theme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5f3764shij7tt7viddia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5f3764shij7tt7viddia.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to create a Variant to the polaris Theme:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the table 'sys_ux_style'&lt;/li&gt;
&lt;li&gt;Add a new record with type 'Variant'&lt;/li&gt;
&lt;li&gt;Use the following structure:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Here&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;can&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;copy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;generator&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Copy the JSON in to the structure&lt;/li&gt;
&lt;li&gt;Add in the related List 'UX Theme Styles' your variant to the polaris Theme.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj8sucdcse8pa669fgp1w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj8sucdcse8pa669fgp1w.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feij7o3n3myhwdwihnsd0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feij7o3n3myhwdwihnsd0.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can select your variant via the user preferences --&amp;gt; Theme&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4swqv7hs9y09p7mz3h55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4swqv7hs9y09p7mz3h55.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to add a logo to your theme variant you need to add a UX Style Asset (related list). In the Asset reference field, you need to add a new UX theme asset with the category 'image'. The logo you can just add as an attachment to that record. Important, in the UX Style asset 'Asset Properties' field you need to add following JSON:&lt;br&gt;
{ "position": "header_logo" }&lt;/p&gt;

&lt;p&gt;Thats all there is, have fun! :)&lt;/p&gt;

</description>
      <category>servicenow</category>
      <category>uibuilder</category>
      <category>workspace</category>
    </item>
    <item>
      <title>ES12 in ServiceNow scoped apps</title>
      <dc:creator>Thom</dc:creator>
      <pubDate>Mon, 08 Aug 2022 06:25:39 +0000</pubDate>
      <link>https://dev.to/23thom/es12-in-servicenow-scoped-apps-50le</link>
      <guid>https://dev.to/23thom/es12-in-servicenow-scoped-apps-50le</guid>
      <description>&lt;p&gt;FINALLLYYYY!!!&lt;br&gt;
With the new Tokyo release, we can now use ES12 in our scope applications. Unfortunately not yet for global, but lets take that win right? :)&lt;/p&gt;

&lt;p&gt;You can change the 'Javascript mode' in your 'Application Settings' via Studio or UI16.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GA_4aqOt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v6ou45wojiqsv06qnzky.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GA_4aqOt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v6ou45wojiqsv06qnzky.png" alt="Image description" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have fun!&lt;/p&gt;

</description>
      <category>servicenow</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
