<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en" xml:base="https://jace.pro/">
  <title>Writings about development, tech, and life.</title>
  <subtitle>Creating the things I want to exist and sharing what I learn along the way.</subtitle>
  <link href="https://jace.pro/feed.xml" rel="self" />
  <link href="https://jace.pro/" />
  <updated>2026-05-14T19:34:19Z</updated>
  <id>https://jace.pro/</id>
  <author>
    <name>Jace Benson</name>
  </author>
	<entry>
      <title>ServiceNow&#39;s New AI Pricing Tiers</title>
      <link href="https://jace.pro/blog/servicenows-new-ai-pricing-tiers/" />
      <updated>2026-04-19T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenows-new-ai-pricing-tiers/</id>
      <content type="html">
				&lt;p&gt;ServiceNow has been making some big waves on their SKUs last week to “include AI” with all of them, allegedly.&lt;/p&gt;&lt;p&gt;I take this all with a grain of salt until I can actually try it.&lt;/p&gt;&lt;h2 id=&quot;the-announcement&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenows-new-ai-pricing-tiers/#the-announcement&quot; class=&quot;heading-anchor&quot;&gt;The announcement&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow announced &lt;a href=&quot;https://newsroom.servicenow.com/press-releases/details/2026/ServiceNow-moves-beyond-the-sidecar-AI-era-giving-customers-a-complete-AI-native-experience-across-all-products-and-packages/default.aspx&quot; rel=&quot;noopener&quot;&gt;giving customers AI-native experiences across all products and packages&lt;/a&gt; on April 9th, 2026.&lt;/p&gt;&lt;p&gt;I thought this meant they were going to include Now Assist in all their SKUs. I got this pricing thing confused with them releasing &lt;a href=&quot;https://agentskills.io/home&quot; rel=&quot;noopener&quot;&gt;skills&lt;/a&gt; for the &lt;code&gt;now-sdk&lt;/code&gt;. You can read more about that on the &lt;a href=&quot;https://jace.pro/blog/servicenow-ai-tools-you-can-use-today/&quot;&gt;AI tools you can use today&lt;/a&gt; post.&lt;/p&gt;&lt;p&gt;Let me frame up the two posts that most impacted my thinking on this.&lt;/p&gt;&lt;p&gt;First, well there’s my opinion that if it doesn’t make ServiceNow Money, Reduce their costs or make them more sticky, they won’t do it. So with that, this will probably be a increase in price for customers weather they want it or not.&lt;/p&gt;&lt;p&gt;Then consider the leading voice from UpperEdge who helps custoemr negotate with ServiceNow, Adam Mansfield. He posted a &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:7450519796988866560?updateEntityUrn=urn%3Ali%3Afs_updateV2%3A%28urn%3Ali%3Aactivity%3A7450519796988866560%2CFEED_DETAIL%2CEMPTY%2CDEFAULT%2Cfalse%29&quot; rel=&quot;noopener&quot;&gt;short video (5 minutes) on AI enabled Servicenow Products here&lt;/a&gt;. My notes from his video are;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Innovation is good, but do customers want all of this?&lt;/li&gt;&lt;li&gt;What are going to be the cost implications with the product repackaging?&lt;/li&gt;&lt;li&gt;At the end of the day do you want or need any of this and if you don’t what does that mean?&lt;/li&gt;&lt;li&gt;Still Hybrid + Consumpation based metering.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Then there’s Michel Regueiro, who’se been been around ServiceNow as long as I have. He founded iconica a Servicenow consultancy that helps get stuff done quick. He &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:7450495195336523778?updateEntityUrn=urn%3Ali%3Afs_updateV2%3A%28urn%3Ali%3Aactivity%3A7450495195336523778%2CFEED_DETAIL%2CEMPTY%2CDEFAULT%2Cfalse%29&quot; rel=&quot;noopener&quot;&gt;posted this is Servicenow’s correction for 2 years of making a mistake of it here&lt;/a&gt;.&lt;br&gt;My notes from his post are;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ai being embedded across all tiers with Moveworks is a good thing. No extra procurement, no seperate sku.&lt;/li&gt;&lt;li&gt;They should have done this 2 years ago when they launched Now Assist as an addon.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;the-pricing&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenows-new-ai-pricing-tiers/#the-pricing&quot; class=&quot;heading-anchor&quot;&gt;The pricing&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;They also changed their pricing model to include AI in the SKUs. Here’s one of their &lt;a href=&quot;https://www.linkedin.com/posts/the-ai-first-era-begins-for-partners-ugcPost-7449502470051024896-Lrae?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAAAGfKkYB3XFd0Ybegy4h2swmWmxgXj4HMN0&quot; rel=&quot;noopener&quot;&gt;LinkedIn videos about it&lt;/a&gt;. Three tiers: Foundation, Advanced, and Prime.&lt;/p&gt;&lt;p&gt;The &lt;a href=&quot;https://www.linkedin.com/posts/dylanlevy_servicenow-ai-windward-share-7449805165550989312-XcDg?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAAAGfKkYB3XFd0Ybegy4h2swmWmxgXj4HMN0&quot; rel=&quot;noopener&quot;&gt;VP of Sales at Windward posted this image on LinkedIn&lt;/a&gt;.&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/q0i_1aUOFl-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/q0i_1aUOFl-650.jpeg&quot; alt=&quot;Image of the new pricing model&quot; width=&quot;650&quot; height=&quot;352&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;I went looking for this on the &lt;a href=&quot;https://www.servicenow.com/products/entitlements.html&quot; rel=&quot;noopener&quot;&gt;entitlements pages&lt;/a&gt; and &lt;a href=&quot;https://www.servicenow.com/products/entitlements-packages.html&quot; rel=&quot;noopener&quot;&gt;entitlements packages pages&lt;/a&gt; but they’re out of date. The Now Assist overview was last updated March 12, 2026. So they haven’t caught up yet.&lt;/p&gt;&lt;h2 id=&quot;whats-actually-in-each-tier&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenows-new-ai-pricing-tiers/#whats-actually-in-each-tier&quot; class=&quot;heading-anchor&quot;&gt;What’s actually in each tier&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The best official source I found is the &lt;a href=&quot;https://www.servicenow.com/products/itsm/pricing.html&quot; rel=&quot;noopener&quot;&gt;ITSM pricing page&lt;/a&gt;. Here’s what each tier looks like for ITSM specifically.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Foundation&lt;/strong&gt; — AI helps the team work. Summarization, pattern recognition, categorization, task-based assistance. You get Incident, Request, Asset Management, CMDB, Virtual Agent, Now Assist Foundation, Moveworks, Predictive Intelligence, App Engine Starter (10 tables).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Advanced&lt;/strong&gt; — AI completes part of the work. Everything in Foundation plus Major Incident Management, On-Call, Change Management, Problem Management, AI Voice Agents, Platform Analytics Advanced, Process Mining (10K records/year), Now Assist Advanced, Moveworks Advanced, App Engine Starter (25 tables).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Prime&lt;/strong&gt; — AI works end to end. Everything above plus &lt;strong&gt;L1 Service Desk AI Specialist&lt;/strong&gt;, &lt;strong&gt;AI Agents for ITSM&lt;/strong&gt;, &lt;strong&gt;AI Agent for DEX&lt;/strong&gt;, DevOps Change Velocity, Digital Product Release, Process Mining (15K records/year), Now Assist Prime, Moveworks Prime, App Engine Starter (50 tables).&lt;/p&gt;&lt;p&gt;All three tiers include AI Control Tower, Workflow Data Fabric, and Data Fabric Credits. The &lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/legal/data-fabric-credit-overview.pdf&quot; rel=&quot;noopener&quot;&gt;Data Fabric Credit overview PDF&lt;/a&gt; spells out credit consumption but none of it seems AI-related except “AI Data Explorer” which is unhelpful.&lt;/p&gt;&lt;h2 id=&quot;my-take&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenows-new-ai-pricing-tiers/#my-take&quot; class=&quot;heading-anchor&quot;&gt;My take&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The pricing model is not clear, which is normal. I’m going with the assumption that nothing has changed in practice. ServiceNow hasn’t put GenAI on PDIs so we can’t play with it. They haven’t said what the actual limits are for Foundation, Advanced, or Prime. Even if they did, current customers won’t see changes until renewal. For now this is a marketing announcement.&lt;/p&gt;&lt;p&gt;I know, wind out of sails. But if you want things you can actually use today, I wrote up &lt;a href=&quot;https://jace.pro/blog/servicenow-ai-tools-you-can-use-today/&quot;&gt;the AI tools that work right now&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>ServiceNow AI Tools You Can Use Today</title>
      <link href="https://jace.pro/blog/servicenow-ai-tools-you-can-use-today/" />
      <updated>2026-04-19T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenow-ai-tools-you-can-use-today/</id>
      <content type="html">
				&lt;p&gt;ServiceNow just made a &lt;a href=&quot;https://jace.pro/blog/servicenows-new-ai-pricing-tiers/&quot;&gt;big announcement about AI in every SKU&lt;/a&gt; but you can’t actually use most of it yet. No GenAI on PDIs, no clear tier limits, and current customers won’t see changes until renewal.&lt;/p&gt;&lt;p&gt;So what can you use right now? Here’s everything I know of. A &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:7450130374191484928?updateEntityUrn=urn%3Ali%3Afs_updateV2%3A%28urn%3Ali%3Aactivity%3A7450130374191484928%2CFEED_DETAIL%2CEMPTY%2CDEFAULT%2Cfalse%29&quot; rel=&quot;noopener&quot;&gt;pretty post on the difffernces here is laid out nicely by Lukasz Szumilas here&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;data-exploration&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-ai-tools-you-can-use-today/#data-exploration&quot; class=&quot;heading-anchor&quot;&gt;Data exploration&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;mcp-servers&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-ai-tools-you-can-use-today/#mcp-servers&quot; class=&quot;heading-anchor&quot;&gt;MCP Servers&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;MCP servers let AI tools like Claude, Cursor, or Opencode talk to your ServiceNow instance directly.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;ServiceNow’s official MCP&lt;/strong&gt; — &lt;a href=&quot;https://www.servicenow.com/docs/r/intelligent-experiences/create-mcp-server.html&quot; rel=&quot;noopener&quot;&gt;docs&lt;/a&gt;. Allegedly requires Prime licensing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Echelon AI’s&lt;/strong&gt; — &lt;a href=&quot;https://github.com/echelon-ai-labs/servicenow-mcp&quot; rel=&quot;noopener&quot;&gt;github&lt;/a&gt;. Python, basic auth, OAuth, or API key.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Michael Buckner’s&lt;/strong&gt; — &lt;a href=&quot;https://github.com/michaelbuckner/servicenow-mcp&quot; rel=&quot;noopener&quot;&gt;github&lt;/a&gt;. Python, basic auth only.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Nanda’s&lt;/strong&gt; — &lt;a href=&quot;https://github.com/sonisoft-cnanda/now-sdk-ext-mcp&quot; rel=&quot;noopener&quot;&gt;github&lt;/a&gt;. Uses &lt;code&gt;now-sdk&lt;/code&gt; auth, requires Node.js.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Community tutorial&lt;/strong&gt; — &lt;a href=&quot;https://www.servicenow.com/community/developer-articles/how-to-create-your-own-servicenow-mcp-server/ta-p/3298144&quot; rel=&quot;noopener&quot;&gt;How to create your own ServiceNow MCP server&lt;/a&gt;. More of a how-to guide, Python.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;clis&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-ai-tools-you-can-use-today/#clis&quot; class=&quot;heading-anchor&quot;&gt;CLIs&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;jsn&lt;/strong&gt; — &lt;a href=&quot;https://jsn.jace.pro&quot; rel=&quot;noopener&quot;&gt;jsn.jace.pro&lt;/a&gt;. Downloaded binary, basic auth, OAuth, or cookie auth.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;build-tools&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-ai-tools-you-can-use-today/#build-tools&quot; class=&quot;heading-anchor&quot;&gt;Build tools&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;These create and deploy stuff to update sets and scopes on your instance.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;now-sdk&lt;/strong&gt; — &lt;a href=&quot;https://github.com/ServiceNow/sdk&quot; rel=&quot;noopener&quot;&gt;github&lt;/a&gt;. Node.js, basic auth or OAuth. This is ServiceNow’s official SDK and where their &lt;a href=&quot;https://github.com/ServiceNow/sdk/tree/master/skills&quot; rel=&quot;noopener&quot;&gt;AI skills&lt;/a&gt; live.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Nanda’s now-sdk extension&lt;/strong&gt; — &lt;a href=&quot;https://www.npmjs.com/package/@sonisoft/now-sdk-ext-cli&quot; rel=&quot;noopener&quot;&gt;npm&lt;/a&gt;. Requires now-sdk.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;jsn&lt;/strong&gt; — &lt;a href=&quot;https://jsn.jace.pro&quot; rel=&quot;noopener&quot;&gt;jsn.jace.pro&lt;/a&gt;. Downloaded binary, basic auth, OAuth, or cookie auth.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;servicenows-ai-skills&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-ai-tools-you-can-use-today/#servicenows-ai-skills&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow’s AI skills&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Part of the &lt;a href=&quot;https://newsroom.servicenow.com/press-releases/details/2026/ServiceNow-moves-beyond-the-sidecar-AI-era-giving-customers-a-complete-AI-native-experience-across-all-products-and-packages/default.aspx&quot; rel=&quot;noopener&quot;&gt;April 2026 announcement&lt;/a&gt;, ServiceNow released &lt;a href=&quot;https://agentskills.io/home&quot; rel=&quot;noopener&quot;&gt;agent skills&lt;/a&gt; built into the &lt;code&gt;now-sdk&lt;/code&gt;. Two so far:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/ServiceNow/sdk/blob/master/skills/now-sdk-setup/SKILL.md&quot; rel=&quot;noopener&quot;&gt;now-sdk-setup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/ServiceNow/sdk/blob/master/skills/now-sdk-explain/SKILL.md&quot; rel=&quot;noopener&quot;&gt;now-sdk-explain&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The real thing here isn’t the skills themselves. It’s that ServiceNow is officially blessing external AI tools for building on the platform. That’s the door opening.&lt;/p&gt;&lt;p&gt;None of this requires the new pricing tiers. You just need an instance and credentials.&lt;/p&gt;&lt;p&gt;Related to this, some of the soruces&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/posts/edwincoronado_new-servicenow-sdk-ai-skills-servicenow-activity-7450663839253303297-PsUC?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAAAGfKkYB3XFd0Ybegy4h2swmWmxgXj4HMN0&quot; rel=&quot;noopener&quot;&gt;Edwin Coronado posted on LinkedIn about it&lt;/a&gt;. Those skills are &lt;a href=&quot;https://github.com/ServiceNow/sdk/discussions/47&quot; rel=&quot;noopener&quot;&gt;part of the &lt;code&gt;now-sdk&lt;/code&gt; tooling&lt;/a&gt;. There are &lt;a href=&quot;https://github.com/ServiceNow/sdk/tree/master/skills&quot; rel=&quot;noopener&quot;&gt;two skills&lt;/a&gt; right now:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/ServiceNow/sdk/blob/master/skills/now-sdk-setup/SKILL.md&quot; rel=&quot;noopener&quot;&gt;now-sdk-setup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/ServiceNow/sdk/blob/master/skills/now-sdk-explain/SKILL.md&quot; rel=&quot;noopener&quot;&gt;now-sdk-explain&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Not that crazy on its own, but it is ServiceNow giving you permission to use external AI tools to build on the platform. Claude Code, Opencode, Codex, whatever. That part is genuinely useful.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Setting Up Writebook on Coolify</title>
      <link href="https://jace.pro/blog/setting-up-writebook-on-coolify/" />
      <updated>2026-04-08T00:00:00Z</updated>
      <id>https://jace.pro/blog/setting-up-writebook-on-coolify/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://basecamp.com&quot; rel=&quot;noopener&quot;&gt;Basecamp&lt;/a&gt; (37signals) recently released &lt;a href=&quot;https://once.com/writebook&quot; rel=&quot;noopener&quot;&gt;Writebook&lt;/a&gt; - a simple, self-hosted application for publishing books on the web. It’s a Rails app distributed as a Docker image, and I wanted to run it on my &lt;a href=&quot;https://coolify.io&quot; rel=&quot;noopener&quot;&gt;Coolify&lt;/a&gt; server. Should be straightforward, right? Well, almost.&lt;/p&gt;&lt;h2 id=&quot;what-is-writebook&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-writebook-on-coolify/#what-is-writebook&quot; class=&quot;heading-anchor&quot;&gt;What is Writebook?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Writebook lets you publish content in Markdown, with support for picture pages, chapters, and title pages. Books can be public or private, and everything is searchable. It’s a nice alternative to throwing your documentation into yet another wiki or Confluence instance.&lt;/p&gt;&lt;p&gt;The official install uses their &lt;a href=&quot;https://once.com&quot; rel=&quot;noopener&quot;&gt;ONCE&lt;/a&gt; installer, but since I’m already running Coolify for my other apps, I wanted to deploy it there instead.&lt;/p&gt;&lt;h2 id=&quot;the-setup&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-writebook-on-coolify/#the-setup&quot; class=&quot;heading-anchor&quot;&gt;The Setup&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I created a new application in Coolify using the Docker image: &lt;code&gt;ghcr.io/basecamp/writebook:latest&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Mapped the domain to &lt;code&gt;books.jace.pro&lt;/code&gt;, added a persistent volume at &lt;code&gt;/rails/storage&lt;/code&gt;, and hit deploy. That’s when the fun started.&lt;/p&gt;&lt;h2 id=&quot;gotcha-1-ssl-conflict&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-writebook-on-coolify/#gotcha-1-ssl-conflict&quot; class=&quot;heading-anchor&quot;&gt;Gotcha #1: SSL Conflict&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Writebook tries to handle SSL internally by default. Since Coolify uses Traefik at the edge to terminate SSL, this creates a conflict.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Add an environment variable:&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;DISABLE_SSL=true&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This tells Writebook to serve plain HTTP on port 80 and let Traefik handle the certificates.&lt;/p&gt;&lt;h2 id=&quot;gotcha-2-missing-secret_key_base&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-writebook-on-coolify/#gotcha-2-missing-secret_key_base&quot; class=&quot;heading-anchor&quot;&gt;Gotcha #2: Missing SECRET_KEY_BASE&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Rails apps need a secret key base for production. The container kept crashing with:&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;ArgumentError: Missing `secret_key_base` for &#39;production&#39; environment&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Generate a key and add it as an environment variable:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;openssl rand &lt;span class=&quot;token parameter variable&quot;&gt;-hex&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then add &lt;code&gt;SECRET_KEY_BASE&lt;/code&gt; with that value to your Coolify environment variables.&lt;/p&gt;&lt;h2 id=&quot;gotcha-3-permission-denied-on-storage&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-writebook-on-coolify/#gotcha-3-permission-denied-on-storage&quot; class=&quot;heading-anchor&quot;&gt;Gotcha #3: Permission Denied on Storage&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The container started but immediately crashed with:&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Errno::EACCES: Permission denied @ dir_s_mkdir - /rails/storage/db&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Coolify creates persistent storage directories as root, but Writebook runs as a non-root user (UID 1000). The Rails user couldn’t write to the storage volume.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; SSH into your server and fix the ownership:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-R&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;:1000 /data/coolify/storage/books.jace.pro&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After that, a quick restart and the app came right up.&lt;/p&gt;&lt;h2 id=&quot;the-result&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-writebook-on-coolify/#the-result&quot; class=&quot;heading-anchor&quot;&gt;The Result&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Writebook is now running at &lt;a href=&quot;https://books.jace.pro&quot; rel=&quot;noopener&quot;&gt;books.jace.pro&lt;/a&gt;. It’s a clean, simple interface for publishing content - exactly what you’d expect from the Basecamp team.&lt;/p&gt;&lt;h2 id=&quot;coolify-self-hosting&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-writebook-on-coolify/#coolify-self-hosting&quot; class=&quot;heading-anchor&quot;&gt;Coolify + Self-Hosting&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I’ve been running Coolify for a while now and it’s been solid. Having everything in one place - my blog, various side projects, and now Writebook - makes management easier. Sure, there are occasional hiccups like permission issues, but that’s just part of self-hosting.&lt;/p&gt;&lt;p&gt;The lesson here: always check your storage permissions, and remember that Docker containers often run as non-root users even when you’re deploying as root.&lt;/p&gt;&lt;p&gt;If you’re running Coolify and want to self-host your own book publishing platform, Writebook is worth a look. Just remember those three environment variables and the permission fix.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Comparing AI Harnesses: OpenCode, Ollama, LM Studio, Claude Code, Open WebUI, and VS Code</title>
      <link href="https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/" />
      <updated>2026-03-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/</id>
      <content type="html">
				&lt;p&gt;Every week there’s a new AI coding tool. I’ve been testing the ones that actually matter: &lt;strong&gt;OpenCode&lt;/strong&gt;, &lt;strong&gt;Ollama&lt;/strong&gt;, &lt;strong&gt;LM Studio&lt;/strong&gt;, &lt;strong&gt;Claude Code&lt;/strong&gt;, &lt;strong&gt;Open WebUI&lt;/strong&gt;, and &lt;strong&gt;VS Code with Copilot&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;They all take different approaches and honestly some of them aren’t even the same kind of thing. Let me explain.&lt;/p&gt;&lt;h2 id=&quot;the-quick-version&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#the-quick-version&quot; class=&quot;heading-anchor&quot;&gt;The quick version&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Open Source&lt;/th&gt;&lt;th&gt;Runs Offline&lt;/th&gt;&lt;th&gt;Has Agent Tools&lt;/th&gt;&lt;th&gt;Cost&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://opencode.ai/&quot; rel=&quot;noopener&quot;&gt;OpenCode&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Yes (MIT)&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes, 15 built-in&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://ollama.com/&quot; rel=&quot;noopener&quot;&gt;Ollama&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Yes (MIT)&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://lmstudio.com/&quot; rel=&quot;noopener&quot;&gt;LM Studio&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Freemium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://claude.com/product/claude-code&quot; rel=&quot;noopener&quot;&gt;Claude Code&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;$20/mo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.openwebui.com/&quot; rel=&quot;noopener&quot;&gt;Open WebUI&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Yes (MIT)&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Via Python functions&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;http://github.com/features/copilot/plans&quot; rel=&quot;noopener&quot;&gt;VS Code (Copilot)&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Limited&lt;/td&gt;&lt;td&gt;$0-40/mo&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;opencode&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#opencode&quot; class=&quot;heading-anchor&quot;&gt;OpenCode&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is what I use most. It’s a terminal-based coding agent with 15 built-in tools — bash, file read/write/edit, grep, glob, web fetch, web search, task tracking, the works. It has MCP support (local, remote, OAuth), a skills system using &lt;code&gt;SKILL.md&lt;/code&gt; files, and connects to 75+ model providers or local models through Ollama/LM Studio.&lt;/p&gt;&lt;p&gt;This also has a desktop and web interface, but I prefer the terminal. It’s the most powerful and flexible coding agent I’ve found.&lt;/p&gt;&lt;p&gt;MIT licensed. No vendor lock-in.&lt;/p&gt;&lt;h2 id=&quot;ollama&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#ollama&quot; class=&quot;heading-anchor&quot;&gt;Ollama&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Ollama is not a harness. It’s a model runner. It downloads models, runs them locally with GPU acceleration, and exposes an OpenAI-compatible API. That’s it. No file operations, no code editing, no tools, no agent anything.&lt;/p&gt;&lt;p&gt;But it’s the engine underneath a lot of other tools. OpenCode uses it. Open WebUI uses it. Think of it as the foundation, not the car.&lt;/p&gt;&lt;h2 id=&quot;lm-studio&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#lm-studio&quot; class=&quot;heading-anchor&quot;&gt;LM Studio&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Similar to Ollama but with a nice desktop GUI and a killer feature: headless mode. You can deploy &lt;code&gt;llmster&lt;/code&gt; on a server and use it as a model inference backend without any GUI. It has TypeScript and Python SDKs and OpenAI-compatible APIs.&lt;/p&gt;&lt;p&gt;No built-in agent tools though. It’s for running models, not for coding with them.&lt;/p&gt;&lt;h2 id=&quot;claude-code&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#claude-code&quot; class=&quot;heading-anchor&quot;&gt;Claude Code&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Anthropic’s official coding agent. The most polished experience I’ve used. Terminal CLI, VS Code extension, JetBrains plugin, desktop app, web interface, even an iOS app. Full set of coding tools — bash, file operations, git integration, web search, multi-agent support.&lt;/p&gt;&lt;p&gt;Uses &lt;code&gt;CLAUDE.md&lt;/code&gt; files for skills and has auto-memory that persists across sessions.&lt;/p&gt;&lt;p&gt;The catch: $20/month, Claude models only, no local models, cloud required.&lt;/p&gt;&lt;h2 id=&quot;open-webui&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#open-webui&quot; class=&quot;heading-anchor&quot;&gt;Open WebUI&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A self-hosted web chat interface. Not really a coding agent — it’s a general purpose AI interface. Connects to Ollama, OpenAI, Anthropic, whatever. Has RAG, image generation, voice I/O. You can write Python functions that become tools, and the community shares them.&lt;/p&gt;&lt;p&gt;Good if you want a centralized AI chat hub for a team. Not built for coding workflows.&lt;/p&gt;&lt;h2 id=&quot;vs-code-with-copilot&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#vs-code-with-copilot&quot; class=&quot;heading-anchor&quot;&gt;VS Code with Copilot&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The IDE-native approach. Inline completions, chat, terminal integration, LSP integration (best in class). Has MCP support with sandboxing, which is unique — you can restrict filesystem and network access for MCP servers.&lt;/p&gt;&lt;p&gt;Less powerful than a dedicated agent but it’s right there in your editor. Skills via &lt;code&gt;.prompt.md&lt;/code&gt; files.&lt;/p&gt;&lt;h2 id=&quot;what-i-actually-use&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#what-i-actually-use&quot; class=&quot;heading-anchor&quot;&gt;What I actually use&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I OpenCode as my primary coding agent, and Open Web UI when I need to work from my phone or want the polished multi-surface experience.&lt;/p&gt;&lt;p&gt;Ollama is how I started and run if i need something local quick I stick to the command line. I moved to llamacpp for local models because it was faster to set up and has better performance on my hardware.&lt;/p&gt;&lt;p&gt;Most of these work together. That’s the point — pick the ones that fit how you work.&lt;/p&gt;&lt;h2 id=&quot;detailed-comparison&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#detailed-comparison&quot; class=&quot;heading-anchor&quot;&gt;Detailed comparison&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;If you want the full feature-by-feature breakdown, here it is.&lt;/p&gt;&lt;h3 id=&quot;interface-types&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#interface-types&quot; class=&quot;heading-anchor&quot;&gt;Interface types&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;OpenCode&lt;/th&gt;&lt;th&gt;Ollama&lt;/th&gt;&lt;th&gt;LM Studio&lt;/th&gt;&lt;th&gt;Claude Code&lt;/th&gt;&lt;th&gt;Open WebUI&lt;/th&gt;&lt;th&gt;VS Code&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Desktop App&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CLI / TUI&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅ (&lt;code&gt;lms&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;IDE Extension&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ VS Code&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅ VS Code, JetBrains&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅ Native&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Web Interface&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Terminal&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;⚠️ Integrated&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;core-capabilities&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#core-capabilities&quot; class=&quot;heading-anchor&quot;&gt;Core capabilities&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;OpenCode&lt;/th&gt;&lt;th&gt;Ollama&lt;/th&gt;&lt;th&gt;LM Studio&lt;/th&gt;&lt;th&gt;Claude Code&lt;/th&gt;&lt;th&gt;Open WebUI&lt;/th&gt;&lt;th&gt;VS Code&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tools Support&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ Native&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;⚠️ Via MCP&lt;/td&gt;&lt;td&gt;✅ Native&lt;/td&gt;&lt;td&gt;✅ Python Functions&lt;/td&gt;&lt;td&gt;✅ Native&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Skills Support&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ (&lt;code&gt;SKILL.md&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅ (&lt;code&gt;CLAUDE.md&lt;/code&gt;)&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅ (Prompt Files)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;MCP Servers&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ Local + Remote + OAuth&lt;/td&gt;&lt;td&gt;⚠️ API only&lt;/td&gt;&lt;td&gt;✅ Via API&lt;/td&gt;&lt;td&gt;✅ Full support&lt;/td&gt;&lt;td&gt;✅ Supported&lt;/td&gt;&lt;td&gt;✅ With sandboxing&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;LSP Integration&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ Experimental&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅ Native&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Git Integration&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;⚠️ Via bash&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅ Native&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅ Native&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;built-in-tools&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#built-in-tools&quot; class=&quot;heading-anchor&quot;&gt;Built-in tools&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;OpenCode&lt;/th&gt;&lt;th&gt;Ollama&lt;/th&gt;&lt;th&gt;LM Studio&lt;/th&gt;&lt;th&gt;Claude Code&lt;/th&gt;&lt;th&gt;Open WebUI&lt;/th&gt;&lt;th&gt;VS Code&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Shell execution&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;⚠️ Via functions&lt;/td&gt;&lt;td&gt;⚠️ Via extensions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;File read&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;⚠️ Via context&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;File edit/write&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Grep search&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Glob file finding&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Web search&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ (Exa AI)&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;⚠️ Via tools&lt;/td&gt;&lt;td&gt;⚠️ Via extensions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Web fetch&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;⚠️ Via tools&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Task tracking&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Multi-agent&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;model-support&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-ai-harnesses-opencode-ollama-lm-studio-claude-code-open-webui-and-vs-code/#model-support&quot; class=&quot;heading-anchor&quot;&gt;Model support&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;OpenCode&lt;/th&gt;&lt;th&gt;Ollama&lt;/th&gt;&lt;th&gt;LM Studio&lt;/th&gt;&lt;th&gt;Claude Code&lt;/th&gt;&lt;th&gt;Open WebUI&lt;/th&gt;&lt;th&gt;VS Code&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Local Models&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ Via Ollama/LM Studio&lt;/td&gt;&lt;td&gt;✅ Native&lt;/td&gt;&lt;td&gt;✅ Native&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅ Via Ollama&lt;/td&gt;&lt;td&gt;⚠️ Limited&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Cloud APIs&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅ 75+ providers&lt;/td&gt;&lt;td&gt;⚠️ Via proxy&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅ Claude only&lt;/td&gt;&lt;td&gt;✅ Multiple&lt;/td&gt;&lt;td&gt;✅ GitHub/OpenAI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Bring Your Own Key&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;⚠️ Limited&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Model Management&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;⚠️ Via integration&lt;/td&gt;&lt;td&gt;✅ Excellent&lt;/td&gt;&lt;td&gt;✅ Excellent&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;⚠️ Via Ollama&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Just use a VPS bro</title>
      <link href="https://jace.pro/blog/just-use-a-vps-bro/" />
      <updated>2026-03-20T00:00:00Z</updated>
      <id>https://jace.pro/blog/just-use-a-vps-bro/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=40SnEd1RWUU&amp;amp;t=5s&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=40SnEd1RWUU&amp;amp;t=5s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I wanted to take a few minutes and detail out the steps Kai made making his video as they apply to … .probably many things I’ve set up.&lt;/p&gt;&lt;p&gt;Let’s get into it.&lt;/p&gt;&lt;p&gt;Continue.&lt;/p&gt;&lt;p&gt;“”&quot;&lt;br&gt;kai: I want to install Open Claw and set up my personal AI assistant.&lt;br&gt;ai: Just use a VPS. It’s like a oneclick install.&lt;br&gt;kai: Oh, I was just going to buy a Mac Mini.&lt;br&gt;ai: No, you need to use a fresh Linux VPS.&lt;br&gt;ai: It’s like what everybody does.&lt;br&gt;kai: Continue.&lt;br&gt;ai: Okay, that was easy. Uh, let’s start by splinning up a server on your cloud VPS provider.&lt;br&gt;ai: You know, just a one vCPU, 4 GB RAM, 100GB drive.&lt;br&gt;ai: Then you’ll get a public IP and root SSH access.&lt;br&gt;ai: Then immediately we’re under attack.&lt;br&gt;kai: I haven’t even logged in yet.&lt;br&gt;ai: Yeah, SSH scam started 12 ago.&lt;br&gt;ai: Now it’s a fight against time. Do not install anything before securing your VPS root SSH access.&lt;br&gt;ai: So first we make sure we have the latest state of the internet on our VPS with apata update and apata upgrade.&lt;br&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; apt upgrade -y&lt;/code&gt;&lt;br&gt;kai: Why?&lt;br&gt;ai: Our job is to keep our core running while other packages are changing theirs.&lt;br&gt;kai: Why?&lt;br&gt;ai: Then we’ll install essential security and networking tools.&lt;br&gt;ai: Apat curl apat wget ufw failtoban ca certificates gnoop g.&lt;br&gt;&lt;code&gt;sudo apt install -y curl wget ufw fail2ban ca-certificates gnupg&lt;/code&gt;&lt;br&gt;kai: Why weren’t these installed by default?&lt;br&gt;ai: Well, that’s because Linux was designed to be composable, transparent, minimal, scalable, and reusable in millions of environments.&lt;br&gt;kai: And it was not designed to be secure.&lt;br&gt;ai: Think about it. Secure for what?&lt;br&gt;kai: Well, for a server. (ai didn’t hear)&lt;br&gt;ai: See, you can’t answer that question.&lt;br&gt;kai: For a server! (ai didn’t hear)&lt;br&gt;ai: Second, we create a non-root users with a strong password. Then we delete password access and create an SSH key instead.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; adduser claw
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;usermod&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-aG&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; claw&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ai: Then we delete password access and create an SSH key instead.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# on your local machine &lt;/span&gt;
ssh-keygen &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; ed25519
&lt;span class=&quot;token comment&quot;&gt;# copy your key to the server &lt;/span&gt;
ssh-copy-id claw@SERVER_IP &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;kai: I cannot use the password I use everywhere.&lt;br&gt;ai: No, we need to harden the SSH tunnel!&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;# /etc/ssh/sshd_config 
Port 2222
Protocol 2
PermitRootLogin no
PasswordAuthentication no
PubKeyAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding no
AllowUsers claw
MaxAuthTries 3
LoginGraceTime 30&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ai: Now, verify the SSH config before logging yourself out.&lt;br&gt;&lt;code&gt;sudo ssh -t &amp;amp;&amp;amp; sudo systemctl reload ssh&lt;/code&gt;&lt;br&gt;Restart with the new config.&lt;br&gt;&lt;code&gt;sudo systemctl restart ssh&lt;/code&gt;&lt;br&gt;The log out log in with your SSH key again.&lt;br&gt;&lt;code&gt;ssh -p 2222 claw@SERVER_IP&lt;/code&gt;&lt;br&gt;ai: You didn’t save your SSH key.&lt;br&gt;kai: I was supposed to be paying attention.&lt;br&gt;ai: We start from scratch. (erases board)&lt;br&gt;ai: Next firewall.&lt;br&gt;ai: This is an elimination diet. We block everything and then slowly reintroduce what we really need.&lt;br&gt;kai: And what do I need?&lt;br&gt;ai: Well, that depends.&lt;br&gt;kai: Let’s check what the tutorial says.&lt;br&gt;ai: The tutorial won’t mention it cuz I wrote that tutorial.&lt;br&gt;ai: We block all unsolicited traffic from the &lt;strong&gt;worldwide hostile web app&lt;/strong&gt;, but we leave one door open.&lt;br&gt;&lt;code&gt;sudo ufw allow 2222/tcp&lt;/code&gt;&lt;br&gt;ai: Port 2222.&lt;br&gt;ai: Then we activate the firewall.&lt;br&gt;kai: Why 4 twos?&lt;br&gt;ai: Oh, it’s just an arbitrary number. You could choose any.&lt;br&gt;kai: Six Seven.&lt;br&gt;ai: No! The standard for arbitrary numbers is 2222.&lt;br&gt;ai: Then we autoban IPs that guess passwords.&lt;br&gt;&lt;code&gt;sudo systemctl enable --now fail2ban&lt;/code&gt;&lt;br&gt;kai: I thought we don’t use passwords.&lt;br&gt;ai: Well, that’s today. But what about tomorrow?&lt;br&gt;ai: Then we configure the SSH jail for our port.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# /etc/fail2ban/jail.local &lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sshd&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; 
port &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2222&lt;/span&gt; 
maxretry &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; 
bantime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; 1h 
findtime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; 10m&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ai: Restart it, verify press &lt;code&gt;ls -la&lt;/code&gt; a 100 times.&lt;br&gt;sudo systemctl restart fail2ban`&lt;br&gt;kai: And now I will not get hacked.&lt;br&gt;ai: No, I’m attacking it right now because it didn’t enable automatic security updates and ensured the security origin is set.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; unattended-upgrades
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dpkg-reconfigure unattended-upgrades&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ai: And ensured the security origin is set.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# /etc/apt/apt.conf.d/50unattended-upgrades &lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${distro_id}&lt;/span&gt;:&lt;span class=&quot;token variable&quot;&gt;${distro_codename}&lt;/span&gt;-security&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ai: Now, congrats. Your server can reboot itself at 3:00 a.m.&lt;br&gt;ai: Now, let’s do some basic OS sanity.&lt;br&gt;ai: How what kind of working environment would this be without a properly set time and date?&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; timedatectl set-timezone UTC
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--now&lt;/span&gt; systemd-timesyncd&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ai: Now let’s control entropy. And now we get to the most interesting part.&lt;br&gt;kai: Install open clock.&lt;br&gt;ai: Installing a private VPN mesh.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://tailscale.com/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt; 
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; tailscale up &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;kai: NordVPN.&lt;br&gt;ai: Tailscale.&lt;br&gt;ai: Verify if the wormhole actually opens.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; tailscale status&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now we allow SSH only support 2222 but package to our private VPN mesh.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; ufw delete &lt;span class=&quot;token number&quot;&gt;2222&lt;/span&gt;/tcp&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Public SSH is now gone.&lt;br&gt;All public inbound traffic is now gone&lt;br&gt;Except future IP56 noise.&lt;br&gt;So we disable I56 UFW and apply kernel settings.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/IPV6=yes/IPV6=no/&#39;&lt;/span&gt; /etc/default/ufw 
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;net.ipv6.conf.all.disable_ipv6 = 1&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-a&lt;/span&gt; /etc/sysctl.conf 
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sysctl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; 
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; ufw reload &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3:57 No, just so we can sleep better. Reload. Verify.&lt;br&gt;4:02 So now we’re already there to install the user package.&lt;br&gt;kai: This wasn’t even the installation.&lt;br&gt;ai: But for this first we need to install it dependency NodeJS.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://deb.nodesource.com/setup_20.x &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-E&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt; -
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; nodejs 
&lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; 
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We never trust Node version distros.&lt;br&gt;Install NodeJS from the official repo. Only then we install the user package directly from GitHub.&lt;br&gt;But this of course doesn’t work because we didn’t install Git.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now verify the repo isn’t compromised by trusting GitHub and 900 random npm dependencies.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# MIGHT CHANGE WITH NEW APPLICATION &lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://get.pnpm.io/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt; - 
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/openclaw/openclaw.git 
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; openclaw 

&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; 
&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; ui:build &lt;span class=&quot;token comment&quot;&gt;# auto-installs ui deps on first run &lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; build 

&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; openclaw onboard --install-daemon 

&lt;span class=&quot;token comment&quot;&gt;# dev loop (auto-reload on ts changes)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;pnpm&lt;/span&gt; gateway:watch &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ai: Meanwhile, we create a credentials directory because we don’t dump production apps into home like crazy people.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; /opt/openclaw
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; claw:claw /opt/openclaw

&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/openclaw.env 
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; root:claw /etc/openclaw.env 
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;640&lt;/span&gt; /etc/openclaw.env &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ai: Then we fix the directories permissions.&lt;br&gt;kai: Why are they broken?&lt;br&gt;ai: Broken is the def facto standard.&lt;br&gt;ai: Now start, restart and verify the user package.&lt;br&gt;kai: With status.&lt;br&gt;ai: No, with &lt;code&gt;doctor&lt;/code&gt;.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw doctor &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ai: And now!&lt;br&gt;kai: we are done.&lt;br&gt;ai: We configure the systemd service so if it breaks it doesn’t crash. You know, system D is a&lt;br&gt;5:03 controversial idea that hasn’t been recognized widely in the Linux community because initially it start as an init system. Then it become a schedule, a&lt;br&gt;5:10 debugger, a login manager, a device manager, a process manager. So if it crashes, basically everything crashes.&lt;br&gt;5:17 But since 2015, basically every major Linux distribution has decided for this argument in 2015 and uh we lost. But there are still people who use our&lt;br&gt;5:26 units, you know, OP Marcy or S6, but you know, we don’t talk to these people. But for now, system B is an optimal but you&lt;br&gt;5:33 know nonoptimal solution. Do you have anything to say?&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# /etc/systemd/system/openclaw.service &lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Unit&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;OpenClaw Bot 
&lt;span class=&quot;token assign-left variable&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;network.target 

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Service&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;Type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;simple 
&lt;span class=&quot;token assign-left variable&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;claw 
&lt;span class=&quot;token assign-left variable&quot;&gt;Group&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;claw 
&lt;span class=&quot;token assign-left variable&quot;&gt;EnvironmentFile&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/etc/openclaw.env 
&lt;span class=&quot;token assign-left variable&quot;&gt;WorkingDirectory&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/opt/openclaw 
&lt;span class=&quot;token assign-left variable&quot;&gt;ExecStart&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr/bin/node index.js 
&lt;span class=&quot;token assign-left variable&quot;&gt;Restart&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;on-failure
&lt;span class=&quot;token assign-left variable&quot;&gt;RestartSec&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; 
&lt;span class=&quot;token assign-left variable&quot;&gt;NoNewPriviledges&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true 
&lt;span class=&quot;token assign-left variable&quot;&gt;PrivateTmp&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true 
&lt;span class=&quot;token assign-left variable&quot;&gt;ProtectSystem&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;full 
&lt;span class=&quot;token assign-left variable&quot;&gt;ProtectHome&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true 
&lt;span class=&quot;token assign-left variable&quot;&gt;LimitNOFILE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; 

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Install&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;WantedBy&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;multi-user.target &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;kai: Okay.&lt;br&gt;ai: So we create this small unit file. Activate and reactivate the service.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl daemon-reexec
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl daemon-reload
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; openclaw 
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl start openclaw 
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl status openclaw &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ai: Now make sure we’re logging everything to observe runtime behavior. Disk protection. Backups.&lt;br&gt;kai: Backups. And then run your application security audit if it has one.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;openclaw security audit &lt;span class=&quot;token parameter variable&quot;&gt;--deep&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ai: I love it.&lt;br&gt;kai: I thought we did security already.&lt;br&gt;ai: No, no, you don’t do security. Security needs to live rent free in your mind at all times. And now you have the setup with no public SSH, no public web ports, and server only reachable via tail scale. 98.1% uptime if you ignore the weekly kernel panics.&lt;br&gt;kai: And this was simple.&lt;br&gt;ai: Yes, this was the Ubuntu version. Now I can show you how you would do this on Arch by the way. No, no, no. Thank you.&lt;br&gt;ai: But now we’re ready. Well, now you’d start configuring the application security measures so it doesn’t start deleting your Gmail, leak your Ethereum wallet, and start joining online calls if somebody messages bendable and commands to your Telegram bot.&lt;br&gt;kai: What VPS are you running it on?&lt;br&gt;ai: Oh, I’m just running it on an isolated bank Mini. What? Oh, I didn’t say you should follow as I do.&lt;br&gt;kai: Claude, give me a new agent. I don’t like this agent. Give me a new agent.&lt;br&gt;ai: We didn’t even get to talk about how to install gentle from source yet.&lt;br&gt;kai: A lying agent. Please install open claw simply so I can make automated fully market bets. Make no mistakes.&lt;br&gt;ai: Ah, this is no problem with AWS EC2 instance. But first, we need to make sure to properly set up security groups and network access control list. Have you heard about Kubernetes?&lt;br&gt;ai: No, no problem. I will teach you.&lt;br&gt;kai: This video was sponsored by every service that is trying to make you run OpenClaw on their servers. They are the world’s leading provider for that.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>CLIs are for AIs and here is my list</title>
      <link href="https://jace.pro/blog/clis-are-for-ais-and-here-is-my-list/" />
      <updated>2026-03-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/clis-are-for-ais-and-here-is-my-list/</id>
      <content type="html">
				&lt;p&gt;I’m noticing that there’s a bunch of CLI’s being created recently to interface with common tools that we all use. And I wanted to make a short list of them so I didn’t have to keep googling for them occasionally. In case anyone else finds this useful, below is that list.&lt;/p&gt;&lt;h1 id=&quot;clis&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/clis-are-for-ais-and-here-is-my-list/#clis&quot; class=&quot;heading-anchor&quot;&gt;CLIs&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;official-clis-by-vendor&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/clis-are-for-ais-and-here-is-my-list/#official-clis-by-vendor&quot; class=&quot;heading-anchor&quot;&gt;Official CLIs by vendor&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/basecamp/basecamp-cli&quot; rel=&quot;noopener&quot;&gt;Basecamp CLI&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/googleworkspace/cli&quot; rel=&quot;noopener&quot;&gt;Google CLI&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/ServiceNow/sdk&quot; rel=&quot;noopener&quot;&gt;Fluent SDK (ServiceNow)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://bitwarden.com/help/cli/&quot; rel=&quot;noopener&quot;&gt;Bitwarden CLI&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;clis-made-by-others-or-tools&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/clis-are-for-ais-and-here-is-my-list/#clis-made-by-others-or-tools&quot; class=&quot;heading-anchor&quot;&gt;CLIs made by others or tools&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/pchuri/confluence-cli&quot; rel=&quot;noopener&quot;&gt;Confluence CLI&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/jacebenson/jsn&quot; rel=&quot;noopener&quot;&gt;Jace’s SNCLI&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/yt-dlp/yt-dlp&quot; rel=&quot;noopener&quot;&gt;YTDLP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://w3m.sourceforge.net/&quot; rel=&quot;noopener&quot;&gt;w3m&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/mxrch/GHunt&quot; rel=&quot;noopener&quot;&gt;Ghunt&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 id=&quot;meta-clis&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/clis-are-for-ais-and-here-is-my-list/#meta-clis&quot; class=&quot;heading-anchor&quot;&gt;Meta CLIs&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/charmbracelet/bubbletea&quot; rel=&quot;noopener&quot;&gt;Bubbletea&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>K24 and K25: A late review of the schedule I had</title>
      <link href="https://jace.pro/blog/k24-and-k25-a-late-review-of-the-schedule-i-had/" />
      <updated>2026-02-24T00:00:00Z</updated>
      <id>https://jace.pro/blog/k24-and-k25-a-late-review-of-the-schedule-i-had/</id>
      <content type="html">
				&lt;p&gt;I think it’s fun some times to reminisce about things I’ve done and wonder about things others have.&lt;/p&gt;&lt;p&gt;I was setting up a new bookings page and noticed I still had the schedule for K24 and K25.&lt;/p&gt;&lt;h1 id=&quot;k24&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/k24-and-k25-a-late-review-of-the-schedule-i-had/#k24&quot; class=&quot;heading-anchor&quot;&gt;K24&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Day 1&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Attendee Breakfast&lt;/li&gt;&lt;li&gt;Put AI to work for people&lt;/li&gt;&lt;li&gt;Provide just-in-time training to users with Guided Tours&lt;/li&gt;&lt;li&gt;Amplify asset governance with ServiceNow SAM and HAM&lt;/li&gt;&lt;li&gt;Attendee Lunch&lt;/li&gt;&lt;li&gt;Welcoming wizards: The magical pigwarts onboarding experience&lt;/li&gt;&lt;li&gt;Knowledge Welcome Reception&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Day 2&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Attendee Breakfast&lt;/li&gt;&lt;li&gt;Unleashing the power of generative AI with the ServiceNow platform&lt;/li&gt;&lt;li&gt;Behind the Build: A Conversation with The Devvies App of the Year 2023 Winners&lt;/li&gt;&lt;li&gt;ServiceNow for the Culture Meetup: Celebrating the Black Community&lt;/li&gt;&lt;li&gt;How FedEx relies on ServiceNow for managing Operational Technology Assets&lt;/li&gt;&lt;li&gt;Attendee Lunch&lt;/li&gt;&lt;li&gt;Product Roadmap: Whats new in Asset Management (ITAM and EAM)&lt;/li&gt;&lt;li&gt;Common Service Data Model&lt;/li&gt;&lt;li&gt;The secrets of great portal user experiences&lt;/li&gt;&lt;li&gt;Hyatt’s CSM journey: From fully customized to an out-of-the-box solution&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Day 3&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Accelerating Innovation with Creativity &amp;amp; Connection&lt;/li&gt;&lt;li&gt;SN Utils unveiled: 90 minutes to master the essentials and beyond&lt;/li&gt;&lt;li&gt;CreatorCon Keynote&lt;/li&gt;&lt;li&gt;Women In Tech: Identifying and mitigating burnout&lt;/li&gt;&lt;li&gt;Knowledge closing celebration&lt;/li&gt;&lt;/ol&gt;&lt;h1 id=&quot;k25&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/k24-and-k25-a-late-review-of-the-schedule-i-had/#k25&quot; class=&quot;heading-anchor&quot;&gt;K25&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Day 1&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Hidden tricks : Youll never need to create a ServiceNow case for these issues!&lt;/li&gt;&lt;li&gt;Put AI to work for people - now&lt;/li&gt;&lt;li&gt;UX: Crafting Innovation: A Hands-On Workshop for Designing Mobile Experiences&lt;/li&gt;&lt;li&gt;Scopes? Where we are going we don’t need scope (pickers)!&lt;/li&gt;&lt;li&gt;ServiceNow MVP panel: Ask us anything!&lt;/li&gt;&lt;li&gt;Knowledge welcome reception&lt;/li&gt;&lt;li&gt;FSM and beyond to orchestrate fiber to the home&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Day 2&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Are you smarter than a Jr. developer?&lt;/li&gt;&lt;li&gt;Day 2 Keynote: Uniting AI, data, and workflows across every corner of your business&lt;/li&gt;&lt;li&gt;3 levels of integration design: seamless retrieval of leave balance&lt;/li&gt;&lt;li&gt;Industry Keynote: Technology, Media, and Telecom&lt;/li&gt;&lt;li&gt;How CDW reimagined eBonding integrations for exceptional customer experiences&lt;/li&gt;&lt;li&gt;Ask the Experts: Safeguarding Sensitive Data with Core Security Features&lt;/li&gt;&lt;li&gt;Elevating the telecom excellence with next generation solutions, OneNZ Journey&lt;/li&gt;&lt;li&gt;Work Perfect Day&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Day 3&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Knowledge Unscripted Keynote&lt;/li&gt;&lt;li&gt;Less frustration, more innovation: ServiceNow Studios power in action&lt;/li&gt;&lt;li&gt;Dev tools are better together, ServiceNow Studio and Now Assist for Creator&lt;/li&gt;&lt;li&gt;[“Delivery team roles and responsibilities”, &quot; Who is in charge of what? &quot;]&lt;/li&gt;&lt;li&gt;CreatorCon Keynote&lt;/li&gt;&lt;li&gt;Knowledge After Party&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Turn an Old Chromebook into a Coolify Server with Lubuntu</title>
      <link href="https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/" />
      <updated>2026-02-22T00:00:00Z</updated>
      <id>https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/</id>
      <content type="html">
				&lt;p&gt;I had an old Acer Chromebook CB3-431 sitting around - 4GB RAM, 32GB eMMC storage. Not much, but enough to run a lightweight server. Here’s how I turned it into a Coolify-managed server.&lt;/p&gt;&lt;h2 id=&quot;the-hardware&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#the-hardware&quot; class=&quot;heading-anchor&quot;&gt;The Hardware&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Acer Chromebook CB3-431 (Intel Braswell, board name: EDGAR)&lt;/li&gt;&lt;li&gt;4GB RAM&lt;/li&gt;&lt;li&gt;32GB internal storage&lt;/li&gt;&lt;li&gt;No ethernet port (WiFi only)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;why-lubuntu&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#why-lubuntu&quot; class=&quot;heading-anchor&quot;&gt;Why Lubuntu?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I initially tried Ubuntu Server and a few other distros, but ran into a frustrating problem: &lt;strong&gt;no WiFi support during installation&lt;/strong&gt;. The CB3-431 has no ethernet port, and my USB ethernet adapter wasn’t detected. Most server distros assume you have wired networking.&lt;/p&gt;&lt;p&gt;I also tried antiX, but configuring WiFi manually was painful. Lubuntu worked because it has a full desktop with NetworkManager - just click the WiFi icon and connect. Once installed, you can run it headless as a server.&lt;/p&gt;&lt;h2 id=&quot;step-1-remove-the-write-protect-screw&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#step-1-remove-the-write-protect-screw&quot; class=&quot;heading-anchor&quot;&gt;Step 1: Remove the Write Protect Screw&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Unlike most laptops, Chromebooks have firmware write protection that prevents you from installing alternative operating systems. To flash custom firmware, you need to disable this protection first.&lt;/p&gt;&lt;p&gt;For the CB3-431 (EDGAR), this means removing a physical screw inside the laptop:&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/nj8sdcS__O-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/nj8sdcS__O-650.jpeg&quot; alt=&quot;Write protect screw location for EDGAR&quot; width=&quot;650&quot; height=&quot;487&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Power off the Chromebook and disconnect the charger&lt;/li&gt;&lt;li&gt;Remove the bottom cover screws&lt;/li&gt;&lt;li&gt;Locate and remove the write protect screw (see image above)&lt;/li&gt;&lt;li&gt;Reassemble the device&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The screw doesn’t need to go back in - you can toss it.&lt;/p&gt;&lt;p&gt;For other Chromebook models, check the &lt;a href=&quot;https://docs.mrchromebox.tech/docs/supported-devices.html&quot; rel=&quot;noopener&quot;&gt;MrChromebox Supported Devices&lt;/a&gt; page to find your device’s write protect method.&lt;/p&gt;&lt;h2 id=&quot;step-2-enable-developer-mode&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#step-2-enable-developer-mode&quot; class=&quot;heading-anchor&quot;&gt;Step 2: Enable Developer Mode&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Turn off the Chromebook&lt;/li&gt;&lt;li&gt;Hold &lt;code&gt;Esc + Refresh + Power&lt;/code&gt; to enter Recovery Mode&lt;/li&gt;&lt;li&gt;Press &lt;code&gt;Ctrl + D&lt;/code&gt; when prompted&lt;/li&gt;&lt;li&gt;Follow the prompts to enable Developer Mode&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This wipes the device, so back up anything important first.&lt;/p&gt;&lt;h2 id=&quot;step-3-flash-uefi-firmware&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#step-3-flash-uefi-firmware&quot; class=&quot;heading-anchor&quot;&gt;Step 3: Flash UEFI Firmware&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Since this device is older (marked as EOL), dual-booting ChromeOS and Linux isn’t an option - you have to fully replace the OS. That’s fine for a server anyway.&lt;/p&gt;&lt;p&gt;Boot into ChromeOS, then open a terminal with &lt;code&gt;Ctrl + Alt + F2&lt;/code&gt; and login as &lt;code&gt;chronos&lt;/code&gt;. Run the MrChromebox firmware utility:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-LOf&lt;/span&gt; https://mrchromebox.tech/firmware-util.sh &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt; firmware-util.sh&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Select option 2: &lt;strong&gt;“Install/Update UEFI (Full ROM) Firmware”&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; When prompted, create a backup of your stock firmware and save it somewhere safe. You’ll need this if you ever want to restore ChromeOS.&lt;/p&gt;&lt;p&gt;After flashing, power off the device completely.&lt;/p&gt;&lt;p&gt;For full details, see the &lt;a href=&quot;https://docs.mrchromebox.tech/docs/getting-started.html&quot; rel=&quot;noopener&quot;&gt;MrChromebox Getting Started guide&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;step-4-create-a-bootable-usb&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#step-4-create-a-bootable-usb&quot; class=&quot;heading-anchor&quot;&gt;Step 4: Create a Bootable USB&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;On another Linux machine, download Lubuntu and create a bootable USB:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;dd&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=~&lt;/span&gt;/Downloads/lubuntu-25.10-desktop-amd64.iso &lt;span class=&quot;token assign-left variable&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/dev/sdX &lt;span class=&quot;token assign-left variable&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;4M &lt;span class=&quot;token assign-left variable&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;progress &lt;span class=&quot;token assign-left variable&quot;&gt;oflag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;sync&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Replace &lt;code&gt;/dev/sdX&lt;/code&gt; with your USB device. Use &lt;code&gt;lsblk&lt;/code&gt; to find the right one - look for the device matching your USB drive’s size.&lt;/p&gt;&lt;h2 id=&quot;step-5-install-lubuntu&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#step-5-install-lubuntu&quot; class=&quot;heading-anchor&quot;&gt;Step 5: Install Lubuntu&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Insert the USB into the Chromebook&lt;/li&gt;&lt;li&gt;Power on - it should boot directly from USB with the new UEFI firmware&lt;/li&gt;&lt;li&gt;Connect to WiFi using the desktop network manager&lt;/li&gt;&lt;li&gt;Run the installer&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If you see “Erase disk and install Lubuntu” - use that, it’s the easiest. If forced to manual partition and you see old ChromeOS partitions, wipe the disk first:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parted&lt;/span&gt; /dev/mmcblk0 mklabel gpt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then close and reopen the installer - the “Erase disk” option should appear.&lt;/p&gt;&lt;p&gt;For the swap option, I chose “no swap” to save space on the 32GB drive.&lt;/p&gt;&lt;h2 id=&quot;step-6-set-up-ssh-access&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#step-6-set-up-ssh-access&quot; class=&quot;heading-anchor&quot;&gt;Step 6: Set Up SSH Access&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Once Lubuntu is installed, set up SSH so you can manage it remotely:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; openssh-server
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl start &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Set a memorable hostname:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; hostnamectl set-hostname cb3-431&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;From your main machine, copy your SSH key:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh-copy-id jace@192.168.1.136&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now you can SSH in with &lt;code&gt;ssh jace@cb3-431.local&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&quot;step-7-install-tailscale&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#step-7-install-tailscale&quot; class=&quot;heading-anchor&quot;&gt;Step 7: Install Tailscale&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Since my Coolify server is on a different network, I needed Tailscale to connect them:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://tailscale.com/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; tailscale up&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Follow the authentication URL to link it to your Tailscale account. Note the Tailscale IP (something like &lt;code&gt;100.x.x.x&lt;/code&gt;).&lt;/p&gt;&lt;h2 id=&quot;step-8-connect-to-coolify&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#step-8-connect-to-coolify&quot; class=&quot;heading-anchor&quot;&gt;Step 8: Connect to Coolify&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In Coolify, add a new server:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Go to &lt;strong&gt;Servers&lt;/strong&gt; → &lt;strong&gt;Add Server&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Enter the Tailscale IP as the hostname&lt;/li&gt;&lt;li&gt;Set the SSH user (e.g., &lt;code&gt;jace&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;For the SSH key, click &lt;strong&gt;Add a new SSH Key&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;When you create a new key in Coolify, it will display the public key. Copy that, then add it to your laptop:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; jace@cb3-431.local &lt;span class=&quot;token string&quot;&gt;&quot;echo &#39;PASTE_PUBLIC_KEY_HERE&#39; &amp;gt;&amp;gt; ~/.ssh/authorized_keys&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Select the new key for your server and continue.&lt;/p&gt;&lt;h2 id=&quot;step-9-enable-passwordless-sudo&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#step-9-enable-passwordless-sudo&quot; class=&quot;heading-anchor&quot;&gt;Step 9: Enable Passwordless Sudo&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Coolify needs to run commands with sudo. On the Chromebook:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;echo &quot;jace ALL=(ALL) NOPASSWD:ALL&quot; &amp;gt; /etc/sudoers.d/jace&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now click “Validate” in Coolify - it should connect successfully.&lt;/p&gt;&lt;h2 id=&quot;step-10-disable-sleep-on-lid-close&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#step-10-disable-sleep-on-lid-close&quot; class=&quot;heading-anchor&quot;&gt;Step 10: Disable Sleep on Lid Close&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;By default, Lubuntu suspends when you close the laptop lid. For a server, you want it to keep running:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Disable suspend on lid close&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/#HandleLidSwitch=suspend/HandleLidSwitch=ignore/&#39;&lt;/span&gt; /etc/systemd/logind.conf
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/#HandleLidSwitchExternalPower=suspend/HandleLidSwitchExternalPower=ignore/&#39;&lt;/span&gt; /etc/systemd/logind.conf

&lt;span class=&quot;token comment&quot;&gt;# Restart to apply&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl restart systemd-logind&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can also disable sleep entirely:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now you can close the lid and tuck it away on a shelf.&lt;/p&gt;&lt;h2 id=&quot;troubleshooting&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#troubleshooting&quot; class=&quot;heading-anchor&quot;&gt;Troubleshooting&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;server-is-not-reachable&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#server-is-not-reachable&quot; class=&quot;heading-anchor&quot;&gt;“Server is not reachable”&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Check Tailscale is running on both machines: &lt;code&gt;tailscale status&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Verify you can ping from Coolify’s server: &lt;code&gt;ping 100.x.x.x&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Make sure SSH is running: &lt;code&gt;systemctl status ssh&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;authentication-failed-/-sudo-errors&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#authentication-failed-/-sudo-errors&quot; class=&quot;heading-anchor&quot;&gt;“Authentication failed” / sudo errors&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The SSH key might not match - verify the public key is in &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Enable passwordless sudo (Step 9)&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;wifi-not-working-during-install&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#wifi-not-working-during-install&quot; class=&quot;heading-anchor&quot;&gt;WiFi not working during install&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is why I chose Lubuntu over Ubuntu Server. If you’re stuck without network:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Try USB tethering from your phone - plug it in and enable “USB Tethering” in your phone’s settings&lt;/li&gt;&lt;li&gt;Most desktop distros will detect phone tethering automatically&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;what-can-you-run&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#what-can-you-run&quot; class=&quot;heading-anchor&quot;&gt;What Can You Run?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;With 4GB RAM and 32GB storage, this little server can handle:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Small Docker containers&lt;/li&gt;&lt;li&gt;Static site hosting&lt;/li&gt;&lt;li&gt;Git runners&lt;/li&gt;&lt;li&gt;Home automation (Home Assistant)&lt;/li&gt;&lt;li&gt;Lightweight databases&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It’s not going to run Kubernetes, but for simple services it works great.&lt;/p&gt;&lt;h2 id=&quot;resources&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#resources&quot; class=&quot;heading-anchor&quot;&gt;Resources&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://mrchromebox.tech/&quot; rel=&quot;noopener&quot;&gt;MrChromebox Firmware Utility&lt;/a&gt; - Essential for flashing custom firmware&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.mrchromebox.tech/docs/getting-started.html&quot; rel=&quot;noopener&quot;&gt;MrChromebox Getting Started&lt;/a&gt; - Full documentation&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.mrchromebox.tech/docs/supported-devices.html&quot; rel=&quot;noopener&quot;&gt;Supported Devices&lt;/a&gt; - Find your Chromebook’s board name and WP method&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.chrultrabook.com/&quot; rel=&quot;noopener&quot;&gt;Chrultrabook Docs&lt;/a&gt; - OS compatibility and drivers&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;final-thoughts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/turn-an-old-chromebook-into-a-coolify-server-with-lubuntu/#final-thoughts&quot; class=&quot;heading-anchor&quot;&gt;Final Thoughts&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Old Chromebooks make surprisingly decent servers. The CB3-431 is fanless, low power, and now sits quietly on a shelf running containers. With Tailscale connecting it to Coolify, I can deploy and manage apps from anywhere.&lt;/p&gt;&lt;p&gt;The trickiest part was getting past the firmware restrictions and finding a distro with working WiFi. Once you flash UEFI firmware and pick a desktop distro like Lubuntu, the rest is straightforward Linux server setup.&lt;/p&gt;&lt;p&gt;If you’ve got an old Chromebook gathering dust, give it a second life as a homelab server.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Supporting Netlify _redirects on Coolify er nginx</title>
      <link href="https://jace.pro/blog/supporting-netlify-_redirects-on-coolify-er-nginx/" />
      <updated>2026-02-19T00:00:00Z</updated>
      <id>https://jace.pro/blog/supporting-netlify-_redirects-on-coolify-er-nginx/</id>
      <content type="html">
				&lt;p&gt;Using Netlify-style _redirects with Coolify&lt;/p&gt;&lt;p&gt;I’ve been hosting this site on Coolify for a while now, and it’s been great. But one thing I missed from my Netlify days was the simple &lt;code&gt;_redirects&lt;/code&gt; file. You know, the one where you just write:&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;/old-path /new-path 301&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And it just works.&lt;/p&gt;&lt;p&gt;Recently, I needed to change a URL on my site - &lt;code&gt;/submit-session&lt;/code&gt; to &lt;code&gt;/speak&lt;/code&gt;. On Netlify, this would be a one-line change in a &lt;code&gt;_redirects&lt;/code&gt; file. But on Coolify, which uses nginx under the hood, I had to figure something out.&lt;/p&gt;&lt;h2 id=&quot;the-problem&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/supporting-netlify-_redirects-on-coolify-er-nginx/#the-problem&quot; class=&quot;heading-anchor&quot;&gt;The Problem&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Coolify doesn’t natively support Netlify’s &lt;code&gt;_redirects&lt;/code&gt; file format. When I tried to include it directly in nginx config, it failed because nginx was trying to parse Netlify syntax as nginx config.&lt;/p&gt;&lt;h2 id=&quot;the-solution&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/supporting-netlify-_redirects-on-coolify-er-nginx/#the-solution&quot; class=&quot;heading-anchor&quot;&gt;The Solution&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I ended up with a build-time conversion approach:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Keep a simple &lt;code&gt;_redirects&lt;/code&gt; file in the Netlify format&lt;/li&gt;&lt;li&gt;Run a small shell script after the build that converts it to nginx rewrite rules&lt;/li&gt;&lt;li&gt;Have nginx include the generated config&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Here’s the redirect file (&lt;code&gt;src/_redirects&lt;/code&gt;):&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;/submit-session /speak 301
/conference/2025 /2025/conference 301
/terms /event-terms 301
/privacy /privacy-policy 301&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And here’s the conversion script:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Convert Netlify _redirects to nginx rewrite rules&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;REDIRECTS_FILE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dist/_redirects&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;NGINX_REDIRECTS_FILE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dist/_redirects.conf&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$REDIRECTS_FILE&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;# Auto-generated from _redirects&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NGINX_REDIRECTS_FILE&lt;/span&gt;&quot;&lt;/span&gt;
    
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;IFS&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Skip comments and empty lines&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=~&lt;/span&gt; ^&lt;span class=&quot;token comment&quot;&gt;#.*$ ]] || [[ -z &quot;$line&quot; ]]; then&lt;/span&gt;
            &lt;span class=&quot;token builtin class-name&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
        
        &lt;span class=&quot;token comment&quot;&gt;# Parse: /old-path /new-path [status]&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; from to status &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$line&lt;/span&gt;&quot;&lt;/span&gt;
        
        &lt;span class=&quot;token comment&quot;&gt;# Only handle 301 redirects (permanent)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$status&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;301&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;# Escape dots for nginx regex&lt;/span&gt;
            &lt;span class=&quot;token assign-left variable&quot;&gt;from_escaped&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$from&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s/&#92;./&#92;&#92;./g&#39;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;# Use https://$host to preserve domain&lt;/span&gt;
            &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rewrite ^&lt;span class=&quot;token variable&quot;&gt;${from_escaped}&lt;/span&gt;(/.*)?$ https://&#92;&lt;span class=&quot;token variable&quot;&gt;$host&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;${to}&lt;/span&gt;&#92;&lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; permanent;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$NGINX_REDIRECTS_FILE&lt;/span&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$REDIRECTS_FILE&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then in the nginx config:&lt;/p&gt;&lt;pre class=&quot;language-nginx&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;server&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;root&lt;/span&gt; /usr/share/nginx/html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;index&lt;/span&gt; index.html index.htm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# Include generated nginx rewrite rules&lt;/span&gt;
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;include&lt;/span&gt; /usr/share/nginx/html/_redirects.conf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;try_files&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$uri&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$uri&lt;/span&gt;.html &lt;span class=&quot;token variable&quot;&gt;$uri&lt;/span&gt;/index.html &lt;span class=&quot;token variable&quot;&gt;$uri&lt;/span&gt;/index.htm &lt;span class=&quot;token variable&quot;&gt;$uri&lt;/span&gt;/ =404&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# Handle 404 errors&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;error_page&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;404&lt;/span&gt; /404.html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; = /404.html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;root&lt;/span&gt; /usr/share/nginx/html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;internal&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# Handle server errors (50x)&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;error_page&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;502&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;503&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;504&lt;/span&gt; /50x.html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; = /50x.html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;root&lt;/span&gt; /usr/share/nginx/html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;internal&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;the-result&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/supporting-netlify-_redirects-on-coolify-er-nginx/#the-result&quot; class=&quot;heading-anchor&quot;&gt;The Result&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Now I can manage all my redirects in a simple file that anyone on my team can edit - no nginx knowledge required. Just add a line like:&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;/old-url /new-url 301&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And the build converts it automatically. It’s not as seamless as Netlify’s native support, but it’s close.&lt;/p&gt;&lt;h2 id=&quot;why-this-matters&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/supporting-netlify-_redirects-on-coolify-er-nginx/#why-this-matters&quot; class=&quot;heading-anchor&quot;&gt;Why This Matters&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;If you’re migrating from Netlify (or just want simple redirect management), this approach gives you that convenience without losing the flexibility of hosting on Coolify. The redirect file becomes the single source of truth, and the build handles the translation to nginx config.&lt;/p&gt;&lt;p&gt;It’s one of those small quality-of-life improvements that makes maintaining a static site a little bit nicer.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Setting up Email Forwarding to Basecamp in Microsoft 365</title>
      <link href="https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/" />
      <updated>2026-01-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/</id>
      <content type="html">
				&lt;h1 id=&quot;how-to-set-up-email-forwarding-to-basecamp-in-microsoft-365&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#how-to-set-up-email-forwarding-to-basecamp-in-microsoft-365&quot; class=&quot;heading-anchor&quot;&gt;How to Set Up Email Forwarding to Basecamp in Microsoft 365&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;This guide walks through setting up external email forwarding from a Microsoft 365 shared mailbox to Basecamp (or any external address)!&lt;/p&gt;&lt;h2 id=&quot;overview&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#overview&quot; class=&quot;heading-anchor&quot;&gt;Overview&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Microsoft 365 has &lt;strong&gt;two layers&lt;/strong&gt; that control email forwarding:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Mailbox Forwarding Settings&lt;/strong&gt; - Where you configure &lt;em&gt;where&lt;/em&gt; to forward emails&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Outbound Spam Filter Policy&lt;/strong&gt; - Controls &lt;em&gt;whether&lt;/em&gt; external forwarding is allowed&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Both must be configured correctly, or forwarding will fail with error:&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;550 5.7.520 Access denied, Your organization does not allow external forwarding. AS(7555)&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2 id=&quot;step-1-configure-mailbox-forwarding&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#step-1-configure-mailbox-forwarding&quot; class=&quot;heading-anchor&quot;&gt;Step 1: Configure Mailbox Forwarding&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;via-exchange-admin-center&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#via-exchange-admin-center&quot; class=&quot;heading-anchor&quot;&gt;Via Exchange Admin Center&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Go to &lt;a href=&quot;https://admin.exchange.microsoft.com&quot; rel=&quot;noopener&quot;&gt;https://admin.exchange.microsoft.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Navigate to &lt;strong&gt;Recipients&lt;/strong&gt; → &lt;strong&gt;Mailboxes&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Select the shared mailbox (e.g., &lt;code&gt;team@example.com&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Click &lt;strong&gt;Mail flow&lt;/strong&gt; → &lt;strong&gt;Email forwarding&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Enable &lt;strong&gt;Forward all emails sent to this mailbox&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Enter the Basecamp forwarding address (e.g., &lt;code&gt;save-not-real-value@3.basecamp.com&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Optionally check &lt;strong&gt;Keep a copy of forwarded messages&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Save&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;via-powershell&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#via-powershell&quot; class=&quot;heading-anchor&quot;&gt;Via PowerShell&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Connect to Exchange Online&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Connect-ExchangeOnline&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;UserPrincipalName your-admin@domain&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Device

&lt;span class=&quot;token comment&quot;&gt;# Set forwarding address&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Set-Mailbox&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Identity &lt;span class=&quot;token string&quot;&gt;&quot;team@example.com&quot;&lt;/span&gt; `
    &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ForwardingSmtpAddress &lt;span class=&quot;token string&quot;&gt;&quot;smtp:save-not-real-value@3.basecamp.com&quot;&lt;/span&gt; `
    &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;DeliverToMailboxAndForward &lt;span class=&quot;token boolean&quot;&gt;$true&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Verify&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Get-Mailbox&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Identity &lt;span class=&quot;token string&quot;&gt;&quot;team@example.com&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Format-List&lt;/span&gt; ForwardingSmtpAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;DeliverToMailboxAndForward&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2 id=&quot;step-2-allow-external-forwarding-in-anti-spam-policy&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#step-2-allow-external-forwarding-in-anti-spam-policy&quot; class=&quot;heading-anchor&quot;&gt;Step 2: Allow External Forwarding in Anti-Spam Policy&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is the step that’s often missed. By default, Microsoft 365 blocks external forwarding.&lt;/p&gt;&lt;h3 id=&quot;option-a-add-to-existing-policy-if-you-already-have-one&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#option-a-add-to-existing-policy-if-you-already-have-one&quot; class=&quot;heading-anchor&quot;&gt;Option A: Add to Existing Policy (If You Already Have One)&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;If you already have an outbound spam filter rule allowing forwarding for other mailboxes:&lt;/p&gt;&lt;h4 id=&quot;via-powershell-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#via-powershell-1&quot; class=&quot;heading-anchor&quot;&gt;Via PowerShell&lt;/a&gt;&lt;/h4&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Connect to Exchange Online&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Connect-ExchangeOnline&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;UserPrincipalName your-admin@domain&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Device

&lt;span class=&quot;token comment&quot;&gt;# Check existing rules&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Get-HostedOutboundSpamFilterRule&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Format-List&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;From&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;State

&lt;span class=&quot;token comment&quot;&gt;# Add the new mailbox to an existing rule&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Set-HostedOutboundSpamFilterRule&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Identity &lt;span class=&quot;token string&quot;&gt;&quot;Your Rule Name&quot;&lt;/span&gt; `
    &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;From&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;existing@domain.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;team@example.com&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Verify&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Get-HostedOutboundSpamFilterRule&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Identity &lt;span class=&quot;token string&quot;&gt;&quot;Your Rule Name&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Format-List&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;From&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;option-b-create-new-policy-and-rule&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#option-b-create-new-policy-and-rule&quot; class=&quot;heading-anchor&quot;&gt;Option B: Create New Policy and Rule&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;If you don’t have an existing forwarding policy:&lt;/p&gt;&lt;h4 id=&quot;via-microsoft-365-defender-portal&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#via-microsoft-365-defender-portal&quot; class=&quot;heading-anchor&quot;&gt;Via Microsoft 365 Defender Portal&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;Go to &lt;a href=&quot;https://security.microsoft.com&quot; rel=&quot;noopener&quot;&gt;https://security.microsoft.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Navigate to &lt;strong&gt;Email &amp;amp; collaboration&lt;/strong&gt; → &lt;strong&gt;Policies &amp;amp; rules&lt;/strong&gt; → &lt;strong&gt;Threat policies&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Click &lt;strong&gt;Anti-spam&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Go to &lt;strong&gt;Outbound policies&lt;/strong&gt; tab&lt;/li&gt;&lt;li&gt;Click &lt;strong&gt;Create policy&lt;/strong&gt; → &lt;strong&gt;Outbound&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Configure:&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt;: “Allow External Forwarding”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Automatic forwarding&lt;/strong&gt;: Set to &lt;strong&gt;On - Forwarding is enabled&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Under &lt;strong&gt;Applied to&lt;/strong&gt;, add the mailboxes that need forwarding:&lt;ul&gt;&lt;li&gt;&lt;strong&gt;From&lt;/strong&gt;: &lt;code&gt;team@example.com&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Save&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;via-powershell-2&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#via-powershell-2&quot; class=&quot;heading-anchor&quot;&gt;Via PowerShell&lt;/a&gt;&lt;/h4&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Connect to Exchange Online&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Connect-ExchangeOnline&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;UserPrincipalName your-admin@domain&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Device

&lt;span class=&quot;token comment&quot;&gt;# Create new outbound spam filter policy with forwarding enabled&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;New-HostedOutboundSpamFilterPolicy&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Name &lt;span class=&quot;token string&quot;&gt;&quot;AllowForwarding&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;AutoForwardingMode On

&lt;span class=&quot;token comment&quot;&gt;# Create rule to apply policy to specific mailboxes&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;New-HostedOutboundSpamFilterRule&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Name &lt;span class=&quot;token string&quot;&gt;&quot;Allow External Forwarding&quot;&lt;/span&gt; `
    &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;HostedOutboundSpamFilterPolicy &lt;span class=&quot;token string&quot;&gt;&quot;AllowForwarding&quot;&lt;/span&gt; `
    &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;From&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;team@example.com&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Verify&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Get-HostedOutboundSpamFilterRule&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Format-List&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;From&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;HostedOutboundSpamFilterPolicy&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;State&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2 id=&quot;troubleshooting&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#troubleshooting&quot; class=&quot;heading-anchor&quot;&gt;Troubleshooting&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;check-current-forwarding-settings&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#check-current-forwarding-settings&quot; class=&quot;heading-anchor&quot;&gt;Check Current Forwarding Settings&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;Get-Mailbox&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Identity &lt;span class=&quot;token string&quot;&gt;&quot;team@example.com&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Format-List&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;ForwardingAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;ForwardingSmtpAddress&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;DeliverToMailboxAndForward&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;check-outbound-spam-filter-policies&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#check-outbound-spam-filter-policies&quot; class=&quot;heading-anchor&quot;&gt;Check Outbound Spam Filter Policies&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# List all policies&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Get-HostedOutboundSpamFilterPolicy&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Format-List&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;AutoForwardingMode

&lt;span class=&quot;token comment&quot;&gt;# List all rules (shows which users/mailboxes each policy applies to)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;Get-HostedOutboundSpamFilterRule&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Format-List&lt;/span&gt; Name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;HostedOutboundSpamFilterPolicy&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;From&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;State&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;check-remote-domain-settings&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#check-remote-domain-settings&quot; class=&quot;heading-anchor&quot;&gt;Check Remote Domain Settings&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;Get-RemoteDomain&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Format-List&lt;/span&gt; DomainName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;AutoForwardEnabled&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2 id=&quot;quick-reference&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#quick-reference&quot; class=&quot;heading-anchor&quot;&gt;Quick Reference&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Setting&lt;/th&gt;&lt;th&gt;Location&lt;/th&gt;&lt;th&gt;Purpose&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;ForwardingSmtpAddress&lt;/td&gt;&lt;td&gt;Exchange Admin → Mailbox&lt;/td&gt;&lt;td&gt;Where to forward emails&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AutoForwardingMode&lt;/td&gt;&lt;td&gt;Defender → Anti-spam → Outbound&lt;/td&gt;&lt;td&gt;Whether forwarding is allowed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HostedOutboundSpamFilterRule&lt;/td&gt;&lt;td&gt;Defender → Anti-spam → Outbound&lt;/td&gt;&lt;td&gt;Which mailboxes the policy applies to&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr&gt;&lt;h2 id=&quot;common-errors&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#common-errors&quot; class=&quot;heading-anchor&quot;&gt;Common Errors&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Error&lt;/th&gt;&lt;th&gt;Cause&lt;/th&gt;&lt;th&gt;Fix&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;550 5.7.520 Access denied... AS(7555)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Outbound spam policy blocking forwarding&lt;/td&gt;&lt;td&gt;Add mailbox to spam filter rule with &lt;code&gt;AutoForwardingMode = On&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Forwarding not working (no error)&lt;/td&gt;&lt;td&gt;ForwardingSmtpAddress not set&lt;/td&gt;&lt;td&gt;Configure mailbox forwarding in Exchange Admin&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr&gt;&lt;h2 id=&quot;notes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-email-forwarding-to-basecamp-in-microsoft-365/#notes&quot; class=&quot;heading-anchor&quot;&gt;Notes&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Changes typically take effect within a few minutes&lt;/li&gt;&lt;li&gt;The “Default” outbound spam policy has &lt;code&gt;AutoForwardingMode = Automatic&lt;/code&gt; which blocks external forwarding&lt;/li&gt;&lt;li&gt;You must create a custom policy with &lt;code&gt;AutoForwardingMode = On&lt;/code&gt; and apply it to mailboxes that need forwarding&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>AI In A Box Hackathon: What We Built, What We Learned, and All the Data</title>
      <link href="https://jace.pro/blog/ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data/" />
      <updated>2026-01-12T00:00:00Z</updated>
      <id>https://jace.pro/blog/ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data/</id>
      <content type="html">
				&lt;h1 id=&quot;ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data/#ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data&quot; class=&quot;heading-anchor&quot;&gt;AI In A Box Hackathon: What We Built, What We Learned, and All the Data&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;When I kicked off the AI In A Box Hackathon, my main goal was simple: get people actually using AI In A Box on ServiceNow. Honestly, I thought if I could get enough folks building with it, the value would speak for itself and maybe I’d land a few new customers.&lt;/p&gt;&lt;p&gt;That didn’t happen. At least, not yet.&lt;/p&gt;&lt;p&gt;But here’s what did happen (and it’s worth talking about).&lt;/p&gt;&lt;h2 id=&quot;what-worked&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data/#what-worked&quot; class=&quot;heading-anchor&quot;&gt;What Worked&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;We made it possible.&lt;/strong&gt;&lt;br&gt;Six teams built and demoed real AI solutions in ServiceNow—something you couldn’t even try unless you were willing to pay enterprise prices. For a lot of builders, this was their first hands-on with AI in ServiceNow.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;The community showed up.&lt;/strong&gt;&lt;br&gt;Votes, comments, likes, and plenty of cheering from the sidelines. LinkedIn hit over 4,000 impressions, and the polls got hundreds of votes.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;People tried, learned, and taught.&lt;/strong&gt;&lt;br&gt;We got feedback, new use cases, and some wild creativity. People who had never met before teamed up and shipped working demos in 24 hours.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;what-didnt-and-what-i-learned&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data/#what-didnt-and-what-i-learned&quot; class=&quot;heading-anchor&quot;&gt;What Didn’t (and What I Learned)&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;No customer pipeline—yet.&lt;/strong&gt;&lt;br&gt;Nobody converted from participant to customer. Turns out, the journey from “cool demo” to “take my money” is longer than I’d hoped.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hackathon drop-off is real.&lt;/strong&gt;&lt;br&gt;Tons of teams formed (22 total!), but only 6 actually shipped demos. That’s normal—life happens, and time is short.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Momentum fades fast.&lt;/strong&gt;&lt;br&gt;After the event, most folks went back to their day jobs. Keeping that energy rolling is its own challenge.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt;&lt;br&gt;The real win here was access, energy, and proof that the community wants to build with AI if you let them.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;data-—-the-numbers-that-matter&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data/#data-%E2%80%94-the-numbers-that-matter&quot; class=&quot;heading-anchor&quot;&gt;#DATA — The Numbers That Matter&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Here’s the full breakdown—no fluff, just what actually happened.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metric&lt;/th&gt;&lt;th&gt;Number&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Teams entered&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Teams with working demos&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Total votes cast&lt;/td&gt;&lt;td&gt;1,184&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LinkedIn impressions&lt;/td&gt;&lt;td&gt;~4,251&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Comments made (LinkedIn)&lt;/td&gt;&lt;td&gt;50+&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Likes/Reactions (LinkedIn)&lt;/td&gt;&lt;td&gt;90+&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;tournament-results&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data/#tournament-results&quot; class=&quot;heading-anchor&quot;&gt;Tournament Results&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Finals:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Team F*ck it. Ship it: &lt;strong&gt;201 votes&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Team Techdragoo (The Syndicate): &lt;strong&gt;191 votes&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Other matchups:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;F*ck it. Ship it vs SNPDG: &lt;strong&gt;131 vs 120&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Techdragoo vs UK Now Hack: &lt;strong&gt;138 vs 85&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Techdragoo vs Checklist Pro: &lt;strong&gt;55 vs 32&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;AInsteins vs SNPDG: &lt;strong&gt;10 vs 30&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;engagement-highlights&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data/#engagement-highlights&quot; class=&quot;heading-anchor&quot;&gt;Engagement Highlights&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;LinkedIn polls:&lt;/strong&gt; Up to 251 votes per poll.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Demo videos:&lt;/strong&gt; 6 unique solutions, each with public demos.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Community:&lt;/strong&gt; Dozens of comments, reactions, and reposts.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;the-teams-and-their-solutions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data/#the-teams-and-their-solutions&quot; class=&quot;heading-anchor&quot;&gt;The Teams &amp;amp; Their Solutions&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Team&lt;/th&gt;&lt;th&gt;Solution&lt;/th&gt;&lt;th&gt;Demo&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;F*ck it. Ship it (RapDev)&lt;/td&gt;&lt;td&gt;GenAI-Driven IT Operations&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/posts/rapdevio_genai-efficiency-insights-activity-7300178781883781121-NWW_&quot; rel=&quot;noopener&quot;&gt;View&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The Syndicate (Techdragoo)&lt;/td&gt;&lt;td&gt;AI-Powered Receptionist&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/posts/rampriya-s_ai-powered-receptionist-ai-in-a-box-activity-7298574622281617408-kal7&quot; rel=&quot;noopener&quot;&gt;View&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SNPDG&lt;/td&gt;&lt;td&gt;AI-Powered Ticket Resolution&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/posts/jacebenson_aihackathon-aiinabox-timesavings-activity-7300185235944611840-DAjz&quot; rel=&quot;noopener&quot;&gt;View&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;UK Hack Now&lt;/td&gt;&lt;td&gt;AI-Driven Business Automation&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:7298744399759355904/&quot; rel=&quot;noopener&quot;&gt;View&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Checklist Pro&lt;/td&gt;&lt;td&gt;Text-to-Checklist AI&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/posts/tyroach_aiinabox-aihackathon-servicenow-activity-7299806078035259395-_1PU&quot; rel=&quot;noopener&quot;&gt;View&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AInsteins&lt;/td&gt;&lt;td&gt;Automated Knowledge Articles&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/posts/activity-7298805733888798721-rvDS/&quot; rel=&quot;noopener&quot;&gt;View&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;wrapping-up-this-chapter&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data/#wrapping-up-this-chapter&quot; class=&quot;heading-anchor&quot;&gt;Wrapping Up This Chapter&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Was this event a failure? Nope. Did I get what I wanted? Not exactly. But I got what I needed: proof that when you lower the barrier to entry, people show up, build cool stuff, and push the platform in new directions.&lt;/p&gt;&lt;p&gt;If you’re thinking about running your own hackathon, do it. Just be ready for the outcome to surprise you—and remember, sometimes the best result is seeing what’s possible.&lt;/p&gt;&lt;p&gt;That’s a wrap for this hackathon. AI In A Box isn’t dead—it’s just getting started.&lt;/p&gt;&lt;p&gt;On to the next one.&lt;/p&gt;&lt;h2 id=&quot;links&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-in-a-box-hackathon-what-we-built-what-we-learned-and-all-the-data/#links&quot; class=&quot;heading-anchor&quot;&gt;Links&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://getaiinabox.com/events&quot; rel=&quot;noopener&quot;&gt;AI In A Box Events&lt;/a&gt; — See past and upcoming events&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/posts/jacebenson_thank-you-to-everyone-who-made-the-ai-in-activity-7301382036756250625-t9RL&quot; rel=&quot;noopener&quot;&gt;Hackathon Wrap-Up on LinkedIn&lt;/a&gt; — The final thank-you post&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Product vs Service in ServiceNow</title>
      <link href="https://jace.pro/blog/product-vs-service-in-servicenow/" />
      <updated>2026-01-04T00:00:00Z</updated>
      <id>https://jace.pro/blog/product-vs-service-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;ServiceNow has Products and Services. They’re not the same thing. Here’s the difference.&lt;/p&gt;&lt;h1 id=&quot;tldr&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/product-vs-service-in-servicenow/#tldr&quot; class=&quot;heading-anchor&quot;&gt;TLDR&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;Products&lt;/strong&gt; are what you sell to customers (SOMT, Product Catalog). &lt;strong&gt;Services&lt;/strong&gt; are what you deliver and support internally (CSDM, CMDB).&lt;/p&gt;&lt;p&gt;A customer buys a “1 Gigabit Internet Plan” (Product). You provision and manage a “Fiber Internet Service” (Service).&lt;/p&gt;&lt;h1 id=&quot;the-breakdown&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/product-vs-service-in-servicenow/#the-breakdown&quot; class=&quot;heading-anchor&quot;&gt;The Breakdown&lt;/a&gt;&lt;/h1&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;Product (Product Offering)&lt;/th&gt;&lt;th&gt;Service (Service Offering)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Primary Purpose&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Sales &amp;amp; Commerce. Defines what is sold to a customer and appears on a quote or order.&lt;/td&gt;&lt;td&gt;Operations &amp;amp; Support. Defines how a capability is delivered, managed, and supported internally.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Audience&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;External Customers and the Sales Department.&lt;/td&gt;&lt;td&gt;Internal Teams (IT, Operations, Support) and potentially internal employees.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Module / Framework&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Part of the SOMT (Service Order Management) and Product Catalog Management modules.&lt;/td&gt;&lt;td&gt;Part of the CSDM (Common Service Data Model) and CMDB (Configuration Management Database).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Relation to CMDB&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Not part of the CMDB class structure. It’s a separate, commercial catalog.&lt;/td&gt;&lt;td&gt;Intrinsically tied to the CMDB (e.g., cmdb_ci_service). Used to model operational services.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Lifecycle Stage&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;“What is Sold?” The beginning of the customer lifecycle (Ordering, Billing).&lt;/td&gt;&lt;td&gt;“How is it Delivered?” The middle and end of the lifecycle (Fulfillment, Assurance, Support).&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h1 id=&quot;examples&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/product-vs-service-in-servicenow/#examples&quot; class=&quot;heading-anchor&quot;&gt;Examples&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;Internet Service:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Product Offering:&lt;/strong&gt; “1 Gigabit Internet Plan” - This is the item a customer selects and pays for.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Service Offering:&lt;/strong&gt; “Provisioned Fiber Internet Service” - This is the operational service that is managed, monitored, and supported.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Corporate Laptop:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Product Offering:&lt;/strong&gt; “Dell Laptop Model X with 3-Year Support” - The sellable item with a specific SKU.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Service Offering:&lt;/strong&gt; “Corporate Laptop Support” - The internal service desk offering for troubleshooting hardware issues.&lt;/li&gt;&lt;/ul&gt;&lt;h1 id=&quot;why-this-matters&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/product-vs-service-in-servicenow/#why-this-matters&quot; class=&quot;heading-anchor&quot;&gt;Why This Matters&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;If you’re implementing SOMT (Service Order Management for Telecommunications) or building out your CSDM (Common Service Data Model), understanding this distinction prevents you from mixing commercial catalog items with operational services.&lt;/p&gt;&lt;p&gt;Products live in your sales catalog. Services live in your CMDB.&lt;/p&gt;&lt;p&gt;Don’t confuse them.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Deleting a ton of records in ServiceNow</title>
      <link href="https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/" />
      <updated>2026-01-04T00:00:00Z</updated>
      <id>https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;Someone needed to delete 25+ million records from metric_instance. Here’s what happened.&lt;/p&gt;&lt;h1 id=&quot;tldr&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#tldr&quot; class=&quot;heading-anchor&quot;&gt;TLDR&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;Use Table Cleanup Policies.&lt;/strong&gt; They don’t trigger business rules (unless iterativeDelete is set), run in 20-minute batches, and are designed for this. Make sure your query has good indexes or it’ll timeout at 30 seconds. Expect days, not hours. Test first.&lt;/p&gt;&lt;h1 id=&quot;the-four-methods&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#the-four-methods&quot; class=&quot;heading-anchor&quot;&gt;The four methods&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;ServiceNow gives you four ways to delete data in bulk:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;UI Actions&lt;/li&gt;&lt;li&gt;Clone Exclude Rules&lt;/li&gt;&lt;li&gt;Table Cleanup Policies (Table Cleaner)&lt;/li&gt;&lt;li&gt;JavaScript (Background Scripts)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Each has tradeoffs.&lt;/p&gt;&lt;h1 id=&quot;ui-actions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#ui-actions&quot; class=&quot;heading-anchor&quot;&gt;UI Actions&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;The easy way.&lt;/p&gt;&lt;p&gt;Open the table’s sys_db_object record, click “Delete All Records”. Or filter a list and delete selected records.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Simple&lt;/li&gt;&lt;li&gt;No code&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Slow&lt;/li&gt;&lt;li&gt;Limited by UI transaction quota (default 5 minutes)&lt;/li&gt;&lt;li&gt;Triggers all business rules and workflows&lt;/li&gt;&lt;li&gt;Tracked in update sets&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Under the hood, this runs:&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;table_name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deleteMultiple&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For 25M records, this won’t work. You’ll hit the transaction timeout.&lt;/p&gt;&lt;h1 id=&quot;clone-exclude-rules&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#clone-exclude-rules&quot; class=&quot;heading-anchor&quot;&gt;Clone Exclude Rules&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;The fast way.&lt;/p&gt;&lt;p&gt;Add the table to clone exclude rules, clone the instance. The table gets truncated.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Very fast (table truncation is cheap)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Nuclear option - deletes EVERYTHING&lt;/li&gt;&lt;li&gt;Leaves broken references&lt;/li&gt;&lt;li&gt;Can orphan data in table hierarchies&lt;/li&gt;&lt;li&gt;Not viable for production&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;From the KB:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;When data is excluded by a clone, the excluded table is truncated. However, any references to the excluded records on other tables will be broken.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Only use this if you’re deleting an entire table and understand the consequences.&lt;/p&gt;&lt;h1 id=&quot;table-cleanup-policies&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#table-cleanup-policies&quot; class=&quot;heading-anchor&quot;&gt;Table Cleanup Policies&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;The recommended way.&lt;/p&gt;&lt;p&gt;Create a table cleanup policy with your conditions. Runs on a schedule.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Set it and forget it&lt;/li&gt;&lt;li&gt;Flexible conditions (not just time-based)&lt;/li&gt;&lt;li&gt;Does NOT trigger business rules/workflows*&lt;/li&gt;&lt;li&gt;Respects cascade delete rules&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Slow&lt;/li&gt;&lt;li&gt;20 minute per batch time limit&lt;/li&gt;&lt;li&gt;Query timeout at 30 seconds&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;*Unless the table has the &lt;code&gt;iterativeDelete&lt;/code&gt; attribute set to true.&lt;/p&gt;&lt;h2 id=&quot;the-important-details&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#the-important-details&quot; class=&quot;heading-anchor&quot;&gt;The important details&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;From the community:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Yeah, you can do 0 seconds in the age field and then add the conditions you’d like&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;You’re not limited to age-based deletion.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;there is not a 5k limit, there is a 20 minute per batch limit&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It’s time-limited, not count-limited.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Delete business rules and workflows are not triggered for table cleaner, keep that in mind&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is the key advantage. No business rules = much faster.&lt;/p&gt;&lt;h2 id=&quot;the-query-timeout-problem&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#the-query-timeout-problem&quot; class=&quot;heading-anchor&quot;&gt;The query timeout problem&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;If a table cleaner rule has a query that takes longer than 30 seconds to complete, the entire table cleaner job is stopped.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Make sure you have indexes on your query fields.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;100% make sure the query you are running has a good index&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;For the metric_instance case:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;definition is reference so it should search fast with that condition. so its indexed&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Reference fields are already indexed.&lt;/p&gt;&lt;h1 id=&quot;javascript-/-background-scripts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#javascript-/-background-scripts&quot; class=&quot;heading-anchor&quot;&gt;JavaScript / Background Scripts&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;The flexible way.&lt;/p&gt;&lt;p&gt;Write a script in Scripts - Background.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Unlimited flexibility&lt;/li&gt;&lt;li&gt;Can bypass business rules/workflows&lt;/li&gt;&lt;li&gt;No transaction timeout (if you uncheck “Cancel after 4 hours”)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Slow&lt;/li&gt;&lt;li&gt;Risky&lt;/li&gt;&lt;li&gt;Requires scripting knowledge&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Basic script:&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;table_name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setWorkflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Bypass business rules and workflows&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deleteMultiple&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;With conditions:&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;table_name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;closed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;category&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sys_id_here&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setWorkflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deleteMultiple&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;From the KB:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Using setWorkflow(false) will also suppress update set tracking.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This bypasses business rules, workflows, AND update set tracking.&lt;/p&gt;&lt;h1 id=&quot;what-the-community-recommended&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#what-the-community-recommended&quot; class=&quot;heading-anchor&quot;&gt;What the community recommended&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;For 25M+ records, the consensus was:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Use Table Cleaner&lt;/strong&gt; (or Data Management Delete Jobs)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Check your indexes&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Schedule during off-hours&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Don’t worry about speed&lt;/strong&gt; - Days is expected&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Hide records from users first&lt;/strong&gt; - Use a before query business rule&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Additional tips from the thread:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Do write a before query or similar to remove those records from most users being able to see them&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Hide the records while deletion runs so users don’t interact with data you’re deleting.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Do test it in your test instance&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Always.&lt;/p&gt;&lt;h1 id=&quot;monitoring-progress&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#monitoring-progress&quot; class=&quot;heading-anchor&quot;&gt;Monitoring progress&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;There’s no built-in progress tracker.&lt;/p&gt;&lt;p&gt;Options:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Check transaction logs (not handy)&lt;/li&gt;&lt;li&gt;Create a scheduled job that runs GlideAggregate to count remaining records&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;From the thread:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;scheduled job to do a glideaggregate of how many are left?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;That’s what folks do.&lt;/p&gt;&lt;h1 id=&quot;things-to-consider-before-deleting&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#things-to-consider-before-deleting&quot; class=&quot;heading-anchor&quot;&gt;Things to consider before deleting&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;From KB0717791:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;What cascade deletions will occur?&lt;/li&gt;&lt;li&gt;What references will be broken/cleared?&lt;/li&gt;&lt;li&gt;What business rules will be triggered?&lt;/li&gt;&lt;li&gt;What workflows will run?&lt;/li&gt;&lt;li&gt;Will my deletion be tracked by update sets?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Plan for cleanup. The Delete Recovery tool (London+) can help roll back if needed.&lt;/p&gt;&lt;h1 id=&quot;the-reality&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#the-reality&quot; class=&quot;heading-anchor&quot;&gt;The reality&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;For 25+ million records, you’re looking at days, not hours.&lt;/p&gt;&lt;p&gt;John Dahl mentioned Tim Woodruff’s event-driven recursion article was written before Data Management existed:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I think @ProfessorTim wrote that before the data management functionality existed. That article still has value where you need to do something other than deletes, but I would look at OOB functionality first.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Use the OOB tools. They’re designed for this.&lt;/p&gt;&lt;h1 id=&quot;references&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deleting-a-ton-of-records-in-servicenow/#references&quot; class=&quot;heading-anchor&quot;&gt;References&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0717791&quot; rel=&quot;noopener&quot;&gt;KB0717791&lt;/a&gt; - Mass-Deletion and excess data management&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0694151&quot; rel=&quot;noopener&quot;&gt;KB0694151&lt;/a&gt; - How to use Table Cleaner&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/washingtondc-platform-administration/page/administer/managing-data/concept/deleting-records-safely.html&quot; rel=&quot;noopener&quot;&gt;Data Management docs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://snprotips.com/blog/2018/10/11/how-to-do-massive-slow-database-operations-without-slowing-down-your-instance&quot; rel=&quot;noopener&quot;&gt;SN Pro Tips Event-Driven Recursion&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Batch update ServiceNow store apps with one script</title>
      <link href="https://jace.pro/blog/batch-update-servicenow-store-apps-with-one-script/" />
      <updated>2026-01-04T00:00:00Z</updated>
      <id>https://jace.pro/blog/batch-update-servicenow-store-apps-with-one-script/</id>
      <content type="html">
				&lt;p&gt;Got a bunch of ServiceNow store apps that need updating? Here’s a script from Eric Riemer that makes it painless. I have this here cause it’s super useful.&lt;/p&gt;&lt;h1 id=&quot;the-problem&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/batch-update-servicenow-store-apps-with-one-script/#the-problem&quot; class=&quot;heading-anchor&quot;&gt;The problem&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;You have 10+ store apps that need updates. Clicking through each one individually is tedious.&lt;/p&gt;&lt;h1 id=&quot;the-solution&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/batch-update-servicenow-store-apps-with-one-script/#the-solution&quot; class=&quot;heading-anchor&quot;&gt;The solution&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Use the CI/CD Batch Install API to update them all at once.&lt;/p&gt;&lt;p&gt;This script:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Finds all installed store apps with updates available&lt;/li&gt;&lt;li&gt;Builds a JSON payload&lt;/li&gt;&lt;li&gt;Gives you the API endpoint to paste it into&lt;/li&gt;&lt;/ol&gt;&lt;h1 id=&quot;the-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/batch-update-servicenow-store-apps-with-one-script/#the-script&quot; class=&quot;heading-anchor&quot;&gt;The script&lt;/a&gt;&lt;/h1&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*----------------------------------------------------*/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*                      AUTO                          */&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*  Have a bunch of apps that need to be updated?     */&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*  Run this and follow the directions in the output  */&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*  It will automaticallybuild and run a batch        */&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*  install of all of the needed updates.             */&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*                                                    */&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*         Latest code always available at            */&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*         https://snwizard.com/update-apps           */&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*                                                    */&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*----------------------------------------------------*/&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;//Want Demo Data with the app?&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; loadDemoData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; updateCheck &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//this can take some time to run and adds a LOT of stuff to the log making the important bit harder to find&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;updateCheck&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;sn_appclient&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;UpdateChecker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;checkAvailableUpdates&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; prevName&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; appsArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; grSSA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sys_store_app&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
grSSA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;install_dateISNOTEMPTY^hide_on_ui=false^vendor=ServiceNow^ORvendorISEMPTY&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
grSSA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;orderBy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
grSSA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;orderBy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
grSSA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;grSSA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; curName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; grSSA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; latestVersion &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;updateAvailable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;grSSA&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;curName &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; prevName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;latestVersion&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        prevName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; curName&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; appObject &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;displayName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; curName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; grSSA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUniqueValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;load_demo_data&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; loadDemoData&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;application&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;requested_version&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; grSSA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;latest_version&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        appsArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;appObject&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;updateAvailable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;grSSA&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; installedVersion &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; grSSA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; latestVersion &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; grSSA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;latest_version&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; installedArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; installedVersion&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; latestArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; latestVersion&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; len &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;installedArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; latestArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; len&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; installed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; installedArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;installedArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; latest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; latestArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;latestArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;installed &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; latest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;installed &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; latest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;appsArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&#92;n------------------------------------------------&#92;n&#92;nLinks to track progress below the payload information&#92;n&#92;n(scroll down)&#92;n&#92;n-----------------------------------------------&#92;n&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; appsPackages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    appsPackages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;packages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; appsArray&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    appsPackages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Update Apps&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;global&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;appsPackages&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; baseUrl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;glide.servlet.uri&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; update &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;sn_appclient&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AppUpgrader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;installBatch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; updateObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;update&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&#92;n------------------------------------------------&#92;n&#92;nOpen the Batch install link to monitor the installation progress. It may take some time for the apps to all populate in the related list. After all apps have populated the install will start and the State will change to In progress.&#92;n&#92;nBatch install:&#92;n&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
        baseUrl &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;nav_to.do?uri=sys_batch_install_plan.do?sys_id=&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
        updateObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;batch_installation_id &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&#92;nExecution tracker:&#92;n&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
        baseUrl &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;nav_to.do?uri=sys_progress_worker.do?sys_id=&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
        updateObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;execution_tracker_id &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&#92;n-----------------------------------------------&#92;n&#92;n&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; grSBIP &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_batch_install_plan&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;grSBIP&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;updateObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;batch_installation_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        grSBIP&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;notes&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;It may take some time for the apps to all populate in the related list below (you can refresh the list as needed to see them populating). &#92;n&#92;nAfter all apps have populated the install will start and the State (above) will change to In progress. &#92;n&#92;nWhen the batch is done the state will update to Installed&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        grSBIP&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&#92;n-----------------------------------------------&#92;n&#92;nAll apps appear to be up-to-date. &#92;n&#92;nIf you think this is incorrect please try running this script again with `updateCheck` set to `true`. This will check the store for any new updates.&#92;n(sometimes there are apps in the Application Manager that say that there are updates but you can&#39;t actually update them)&#92;n&#92;n-----------------------------------------------&#92;n&#92;n&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;how-to-use-it&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/batch-update-servicenow-store-apps-with-one-script/#how-to-use-it&quot; class=&quot;heading-anchor&quot;&gt;How to use it&lt;/a&gt;&lt;/h1&gt;&lt;ol&gt;&lt;li&gt;Run the script in &lt;strong&gt;Scripts - Background&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Check the logs for the output&lt;/li&gt;&lt;li&gt;Script automatically kicks off the batch install&lt;/li&gt;&lt;li&gt;Click the links in the output to monitor progress&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The batch install runs automatically now - no need to manually paste JSON into an API endpoint.&lt;/p&gt;&lt;h1 id=&quot;configuration-options&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/batch-update-servicenow-store-apps-with-one-script/#configuration-options&quot; class=&quot;heading-anchor&quot;&gt;Configuration options&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Set &lt;code&gt;loadDemoData&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt; if you don’t want demo data.&lt;/p&gt;&lt;p&gt;Set &lt;code&gt;updateCheck&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; if you want to force check the store for new updates first. Warning: this adds a lot to the logs.&lt;/p&gt;&lt;h1 id=&quot;what-it-checks&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/batch-update-servicenow-store-apps-with-one-script/#what-it-checks&quot; class=&quot;heading-anchor&quot;&gt;What it checks&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;The query looks for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Apps that are installed (&lt;code&gt;install_dateISNOTEMPTY&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Not hidden from UI (&lt;code&gt;hide_on_ui=false&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Vendor is ServiceNow or empty&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It then compares installed version vs latest version and only includes apps with updates available.&lt;/p&gt;&lt;h1 id=&quot;credit&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/batch-update-servicenow-store-apps-with-one-script/#credit&quot; class=&quot;heading-anchor&quot;&gt;Credit&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Thanks to @eric R for this script.&lt;/p&gt;&lt;p&gt;Source: &lt;a href=&quot;https://snwizard.com/update-apps/&quot; rel=&quot;noopener&quot;&gt;https://snwizard.com/update-apps/&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Using Rclone on s3-compliant buckets</title>
      <link href="https://jace.pro/blog/using-rclone-on-s3-compliant-buckets/" />
      <updated>2025-12-11T00:00:00Z</updated>
      <id>https://jace.pro/blog/using-rclone-on-s3-compliant-buckets/</id>
      <content type="html">
				&lt;h2 id=&quot;what-is-s3&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/using-rclone-on-s3-compliant-buckets/#what-is-s3&quot; class=&quot;heading-anchor&quot;&gt;What is s3&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;S3 is a pretty neat idea. It’s a place to store files for a price. What’s really nice about using S3 is you can store larger static assets or build assets and not have to include them in your build. Or you can use it as a place to store your backups of your databases.&lt;/p&gt;&lt;h2 id=&quot;how-can-rclone-help&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/using-rclone-on-s3-compliant-buckets/#how-can-rclone-help&quot; class=&quot;heading-anchor&quot;&gt;How can RClone help?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Rclone is a command line utility that lets you connect to and work with a bunch of storage to store different things including S3. I didn’t know this.&lt;/p&gt;&lt;h2 id=&quot;okay-how-do-i-connect-rclone-to-a-bucket&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/using-rclone-on-s3-compliant-buckets/#okay-how-do-i-connect-rclone-to-a-bucket&quot; class=&quot;heading-anchor&quot;&gt;Okay, how do I connect Rclone to a bucket?&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;First install &lt;a href=&quot;https://rclone.org/install/&quot; rel=&quot;noopener&quot;&gt;Rclone&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Then you need to configure a connection, do that by running &lt;code&gt;rclone config&lt;/code&gt;, then choose &lt;code&gt;n) New remove&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Give it a name, I named this &lt;code&gt;vult&lt;/code&gt; as it’s the connect to the Vultr S3 buckets.&lt;/li&gt;&lt;li&gt;It gives you a big ol’ list. I wanted to use s3, so near the top is one called &lt;code&gt;Amazon S3 Compliant Storage Providers&lt;/code&gt;. It was 4 for me, so I put in &lt;code&gt;4&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Then it asks for a Provider, I didn’t see Vultr, so I just picked Amazon Web Services S3 &lt;code&gt;1&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;It will ask to either be given the credential or get them from an env var. I chose to give the credentials to it by choosing &lt;code&gt;1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;It will then ask for the following;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;access_key_id&lt;/code&gt; give this to it&lt;/li&gt;&lt;li&gt;&lt;code&gt;secret_access_key&lt;/code&gt; give this to it&lt;/li&gt;&lt;li&gt;&lt;code&gt;region&lt;/code&gt; for Vultr this didn’t matter, left it blank&lt;/li&gt;&lt;li&gt;&lt;code&gt;endpoint&lt;/code&gt; for this its important you give the proper endpoint. Vultrs was &lt;code&gt;ewr1.vultrobjects.com&lt;/code&gt;, you’ll want to put in your endpoint of your S3 compliant host here.&lt;/li&gt;&lt;li&gt;&lt;code&gt;location_constraint&lt;/code&gt;, didn’t matter for Vultr, left blank&lt;/li&gt;&lt;li&gt;&lt;code&gt;acl&lt;/code&gt;, didn’t matter for Vultr, left blank&lt;/li&gt;&lt;li&gt;&lt;code&gt;server_side_encryption&lt;/code&gt;, didn’t matter for Vultr, left blank&lt;/li&gt;&lt;li&gt;&lt;code&gt;sse_kms_key_id&lt;/code&gt;, didn’t matter for Vultr, left blank&lt;/li&gt;&lt;li&gt;&lt;code&gt;storage_class&lt;/code&gt;, didn’t matter for Vultr, left blank&lt;/li&gt;&lt;/ul&gt;&lt;ol start=&quot;8&quot;&gt;&lt;li&gt;Then it will ask if you want to edit advanced config? Go ahead and say &lt;code&gt;n) No&lt;/code&gt;&lt;/li&gt;&lt;li&gt;It’ll show you the settings confirm this &lt;code&gt;y) Yes this is OK&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now that it’s set up you can test this by listing the buckets for the connection by typing &lt;code&gt;rclone lsd vult:&lt;/code&gt; that last &lt;code&gt;:&lt;/code&gt; is important this should list your buckets.&lt;/p&gt;&lt;p&gt;Cool&lt;/p&gt;&lt;h2 id=&quot;now-lets-copy-that-to-another-bucket&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/using-rclone-on-s3-compliant-buckets/#now-lets-copy-that-to-another-bucket&quot; class=&quot;heading-anchor&quot;&gt;Now let’s copy that to another bucket&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You’ll need to set up a second bucket at your destination. Once you get that set up. It’s a command per bucket.&lt;/p&gt;&lt;p&gt;&lt;code&gt;rclone sync -v vult:bucketname/ newhost:bucketname/&lt;/code&gt;&lt;/p&gt;&lt;p&gt;This runs the &lt;code&gt;sync&lt;/code&gt; which uploads everything from the first host, to the second and removing anything on new host that wasn’t there. E.g. If you had a file for each of the Simpsons (homer.png, marg.png, bart.png, lisa.png, maggie.png) and wanted to copy them over to an existing bucket that had a photo of me, jace.png, and your ran sync. At the end you’d have the Simpsons, and the jace.png would be gone.&lt;/p&gt;&lt;p&gt;You can instead run a &lt;code&gt;copy&lt;/code&gt; which just copies the files and doesn’t remove things that don’t exist in the source.&lt;/p&gt;&lt;p&gt;Thanks &lt;a href=&quot;https://www.linkedin.com/in/jacob-nollette/&quot; rel=&quot;noopener&quot;&gt;Jacob Nollette&lt;/a&gt; for the assist here! Really appreciate it!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Changing the popup/hover over view in ServiceNow</title>
      <link href="https://jace.pro/blog/changing-the-popup/hover-over-view-in-servicenow/" />
      <updated>2025-11-18T00:00:00Z</updated>
      <id>https://jace.pro/blog/changing-the-popup/hover-over-view-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;Today I was looking at an issue and had trouble finding the documentation for the hover overview. That’s cause it’s not called that. It’s called the “popup” view or “&lt;code&gt;sys_popup&lt;/code&gt;”. This is a rewrite of the fine work &lt;a href=&quot;https://www.servicenow.com/community/servicenow-ai-platform-blog/how-to-customize-fields-displayed-on-the-reference-field-pop-up/ba-p/2282544&quot; rel=&quot;noopener&quot;&gt;Roger Chew did on the community here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If there is no defined &lt;code&gt;sys_popup&lt;/code&gt; view ServiceNow will default to using the “&lt;code&gt;default&lt;/code&gt;” view.&lt;br&gt;If the view &lt;code&gt;sys_popup,[viewname]&lt;/code&gt; exists, then this pop up view for the given view will be used.&lt;br&gt;If the view &lt;code&gt;sys_popup&lt;/code&gt; exists and it hasn’t been handled yet, this view will be used.&lt;/p&gt;&lt;h2 id=&quot;how-to-configure-the-sys_popup-view&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/changing-the-popup/hover-over-view-in-servicenow/#how-to-configure-the-sys_popup-view&quot; class=&quot;heading-anchor&quot;&gt;How to configure the sys_popup view&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Goto &lt;code&gt;&amp;lt;instance&amp;gt;.service-now.com/&amp;lt;table&amp;gt;.do?sysparm_view=sys_popup&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Right click the header and configure the form with whatever tool is useful (form layout, form designer, etc)&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;how-to-configure-the-sys_popup-for-a-specific-view&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/changing-the-popup/hover-over-view-in-servicenow/#how-to-configure-the-sys_popup-for-a-specific-view&quot; class=&quot;heading-anchor&quot;&gt;How to configure the sys_popup for a specific view&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Goto &lt;code&gt;&amp;lt;instance&amp;gt;.service-now.com/&amp;lt;table&amp;gt;.do?sysparm_view=sys_popup,ess&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Right click the header and configure the form with whatever tool is useful (form layout, form designer, etc)&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Restore Record when Restore is not working</title>
      <link href="https://jace.pro/blog/restore-record-when-restore-is-not-working/" />
      <updated>2025-10-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/restore-record-when-restore-is-not-working/</id>
      <content type="html">
				&lt;p&gt;Sometimes in ServiceNow, the standard restore function for deleted records may not work as expected. In such cases, you can manually recreate the record using its XML representation and GlideRecord scripting.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// we are going to recreate a record;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; recordXML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&amp;lt;ais_search_source&amp;gt;&amp;lt;active&amp;gt;true&amp;lt;/active&amp;gt;&amp;lt;condition table=&quot;live_message&quot;&amp;gt;chat_message=false^state=published^EQ&amp;lt;item endquery=&quot;false&quot; field=&quot;chat_message&quot; goto=&quot;false&quot; newquery=&quot;false&quot; operator=&quot;=&quot; or=&quot;false&quot; value=&quot;false&quot;/&amp;gt;&amp;lt;item display_value=&quot;published&quot; endquery=&quot;false&quot; field=&quot;state&quot; goto=&quot;false&quot; newquery=&quot;false&quot; operator=&quot;=&quot; or=&quot;false&quot; value=&quot;published&quot;/&amp;gt;&amp;lt;item endquery=&quot;true&quot; field=&quot;&quot; goto=&quot;false&quot; newquery=&quot;false&quot; operator=&quot;=&quot; or=&quot;false&quot; value=&quot;&quot;/&amp;gt;&amp;lt;/condition&amp;gt;&amp;lt;datasource display_value=&quot;&quot;&amp;gt;live_message&amp;lt;/datasource&amp;gt;&amp;lt;name&amp;gt;Live Feed - Live Feed Messages&amp;lt;/name&amp;gt;&amp;lt;sys_class_name&amp;gt;ais_search_source&amp;lt;/sys_class_name&amp;gt;&amp;lt;sys_created_by&amp;gt;133488&amp;lt;/sys_created_by&amp;gt;&amp;lt;sys_created_on&amp;gt;2024-01-03 19:49:10&amp;lt;/sys_created_on&amp;gt;&amp;lt;sys_customer_update&amp;gt;false&amp;lt;/sys_customer_update&amp;gt;&amp;lt;sys_id&amp;gt;7feff50197ebb910b6687be0f053af90&amp;lt;/sys_id&amp;gt;&amp;lt;sys_mod_count&amp;gt;0&amp;lt;/sys_mod_count&amp;gt;&amp;lt;sys_name&amp;gt;Live Feed - Live Feed Messages&amp;lt;/sys_name&amp;gt;&amp;lt;sys_package display_value=&quot;Global&quot; source=&quot;global&quot;&amp;gt;global&amp;lt;/sys_package&amp;gt;&amp;lt;sys_policy/&amp;gt;&amp;lt;sys_replace_on_upgrade&amp;gt;false&amp;lt;/sys_replace_on_upgrade&amp;gt;&amp;lt;sys_scope display_value=&quot;Global&quot;&amp;gt;global&amp;lt;/sys_scope&amp;gt;&amp;lt;sys_update_name&amp;gt;ais_search_source_7feff50197ebb910b6687be0f053af90&amp;lt;/sys_update_name&amp;gt;&amp;lt;sys_updated_by&amp;gt;133488&amp;lt;/sys_updated_by&amp;gt;&amp;lt;sys_updated_on&amp;gt;2024-01-03 19:49:10&amp;lt;/sys_updated_on&amp;gt;&amp;lt;/ais_search_source&amp;gt;&#39;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; jsonRecord &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;xmlToJSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;recordXML&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//gs.print(JSON.stringify(jsonRecord,null,2))&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// loop over each propert&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//var ais_search_source = new GlideRecord(table)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; instanceLink &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;instance_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
instanceLink &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.service-now.com/&#39;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; table &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; jsonRecord&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; recordObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; jsonRecord&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; record &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; field &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; recordObj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; recordObj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;// try to get the value;&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;// if the object has content set it to that;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                recordObj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; recordObj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;//gs.print(field + &#39;&#92;n&#39; + JSON.stringify(recordObj[field], null, 2))&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//gs.print(field + &#39;: &#39; + recordObj[field])&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            sys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; recordObj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            record&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setNewGuidValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;recordObj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            record&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; recordObj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// look if record exists;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; checkRecord &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; exists &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; checkRecord&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;exists&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;exists!!!&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        record&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; metaDataRecord &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_metadata&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        metaDataRecord&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setLimit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        metaDataRecord&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sys_update_name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; deleted &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; metaDataRecord&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;deleteRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        record&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setWorkflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        record&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;autoSysFields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; created &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; record&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;created&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;instanceLink &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; record&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getLink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This script takes the XML representation of a deleted record, converts it to JSON, and then recreates the record in the specified table using GlideRecord. It first checks if the record already exists to avoid duplicates. If the record does not exist, it removes any metadata associated with the deleted record and inserts the new record into the database.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Kevin Clark created Service Portal Redirector</title>
      <link href="https://jace.pro/blog/kevin-clark-created-service-portal-redirector/" />
      <updated>2025-10-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/kevin-clark-created-service-portal-redirector/</id>
      <content type="html">
				&lt;p&gt;Sometimes you need to redirect users to an appropriate Service Portal based on various conditions. For example, you might want to redirect users based on their role, department, or location.&lt;/p&gt;&lt;p&gt;This usually requires dealing with ui scripts, the SPEntry script, and possibly other components. To simplify this process, Kevin Clark created the &lt;a href=&quot;https://github.com/milligna/sn-portal-redirector&quot; rel=&quot;noopener&quot;&gt;Service Portal Redirector&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I haven’t used it, however it’s a tool and the developer is solid. If you need to implement dynamic redirects in Service Portal, it’s worth checking out.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>WIP Guide to URL Parameters in ServiceNow</title>
      <link href="https://jace.pro/blog/wip-guide-to-url-parameters-in-servicenow/" />
      <updated>2025-10-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/wip-guide-to-url-parameters-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;I realized when I was looking for the “do not add url to history” param that I didn’t have a good list of URL parameters for ServiceNow. So I started compiling one here. This is a work in progress. If you have any to add, please let me know.&lt;/p&gt;&lt;h2 id=&quot;stop-redirections&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/wip-guide-to-url-parameters-in-servicenow/#stop-redirections&quot; class=&quot;heading-anchor&quot;&gt;Stop redirections&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;sysparm_view=manage_security&lt;/code&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Add sysparm_view=manage_security to stop being navigated away. That’ll let you see the form and XML. If you want to see the default form view, you’ll need to fiddle with the sys_navigator record - Kieran Anson&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;do-not-add-url-to-history&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/wip-guide-to-url-parameters-in-servicenow/#do-not-add-url-to-history&quot; class=&quot;heading-anchor&quot;&gt;Do not add url to history&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;sysparm_nostack=true&lt;/code&gt;&lt;/p&gt;&lt;p&gt;This appears to stop adding the current url to the history stack. There’s a post from 2012 where &lt;a href=&quot;https://www.servicenow.com/community/developer-forum/how-do-you-prevent-a-form-from-adding-itself-to-the-navigation/m-p/1830653&quot; rel=&quot;noopener&quot;&gt;Mark Stanger suggests this can solve an issue William Hazelrig was having about this&lt;/a&gt;. This is still used with Legacy Studio to prevent adding itself to the history stack.&lt;/p&gt;&lt;h2 id=&quot;open-a-blank-form&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/wip-guide-to-url-parameters-in-servicenow/#open-a-blank-form&quot; class=&quot;heading-anchor&quot;&gt;Open a blank form&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;sysparm_sys_id=-1&lt;/code&gt;&lt;/p&gt;&lt;p&gt;This opens a new blank form for the table specified in the URL. For example:&lt;br&gt;&lt;code&gt;https://instance.service-now.com/nav_to.do?uri=%2Fincident.do%3Fsys_id%3D-1&lt;/code&gt;&lt;br&gt;will open a new blank incident form.&lt;/p&gt;&lt;h2 id=&quot;open-a-form-in-a-specific-view&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/wip-guide-to-url-parameters-in-servicenow/#open-a-form-in-a-specific-view&quot; class=&quot;heading-anchor&quot;&gt;Open a form in a specific view&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;sysparm_view=view_name&lt;/code&gt;&lt;br&gt;This opens the form in the specified view. For example:&lt;br&gt;&lt;code&gt;https://instance.service-now.com/nav_to.do?uri=%2Fincident.do%3Fsys_id%3Dsome_sys_id%26sysparm_view%3Dmy_custom_view&lt;/code&gt;&lt;br&gt;will open the incident form in the “my_custom_view” view.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Do you need a CI and not the matched Asset?  Enter skip_sync</title>
      <link href="https://jace.pro/blog/do-you-need-a-ci-and-not-the-matched-asset-enter-skip_sync/" />
      <updated>2025-10-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/do-you-need-a-ci-and-not-the-matched-asset-enter-skip_sync/</id>
      <content type="html">
				&lt;p&gt;A few years ago I was digging into how Assets and CIs interact on ServiceNow. I came across this article that explains the &lt;code&gt;skip_sync&lt;/code&gt; field on Asset or CI records.&lt;br&gt;&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0743665&quot; rel=&quot;noopener&quot;&gt;What is the skip_sync field on Asset or CI record - Support and Troubleshooting (servicenow.com)&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;What is the skip_sync field on Asset or CI record&lt;/p&gt;&lt;h3 id=&quot;issue&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/do-you-need-a-ci-and-not-the-matched-asset-enter-skip_sync/#issue&quot; class=&quot;heading-anchor&quot;&gt;Issue&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;For the latest information on this topic, see Configuration Item [cmdb_ci] class.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;skip_sync&lt;/code&gt; field not only exists on assets but also on the CMDB table. It is the flag indicating whether synchronization between Asset and CMDB can be skipped.&lt;/p&gt;&lt;p&gt;There are OOB script includes and business rules that may invoke according to functions and change the value of &lt;code&gt;skip_sync&lt;/code&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;AssetAndCISynchronizer: /nav_to.do?uri=sys_script_include.do?sys_id=9ec37b411b012000e49bfbcd2c071380&lt;br&gt;Update Asset fields on change: /nav_to.do?uri=sys_script.do?sys_id=31e93aaf1b3210002502fbcd2c0713d8&lt;br&gt;Update CI fields on change /nav_to.do?uri=sys_script.do?sys_id=4d15855c1b0310002502fbcd2c071399&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The &lt;code&gt;skip_sync&lt;/code&gt; flag is used to prevent recursion within the same cycle of business rules and will be reset in the next cycle during Asset-CI synchronization. The &lt;code&gt;skip_sync&lt;/code&gt; flag is set to false by default.&lt;/p&gt;&lt;p&gt;As the two business rules above would be triggered twice during an Asset-CI synchronization. The &lt;code&gt;skip_sync&lt;/code&gt; flag would be set to false again after the synchronization. In case the &lt;code&gt;skip_sync&lt;/code&gt; flag was set to true for some reason, an update on the Asset/CI should help set the flag back to false.&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>What is an ACL</title>
      <link href="https://jace.pro/blog/what-is-an-acl/" />
      <updated>2025-10-22T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-an-acl/</id>
      <content type="html">
				&lt;p&gt;Access Controls (or also known as Access Control Lists - ACLs) are a way to define who can see what within a system.&lt;/p&gt;&lt;p&gt;In ServiceNow, ACLs have always been part of the platform.&lt;/p&gt;&lt;p&gt;Access controls apply the most finely grained rule and then if none apply, it gets more vague rules until it finds one that applies. If none apply, access is denied.&lt;/p&gt;&lt;p&gt;You can have ACLs on many different things:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Table level &lt;em&gt;most common&lt;/em&gt; - controls access to the entire table&lt;/li&gt;&lt;li&gt;Field level &lt;em&gt;most common&lt;/em&gt; - controls access to specific fields within a table&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;ServiceNow Access Control Lists (ACLs) are a set of rules that define which users and groups have access to specific records, fields, and other objects within ServiceNow. ACLs allow organizations to grant or restrict access to different roles within ServiceNow, ensuring that only authorized personnel can access sensitive information. They are used to control which users can see, view, modify, or delete items in the system.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>SkyGiraffe and the Rise of Mobile-First Work: A Builder’s Reflection</title>
      <link href="https://jace.pro/blog/skygiraffe-and-the-rise-of-mobile-first-work-a-builders-reflection/" />
      <updated>2025-06-23T00:00:00Z</updated>
      <id>https://jace.pro/blog/skygiraffe-and-the-rise-of-mobile-first-work-a-builders-reflection/</id>
      <content type="html">
				&lt;p&gt;&lt;em&gt;This is part of a series I’m writing to inspire myself and other builders by shining a light on companies that ServiceNow has acquired. If you’re dreaming of building something yourself, these stories aren’t just history, they’re playbooks with lessons we can learn.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Today, we look at &lt;strong&gt;SkyGiraffe&lt;/strong&gt;, a company that took on a challenge nearly every enterprise faces, and did it with clarity, conviction, and craft.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;the-mobile-work-problem-no-one-was-solving-well&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/skygiraffe-and-the-rise-of-mobile-first-work-a-builders-reflection/#the-mobile-work-problem-no-one-was-solving-well&quot; class=&quot;heading-anchor&quot;&gt;The Mobile Work Problem No One Was Solving (Well)&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In 2012, nearly everyone still worked from the desktop. I remember ServiceNow telling folks “use safari on the iPhone”. Eventually they came around and set up what is now known as the “Classic Mobile” application. Here’s a link I can find referencing wiki page on &lt;a href=&quot;https://web.archive.org/web/20110216203148/http://wiki.service-now.com/index.php?title=Mobile_Device_ITIL_and_Service_Management_Plugin&amp;amp;_bhlid=d104b280f784a74361d8118421eb0e0a04498362#Notes_and_Limitations&quot; rel=&quot;noopener&quot;&gt;ServiceNow’s Mobile docs&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;SkyGiraffe saw this gap. Their insight was simple but powerful: &lt;strong&gt;employees needed real, secure access to business data on the go&lt;/strong&gt;, without the traditional overhead of building mobile apps from scratch.&lt;/p&gt;&lt;p&gt;They didn’t just want to make mobile access easier, they wanted to make it fast, scalable, and native. For everyone.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;the-founders-behind-the-vision&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/skygiraffe-and-the-rise-of-mobile-first-work-a-builders-reflection/#the-founders-behind-the-vision&quot; class=&quot;heading-anchor&quot;&gt;The Founders Behind the Vision&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;SkyGiraffe was born from the experience and vision of &lt;a href=&quot;https://www.linkedin.com/in/boazhecht&quot; rel=&quot;noopener&quot;&gt;Boaz Hecht&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/in/itay-braun&quot; rel=&quot;noopener&quot;&gt;Itay Braun&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Boaz brought a rare combination of entrepreneurial grit (from his time leading ClubSMS and SRL Group) and consulting insight from Deloitte. His later role as VP of Platform at ServiceNow reflected his product-first mindset and belief in removing friction for users.&lt;/p&gt;&lt;p&gt;Itay came from a deeply technical background, including roles at Microsoft and startup leadership at TWINGO. He was a teacher, an architect, and a builder, equally comfortable in a data stack as he was explaining SQL to a room of learners.&lt;/p&gt;&lt;p&gt;Together, they formed a team that understood both the pain of enterprise software and the elegance needed to solve it.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;what-skygiraffe-built-and-why-it-worked&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/skygiraffe-and-the-rise-of-mobile-first-work-a-builders-reflection/#what-skygiraffe-built-and-why-it-worked&quot; class=&quot;heading-anchor&quot;&gt;What SkyGiraffe Built (and Why It Worked)&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;SkyGiraffe offered a no-code platform for delivering mobile apps that could tap into existing enterprise systems, Oracle, SAP, SQL, cloud, on-prem, you name it.&lt;/p&gt;&lt;p&gt;Using a “meta-data architecture,” their platform auto-generated mobile applications directly from enterprise data structures and workflows. These apps worked natively on iOS and Android, supported offline access, and came with built-in capabilities like maps, contacts, notifications, and more.&lt;/p&gt;&lt;p&gt;No front-end coding. No heavy scripting. Just point, connect, and deploy.&lt;/p&gt;&lt;p&gt;In other words, &lt;strong&gt;they abstracted away the hardest parts of mobile enterprise development&lt;/strong&gt;, and gave companies a way to build hundreds of apps quickly, securely, and beautifully.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;the-acquisition-october-2017&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/skygiraffe-and-the-rise-of-mobile-first-work-a-builders-reflection/#the-acquisition-october-2017&quot; class=&quot;heading-anchor&quot;&gt;The Acquisition: October 2017&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow acquired SkyGiraffe in October 2017. The move was part of a broader mobile-first push, following its acquisition of the design firm Telepathy just weeks earlier.&lt;/p&gt;&lt;p&gt;By integrating SkyGiraffe’s tech into the Now Platform, ServiceNow aimed to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Enable native mobile versions of every packaged app, starting with ITSM&lt;/li&gt;&lt;li&gt;Let customers build apps in days, not months&lt;/li&gt;&lt;li&gt;Offer offline support and native mobile experiences with zero code&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As CJ Desai, ServiceNow’s Chief Product Officer, put it: “Our work lives should be as mobile-friendly as our consumer lives.”&lt;/p&gt;&lt;p&gt;SkyGiraffe helped make that possible.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;what-lives-on-today&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/skygiraffe-and-the-rise-of-mobile-first-work-a-builders-reflection/#what-lives-on-today&quot; class=&quot;heading-anchor&quot;&gt;What Lives On Today&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;While the SkyGiraffe name may no longer be on a website, its DNA lives on.&lt;/p&gt;&lt;p&gt;ServiceNow’s &lt;strong&gt;Mobile App Builder&lt;/strong&gt;, &lt;strong&gt;Mobile Studio&lt;/strong&gt;, and &lt;strong&gt;native mobile capabilities&lt;/strong&gt; owe much to SkyGiraffe’s foundations. The speed, flexibility, and ease of delivering mobile experiences are now part of what people expect from the Now Platform, and SkyGiraffe was a huge leap forward in that direction.&lt;/p&gt;&lt;p&gt;Many of the team members, Boaz, Itay, Yev, played key roles in shaping ServiceNow’s mobile strategy during their time there.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;what-they-are-up-to-now&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/skygiraffe-and-the-rise-of-mobile-first-work-a-builders-reflection/#what-they-are-up-to-now&quot; class=&quot;heading-anchor&quot;&gt;What they are up to now?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Today Boaz Hecht together with two of the original SkyGiraffe team, &lt;a href=&quot;https://www.linkedin.com/in/josh-russ-4568307a/&quot; rel=&quot;noopener&quot;&gt;Josh Russ&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://www.linkedin.com/in/yevgeniygoldin/&quot; rel=&quot;noopener&quot;&gt;Yev Goldin&lt;/a&gt; joined forces start &lt;a href=&quot;https://www.8flow.ai/&quot; rel=&quot;noopener&quot;&gt;8Flow.ai&lt;/a&gt;, proof that great teams often stick together and keep building.&lt;/p&gt;&lt;p&gt;Itay Braun has since co-founded &lt;a href=&quot;https://www.dynatrace.com/news/blog/dynatrace-metis-helping-developers-sres-solve-database-issues-with-ai/?_bhlid=5ee891e15c8f6e1499e12a25a5473babc4bbb988&quot; rel=&quot;noopener&quot;&gt;Metis which was just acquired in March of 2025&lt;/a&gt; by Dynatrace. Metis, “Enabling developers to own their Database”. They enabled development teams to proactively take a preventative and holistic approach to database code&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;what-modern-builders-can-learn&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/skygiraffe-and-the-rise-of-mobile-first-work-a-builders-reflection/#what-modern-builders-can-learn&quot; class=&quot;heading-anchor&quot;&gt;What Modern Builders Can Learn&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Solve a real pain with elegance.&lt;br&gt;SkyGiraffe succeeded because they saw a painful problem (mobile access to enterprise data) and solved it simply, without compromising on enterprise-grade quality.&lt;/li&gt;&lt;li&gt;Your architecture matters.&lt;br&gt;Their meta-data-driven approach didn’t just work, it scaled. Good architecture creates leverage and makes your product 10x more valuable in the right hands.&lt;/li&gt;&lt;li&gt;Design for the future, not the past.&lt;br&gt;While others were focused on making legacy systems work a little better, SkyGiraffe designed for the mobile world that was coming. That’s what made them acquisition-worthy.&lt;/li&gt;&lt;/ol&gt;&lt;hr&gt;&lt;h2 id=&quot;final-thought&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/skygiraffe-and-the-rise-of-mobile-first-work-a-builders-reflection/#final-thought&quot; class=&quot;heading-anchor&quot;&gt;Final Thought&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Acquisitions like SkyGiraffe aren’t just footnotes in a company’s history. They’re inflection points. They remind us that bold ideas, when paired with thoughtful execution, can shape the direction of entire platforms.&lt;/p&gt;&lt;p&gt;To all the builders out there: keep solving real problems. You never know where the next good idea might take you.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>ServiceNow’s Acquisition of Qlue </title>
      <link href="https://jace.pro/blog/servicenows-acquisition-of-qlue/" />
      <updated>2025-06-02T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenows-acquisition-of-qlue/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;The Spark in the Conversation: What We Can Learn from ServiceNow’s Acquisition of Qlue&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;By a Builder, For Builders – A Series on What Past ServiceNow Acquisitions Teach Us About Innovation&lt;/em&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;In the spring of 2017, ServiceNow quietly made a move that would later become foundational to its journey into AI-powered service experiences: it acquired a small startup called &lt;strong&gt;Qlue&lt;/strong&gt; for $6.6 million.&lt;/p&gt;&lt;p&gt;To many, this may have looked like a footnote. But for those of us who build things, especially in the enterprise space, it was anything but.&lt;/p&gt;&lt;p&gt;Qlue didn’t just build bots. It built conversations. And more than that, it built the idea that those conversations, once trapped in static FAQs, clunky portals, and long wait times, could finally flow.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;why-qlue-mattered&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenows-acquisition-of-qlue/#why-qlue-mattered&quot; class=&quot;heading-anchor&quot;&gt;Why Qlue Mattered&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Founded by &lt;a href=&quot;https://www.linkedin.com/in/hasangrizvi/?_bhlid=1f77e26e1c44eed8b0fcc31dae412908782e914d&quot; rel=&quot;noopener&quot;&gt;Hasan Rizvi&lt;/a&gt; (a veteran from Oracle with a deep well of enterprise software experience) and &lt;a href=&quot;https://www.linkedin.com/in/rahim-yaseen-ba66a9/?_bhlid=6427b3ee58b74db9afbc7a3a8189f6c00df2ebf1&quot; rel=&quot;noopener&quot;&gt;Rahim Yaseen&lt;/a&gt; (who’d helped architect platforms at Oracle, SAP, and Couchbase), Qlue was born in 2014 out of a clear, growing frustration: why did enterprise software feel so impersonal, so transactional, so… slow?&lt;/p&gt;&lt;p&gt;In an era where consumers were already chatting with Siri and Alexa, enterprise users were still submitting tickets like it was 1999.&lt;/p&gt;&lt;p&gt;Qlue set out to change that by building &lt;strong&gt;AI-powered virtual agents&lt;/strong&gt; for the enterprise. Bots that didn’t just respond with static answers, but could hold conversations, ask clarifying questions, route users intelligently, and get work done. Think: asking HR about your parental leave policy, checking your order status with customer service, or diagnosing an IT issue, without ever opening a ticket.&lt;/p&gt;&lt;p&gt;They weren’t building novelty. They were building &lt;strong&gt;relief&lt;/strong&gt;, at scale.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;the-builders-behind-it&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenows-acquisition-of-qlue/#the-builders-behind-it&quot; class=&quot;heading-anchor&quot;&gt;The Builders Behind It&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;What makes Qlue even more interesting to reflect on today is the caliber of builders it brought together. These weren’t first-timers. Hasan Rizvi had scaled major technology groups at Oracle. Rahim Yaseen had crisscrossed the enterprise stack from Siebel to Couchbase. &lt;a href=&quot;https://www.linkedin.com/in/mfortson/?_bhlid=fd0bb12fbb3b16caeae48987f9dbd3e892b7e256&quot; rel=&quot;noopener&quot;&gt;Michael Fortson-Dillon&lt;/a&gt;, Qlue’s Director of Mobile, would go on to lead major product efforts at ServiceNow post-acquisition. &lt;a href=&quot;https://www.linkedin.com/in/amit-jasuja-60b573/details/experience/?_bhlid=03defc4d15233d381e856440ff1f6ea2832aeda7&quot; rel=&quot;noopener&quot;&gt;Amit Jusuja&lt;/a&gt;, who helped operationalize Qlue, had shaped Java and IoT platforms. And &lt;a href=&quot;https://www.linkedin.com/in/kenlaversin/details/experience/?_bhlid=686fd972a7aa207565c7d752ccb5605d76ee028f&quot; rel=&quot;noopener&quot;&gt;Ken Laversin&lt;/a&gt;, Qlue’s sales advisor, later led GTM at AI unicorns like &lt;a href=&quot;http://C3.ai&quot; rel=&quot;noopener&quot;&gt;C3.ai&lt;/a&gt; and Skyflow.&lt;/p&gt;&lt;p&gt;This wasn’t a random crew; it was a &lt;strong&gt;dream team of seasoned enterprise technologists&lt;/strong&gt; who saw the future before it arrived.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;the-acquisition-that-planted-seeds&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenows-acquisition-of-qlue/#the-acquisition-that-planted-seeds&quot; class=&quot;heading-anchor&quot;&gt;The Acquisition That Planted Seeds&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow wasn’t looking for flash. It was looking for &lt;strong&gt;fit&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Qlue’s tech would become the bedrock for &lt;strong&gt;ServiceNow’s Virtual Agent&lt;/strong&gt;, integrated into IT, HR, Customer Service, and more. What started as a way to answer common questions turned into a multi-billion-dollar category of AI-driven workflows, accelerated by real conversations between humans and machines.&lt;/p&gt;&lt;p&gt;Even more importantly, the Qlue acquisition represented a strategic thesis that’s shaped every AI initiative since: &lt;strong&gt;automation is only powerful when it feels human&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;This wasn’t just about reducing ticket volumes. It was about reimagining what it felt like to get help at work.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;lessons-for-builders&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenows-acquisition-of-qlue/#lessons-for-builders&quot; class=&quot;heading-anchor&quot;&gt;Lessons for Builders&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Reflecting on Qlue today, several lessons emerge, especially for those of us building the next generation of tools in AI, enterprise, and beyond:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Start with the pain, not the tech.&lt;/strong&gt; Qlue wasn’t chasing a chatbot trend. It was solving a clear, high-friction pain: enterprise interactions were slow and impersonal. It didn’t build for buzzwords, it built for needs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Bet on small, sharp teams.&lt;/strong&gt; For all the headlines about mega-acquisitions, it’s often the nimble, focused teams that reshape platforms. Qlue had the right mix of experience and humility to plug into a larger vision.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Human-centered AI wins.&lt;/strong&gt; Qlue succeeded not because it was the smartest AI, but because it was the most empathetic. It understood that in the enterprise, clarity and speed are forms of respect.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The right acquirer matters.&lt;/strong&gt; ServiceNow didn’t just buy Qlue and bury it. It amplified it. It gave Qlue’s ideas a canvas, one that reached tens of millions of users.&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;h2 id=&quot;final-thought&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenows-acquisition-of-qlue/#final-thought&quot; class=&quot;heading-anchor&quot;&gt;Final Thought&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Every builder dreams of creating something lasting. Qlue didn’t become a household name, but it did become a foundational layer in a platform that millions now depend on to get work done faster.&lt;/p&gt;&lt;p&gt;And that’s a kind of legacy worth chasing, not for the headlines, but for the users quietly saying thank you every time the chatbot just works.&lt;/p&gt;&lt;p&gt;So here’s to the quiet revolutions, the little startups with big hearts, and to the builders bold enough to see the future not as a pitch deck, but as a conversation worth having.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Predicting the Future: The DxContinuum Story </title>
      <link href="https://jace.pro/blog/predicting-the-future-the-dxcontinuum-story/" />
      <updated>2025-05-19T00:00:00Z</updated>
      <id>https://jace.pro/blog/predicting-the-future-the-dxcontinuum-story/</id>
      <content type="html">
				&lt;p&gt;&lt;em&gt;This is part of a series I’m writing to inspire myself and other builders by shining a light on companies that ServiceNow has acquired. If you’re dreaming of building something yourself, these stories aren’t just history, they’re playbooks with lessons we can learn.&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;a-glimpse-into-dxcontinuum&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/predicting-the-future-the-dxcontinuum-story/#a-glimpse-into-dxcontinuum&quot; class=&quot;heading-anchor&quot;&gt;A Glimpse into DxContinuum&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Founded in the heart of Silicon Valley, DxContinuum set out to make machine learning practical for enterprise teams long before “AI” became table stakes. Their flagship product, Fathom, used predictive modeling to classify and route business requests, transforming what was once a noisy, manual workflow into a smarter, faster, data-driven engine.&lt;/p&gt;&lt;p&gt;Their focus wasn’t on generic AI, it was purpose-built for line-of-business outcomes, like improving sales pipelines and automating IT and HR workflows. And it didn’t just work in a lab; it proved its value on platforms like Salesforce.&lt;/p&gt;&lt;p&gt;When ServiceNow acquired DxContinuum in January 2017, it wasn’t just a tech pickup, it was a signal. A signal that intelligent automation was no longer a nice-to-have, but the next chapter of enterprise workflow.&lt;/p&gt;&lt;h2 id=&quot;meet-the-founders&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/predicting-the-future-the-dxcontinuum-story/#meet-the-founders&quot; class=&quot;heading-anchor&quot;&gt;Meet the Founders&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;At the core of DxContinuum’s success was a founding team with deep roots in data, enterprise platforms, and predictive modeling.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/debuchatterjee/?_bhlid=35438b52816783c8b63e8c9aba931ded07f0c1f0&quot; rel=&quot;noopener&quot;&gt;Debu Chatterjee&lt;/a&gt;, the founder and CEO, brought decades of experience from Oracle, Informatica, and FICO. His passion for structured data and predictive outcomes culminated in the patented Fathom engine and eventually shaped ServiceNow’s AI roadmap as its founding Head of AI.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/baskarjayaraman/?_bhlid=4a12e5d2503d9a1ea15c0d410b54bb0c87994a5e&quot; rel=&quot;noopener&quot;&gt;Baskar Jayaraman&lt;/a&gt;, CTO and co-founder, merged hard science with practical application, developing early AI systems for health insurance at FICO and sales optimization tools for TrueDemand. At ServiceNow, he continued to lead in the AI/ML space before founding his next venture, Konfer.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/govindarajankannan/?_bhlid=d5440673036bf660b55de00db8d72d5cf84aa551&quot; rel=&quot;noopener&quot;&gt;Kannan Govindarajan&lt;/a&gt;, VP of Product, had a long track record at Oracle and HP, where he led architecture and strategy. At DxContinuum, he helped refine the product vision and, later at ServiceNow, scaled that vision across multiple AI initiatives.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This wasn’t a hype team. It was a high signal, low noise group of builders, working at the intersection of AI and enterprise utility.&lt;/p&gt;&lt;h2 id=&quot;what-the-product-did&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/predicting-the-future-the-dxcontinuum-story/#what-the-product-did&quot; class=&quot;heading-anchor&quot;&gt;What the Product Did&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;DxContinuum’s core offering, Fathom, used machine learning to anticipate outcomes. It could predict which sales leads would convert, route service requests with precision, and assign IT tickets to the right teams—automatically.&lt;/p&gt;&lt;p&gt;What made it special was its instance-specific modeling. Instead of building a single model across multiple companies (like many SaaS AI solutions at the time), Fathom trained custom models on each customer’s data. That meant better accuracy, less noise, and models that could learn your business, not someone else’s.&lt;/p&gt;&lt;p&gt;The goal was always the same: put intelligence into the workflow without asking users to change behavior. In a way, it made the enterprise feel more like consumer tech—smart, invisible, and always learning.&lt;/p&gt;&lt;h2 id=&quot;the-acquisition&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/predicting-the-future-the-dxcontinuum-story/#the-acquisition&quot; class=&quot;heading-anchor&quot;&gt;The Acquisition&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;On January 18, 2017, ServiceNow announced it was acquiring DxContinuum in an all-cash deal. The plan was clear: embed Fathom’s predictive models into the Now Platform to supercharge intelligent routing, categorization, and decision-making across IT, HR, CSM, and beyond.&lt;/p&gt;&lt;p&gt;This wasn’t just about AI for AI’s sake, it was about making workflows frictionless. The acquisition directly supported ServiceNow’s vision of moving work from people to machines, allowing employees to focus on high-value tasks while the platform handled the rest.&lt;/p&gt;&lt;p&gt;It also marked a shift toward platform-native intelligence. Rather than bolting on AI, ServiceNow was baking it in, starting with the DNA from DxContinuum.&lt;/p&gt;&lt;h2 id=&quot;where-it-stands-today&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/predicting-the-future-the-dxcontinuum-story/#where-it-stands-today&quot; class=&quot;heading-anchor&quot;&gt;Where It Stands Today&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;DxContinuum’s legacy lives on in what became Predictive Intelligence within the ServiceNow ecosystem. By 2018, features like ticket categorization, assignment suggestions, and risk scoring were quietly transforming workflows behind the scenes.&lt;/p&gt;&lt;p&gt;Today, Predictive Intelligence powers AI-driven suggestions across modules. The same philosophy—instance-specific models trained on customer data, still guides how ServiceNow delivers machine learning features.&lt;/p&gt;&lt;p&gt;And many of the original DxContinuum team stayed on to scale those ideas further before moving on to build again. Their fingerprints are still visible across ServiceNow’s AI stack, and even in the startup ecosystem through companies like Konfer and ThetaRho.&lt;/p&gt;&lt;h2 id=&quot;what-im-taking-from-this&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/predicting-the-future-the-dxcontinuum-story/#what-im-taking-from-this&quot; class=&quot;heading-anchor&quot;&gt;What I’m Taking From This&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Solve real workflow pain, not just cool tech.&lt;br&gt;DxContinuum didn’t pitch “AI.” They solved routing, triage, and pipeline prediction. Every use case was grounded in how work actually happens.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Bake intelligence into the process.&lt;br&gt;The genius of their product was invisibility. Users didn’t need to think about the model, it just worked. That’s the kind of UX that wins in the enterprise.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Don’t chase general models—build for the instance.&lt;br&gt;DxContinuum’s insistence on customer-specific models made their predictions more accurate, more useful, and more trustworthy. It’s a model worth stealing.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;sources&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/predicting-the-future-the-dxcontinuum-story/#sources&quot; class=&quot;heading-anchor&quot;&gt;Sources&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Mike Kaufman - &lt;a href=&quot;https://www.servicenowelite.com/blog/2017/1/19/servicenow-acquires-dxcontinuum&quot; rel=&quot;noopener&quot;&gt;https://www.servicenowelite.com/blog/2017/1/19/servicenow-acquires-dxcontinuum&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Press Release - &lt;a href=&quot;https://www.servicenow.com/company/media/press-room/servicenow-acquires-dxcontinuum.html&quot; rel=&quot;noopener&quot;&gt;https://www.servicenow.com/company/media/press-room/servicenow-acquires-dxcontinuum.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>BrightPoint Security: Automating Trust for the Enterprise</title>
      <link href="https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/" />
      <updated>2025-05-12T00:00:00Z</updated>
      <id>https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/</id>
      <content type="html">
				&lt;p&gt;&lt;em&gt;This is part of a series I’m writing to help remind myself (and anyone else building) that it’s possible. These aren’t just stories about companies ServiceNow bought. They’re reminders that someone out there built something worth acquiring.&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;the-origin-of-brightpoint-security&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/#the-origin-of-brightpoint-security&quot; class=&quot;heading-anchor&quot;&gt;The Origin of BrightPoint Security&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;BrightPoint Security started out in the early 2010s under the name Vorstack. Back then, enterprise security teams were buried in threat data, and “sharing” usually meant either oversharing or not sharing at all. BrightPoint showed up with a smarter idea: help organizations securely share and act on threat intel, without giving up control.&lt;/p&gt;&lt;p&gt;By 2016, they had sharpened their message and positioned themselves as a real player in threat intelligence:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“BrightPoint Security delivers actionable threat intelligence by reducing the noise inherent in threat data and enabling secure and controlled information sharing. The automated curation and correlation of threat data from external sources, behind your perimeter defenses, and behind the defenses of trusted organizations enables you to identify relevant threats in minutes instead of months.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;That’s not just filtering spammy alerts, that’s reducing months of work into minutes.&lt;/p&gt;&lt;h2 id=&quot;the-team-behind-the-vision&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/#the-team-behind-the-vision&quot; class=&quot;heading-anchor&quot;&gt;The Team Behind the Vision&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;These folks weren’t just punching above their weight—they knew what they were doing:&lt;/p&gt;&lt;p&gt;Andreas Haugsnes – Co-founder and technical lead. Started in engineering, worked in security at Zynga and LiveOps, and kept going post-BrightPoint at Unity. The guy knows his way around real-time threat systems.&lt;/p&gt;&lt;p&gt;Joe Eandi – Co-founder, initial CEO. Law background. Worked in early exec roles at Mojam and Inktomi. He helped get BrightPoint off the ground and into acquisition territory. Went on to co-found Cyber Mentor Fund.&lt;/p&gt;&lt;p&gt;Ravi Iyer – SVP of Products. Led product across big names like Sun, Nokia, and Good Tech. Post-BrightPoint, he landed exec roles at Splunk, Ivanti, Cybereason, and Veracode.&lt;/p&gt;&lt;p&gt;Scott Lewis – VP of Product. Assisted in the development of the product roadmap, joined ServiceNow after the acquisition and was responsible for the re-platforming into ServiceNow.&lt;/p&gt;&lt;p&gt;Rich Reybok – CTO at the time of the acquisition. Came from Redzone Security, Merrill Lynch, and Asurion. He joined ServiceNow after the acquisition and now runs software engineering there.&lt;/p&gt;&lt;p&gt;Anne Bonaparte – Took over as CEO during BrightPoint’s growth stage. Had already been CEO of a few successful exits: MailFrontier, Tablus, Solidcore, Xora. She’s a go-to operator for getting companies across the finish line. I was so amazed by Anne’s history I spent all week thinking about it.&lt;/p&gt;&lt;h2 id=&quot;3-what-brightpoint-built&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/#3-what-brightpoint-built&quot; class=&quot;heading-anchor&quot;&gt;3. What BrightPoint Built&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Their product was called Sentinel. It let organizations automate how they shared and correlated threat intel, internally and externally. It wasn’t just pulling in feeds and calling it a day. It was about real-time collaboration with trust boundaries in place.&lt;/p&gt;&lt;p&gt;This meant faster detection, stronger signals, and fewer blind spots. It gave teams the ability to share what mattered and act on it with context.&lt;/p&gt;&lt;p&gt;It looked more like a trust network than a feed parser. That was the difference.&lt;/p&gt;&lt;h2 id=&quot;the-acquisition-by-servicenow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/#the-acquisition-by-servicenow&quot; class=&quot;heading-anchor&quot;&gt;The Acquisition by ServiceNow&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow picked up BrightPoint in an all-cash deal around May 2016. The price wasn’t disclosed, but it came just a month after they acquired ITapp. This was during a time when ServiceNow was just getting serious about security operations.&lt;/p&gt;&lt;p&gt;The deal gave ServiceNow instant credibility in threat intel automation. BrightPoint’s tooling slotted in to help accelerate the Security Operations suite, especially around detection and response.&lt;/p&gt;&lt;p&gt;They also had connections with RSA and IBM, and had raised around $8.4M. That kind of backing made it clear this wasn’t a fluke.&lt;/p&gt;&lt;h2 id=&quot;where-it-stands-today&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/#where-it-stands-today&quot; class=&quot;heading-anchor&quot;&gt;Where It Stands Today&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You won’t find the BrightPoint name anywhere now, but its DNA is all over ServiceNow’s security products. The core tech lives on in Security Incident Response and Threat Intelligence.&lt;/p&gt;&lt;p&gt;These apps help teams triage faster, connect data points, and automate what used to take hours or days. BrightPoint brought the “intel” into what used to be just a ticketing workflow.&lt;/p&gt;&lt;h2 id=&quot;lessons-and-takeaways&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/#lessons-and-takeaways&quot; class=&quot;heading-anchor&quot;&gt;Lessons &amp;amp; Takeaways&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;noise-reduction-=-value&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/#noise-reduction-=-value&quot; class=&quot;heading-anchor&quot;&gt;Noise Reduction = Value&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;BrightPoint didn’t invent threat intel. They just made it actually useful. They cut through the noise, and that made all the difference.&lt;/p&gt;&lt;h3 id=&quot;security-doesnt-have-to-be-a-solo-sport&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/#security-doesnt-have-to-be-a-solo-sport&quot; class=&quot;heading-anchor&quot;&gt;Security Doesn’t Have to Be a Solo Sport&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;They built tools for collaboration. Shared defense. That was rare at the time, and it stood out.&lt;/p&gt;&lt;h3 id=&quot;an-exit-isnt-the-end&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/#an-exit-isnt-the-end&quot; class=&quot;heading-anchor&quot;&gt;An Exit Isn’t the End&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Getting acquired wasn’t the finish line. It gave BrightPoint’s team a bigger platform, and gave ServiceNow a boost into a new product area.&lt;/p&gt;&lt;h2 id=&quot;sources&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/brightpoint-security-automating-trust-for-the-enterprise/#sources&quot; class=&quot;heading-anchor&quot;&gt;Sources&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://brightpointsecurity.com&quot; rel=&quot;noopener&quot;&gt;brightpointsecurity.com&lt;/a&gt; (&lt;a href=&quot;https://web.archive.org/web/20160330214804/https://www.brightpointsecurity.com/?_bhlid=3cf004507fa2525c90829ee56a495ae8f355533d&quot; rel=&quot;noopener&quot;&gt;archived&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;ServiceNow acquisition announcement (&lt;a href=&quot;https://fortune.com/2016/06/01/servicenow-security-software-brightpoint/?_bhlid=aa6d4cd2e62990674a57043630fd3b16910721e7&quot; rel=&quot;noopener&quot;&gt;via Fortune&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Calling Server Side Script includes from UIB Client Scripts</title>
      <link href="https://jace.pro/blog/calling-server-side-script-includes-from-uib-client-scripts/" />
      <updated>2025-05-11T00:00:00Z</updated>
      <id>https://jace.pro/blog/calling-server-side-script-includes-from-uib-client-scripts/</id>
      <content type="html">
				&lt;p&gt;This could be improved a lot.&lt;/p&gt;&lt;p&gt;Let’s first talk about how this is working for me.&lt;/p&gt;&lt;p&gt;Everything I read to do this either says make a rest call or use the “new transform data resource”. When trying the data resource it never seemed to run the script include. So I went with rest. I’m sure I missed something I’ll be asking Tomas about this.&lt;/p&gt;&lt;p&gt;My working steps.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Find or Create a Script Include&lt;/li&gt;&lt;li&gt;Create a REST Endpoint that calls your Script Include&lt;/li&gt;&lt;li&gt;Create a Client script using the helpers and snHttp method to call said REST endpoint&lt;/li&gt;&lt;li&gt;Profit&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;helper has a method called snHttp, which by default batches your request up (you can set an option of batch to false to stop that.)&lt;/p&gt;&lt;p&gt;To take advantage of a rest call to call a server side script include, you’ll need to make a rest api … really?&lt;/p&gt;&lt;p&gt;yep. one thing to note is you can use the async/await in the uib client scripts so that’s nice.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.servicenow.com/docs/bundle/yokohama-api-reference/page/app-store/dev_portal/API_reference/helpers/concept/helpersAPI.html?_bhlid=04085166848c0d4ec066e78ecbc2e77418400ae2&quot; rel=&quot;noopener&quot;&gt;ServiceNow Docs on Helper&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.servicenow.com/community/developer-forum/how-to-use-script-includes-in-ui-builder/m-p/2510525?_bhlid=399020f5b7d9b0f8e726be8a2fa99bf21bc96975&quot; rel=&quot;noopener&quot;&gt;Community post on Client Side Script Includes&lt;/a&gt; (says to do this you need to make a rest call)&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.servicenow.com/community/developer-forum/call-script-include-from-ui-builder/m-p/2102347?_bhlid=9a2cb9c782940ffa8d3aed53638508a6c0bd7e3f&quot; rel=&quot;noopener&quot;&gt;Useful examples of snHttp&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Neebula - Startup to Acquisition</title>
      <link href="https://jace.pro/blog/neebula-startup-to-acquisition/" />
      <updated>2025-04-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/neebula-startup-to-acquisition/</id>
      <content type="html">
				&lt;h2 id=&quot;the-story-of-neebula-from-startup-to-strategic-acquisition&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/neebula-startup-to-acquisition/#the-story-of-neebula-from-startup-to-strategic-acquisition&quot; class=&quot;heading-anchor&quot;&gt;The Story of Neebula: From Startup to Strategic Acquisition&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This week, I’ve been looking into the story of &lt;a href=&quot;https://en.globes.co.il/en/article-servicenow-acquires-neebula-systems-for-100m-1000953148?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=servicenow-keeps-buying-things&amp;amp;_bhlid=595e69f8c7167974e4719700d75459e9a474cbc2&quot; rel=&quot;noopener&quot;&gt;Neebula Systems&lt;/a&gt;, a company founded by &lt;a href=&quot;https://www.linkedin.com/in/yuval-cohen-55b89/?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=neebula-startup-to-acquisition&amp;amp;_bhlid=3512e69128412ab30b37ed2752bf8582e9237da9&quot; rel=&quot;noopener&quot;&gt;Yuval Cohen&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/arielgordon/?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=neebula-startup-to-acquisition&amp;amp;_bhlid=488232d5d6e810e241dfd4133544991b98610c88&quot; rel=&quot;noopener&quot;&gt;Ariel Gordon&lt;/a&gt;, and &lt;a href=&quot;https://www.linkedin.com/in/shaimo/?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=neebula-startup-to-acquisition&amp;amp;_bhlid=0ce8fdc194c7269830ec3d7f81d072f880adc0f5&quot; rel=&quot;noopener&quot;&gt;Shai Mohaban&lt;/a&gt;. Their central idea was simple but powerful: what if infrastructure wasn’t viewed in terms of servers and applications, but rather by the business services those systems actually deliver?&lt;/p&gt;&lt;p&gt;They called their product &lt;a href=&quot;https://www.servicenow.com/community/itom-forum/service-watch/m-p/1043587?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=neebula-startup-to-acquisition&amp;amp;_bhlid=94e7245627975ead6e68decb50167e16679e5afb&quot; rel=&quot;noopener&quot;&gt;ServiceWatch&lt;/a&gt;, and it offered a top-down perspective of an organization’s environment. Rather than managing raw infrastructure, ServiceWatch created dynamic service maps, automatically updated as configurations changed. This gave IT teams a clear view of how different components supported business services and allowed them to understand the real impact when something went wrong.&lt;/p&gt;&lt;p&gt;Neebula didn’t raise an enormous amount of money, just $5 million. That’s still a significant sum, but in startup terms, especially for a team that grew to 35 people, it wasn’t extravagant. What they did raise, they used wisely. They built a focused, high-value product in a short amount of time and proved its worth quickly.&lt;/p&gt;&lt;p&gt;ServiceNow took notice. Just four years after Neebula was founded, ServiceNow acquired the company for $100 million, an impressive 20x return on the initial investment. After the acquisition, the founders went on to work at ServiceNow, with Yuval Cohen eventually serving as VP and CISO. They later moved on to explore other opportunities as angel investors and advisors.&lt;/p&gt;&lt;p&gt;If you’ve worked with ServiceNow, you might recognize the legacy of ServiceWatch. It became the foundation of ServiceNow’s Service Mapping capability. What ServiceWatch introduced was a shift from managing infrastructure to managing services, a forward-thinking model that’s now central to modern IT operations.&lt;/p&gt;&lt;p&gt;Some tools fade after acquisition. Others become part of the foundation.&lt;br&gt;The difference? Execution, timing, and a willingness to keep going.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;Stuff I’m Taking From This&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Be early, but useful&lt;br&gt;Neebula wasn’t just ahead of its time with service modeling—they made it deployable. That combo matters. Vision without usability is just a pitch.&lt;/li&gt;&lt;li&gt;Your users are your leverage&lt;br&gt;They didn’t wait for a market to form. They helped shape one by solving a real ops pain. That clarity attracts the right early adopters.&lt;/li&gt;&lt;li&gt;M&amp;amp;A isn’t the end—it’s a fork&lt;br&gt;The Neebula team could’ve bounced after the sale. Instead, they helped re-architect what became the CMDB for one of the biggest IT platforms in the world. That’s impact.&lt;/li&gt;&lt;/ol&gt;&lt;hr&gt;&lt;p&gt;If you’re building something in that same spirit. Early, useful, and bold. I’d love to swap notes.&lt;br&gt;&lt;a href=&quot;https://meetings.hubspot.com/jace-benson&quot; rel=&quot;noopener&quot;&gt;https://meetings.hubspot.com/jace-benson&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The 9-Year Overnight Success: Mirror42s Path to Enterprise Mastery</title>
      <link href="https://jace.pro/blog/the-9-year-overnight-success-mirror42s-path-to-enterprise-mastery/" />
      <updated>2025-04-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/the-9-year-overnight-success-mirror42s-path-to-enterprise-mastery/</id>
      <content type="html">
				&lt;h2 id=&quot;the-midnight-distraction&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/the-9-year-overnight-success-mirror42s-path-to-enterprise-mastery/#the-midnight-distraction&quot; class=&quot;heading-anchor&quot;&gt;The Midnight Distraction&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;It’s 1:33 AM. I should be fixing a bug, but here I am writing this post again.&lt;/p&gt;&lt;p&gt;I got sidetracked reading an old ServiceNow press release from 2013.&lt;br&gt;“&lt;a href=&quot;https://www.dailyhostnews.com/servicenow-acquires-mirror42-announces-new-servicenow-performance-analytics-product?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=the-9-year-overnight-success-mirror42-s-path-to-enterprise-mastery&amp;amp;_bhlid=8b005abc2b4b9ce37d42ddb349f85344600e1b7c&quot; rel=&quot;noopener&quot;&gt;ServiceNow acquires Mirror42 to power Performance Analytics.&lt;/a&gt;”&lt;br&gt;I remember Mirror42, kind of. But I never really knew the story behind it.&lt;/p&gt;&lt;p&gt;Turns out, it wasn’t just some BI tool that got scooped up and forgotten.&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/karelvanderpoel/?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=the-9-year-overnight-success-mirror42-s-path-to-enterprise-mastery&amp;amp;_bhlid=70280f1b319bb291d8fb342881a7226e53105cb3&quot; rel=&quot;noopener&quot;&gt;Karel van der Poel&lt;/a&gt; built it from scratch, sold it, and stuck around. And then made it even bigger. Also, he has a &lt;a href=&quot;https://www.youtube.com/watch?v=pAQHnVXVxB0&amp;amp;utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=the-9-year-overnight-success-mirror42-s-path-to-enterprise-mastery&amp;amp;_bhlid=5339c0923855bd3e4fd7778cfb58466c38fdfe40&quot; rel=&quot;noopener&quot;&gt;YouTube video about this he made 12 years ago&lt;/a&gt; (5 minutes).&lt;/p&gt;&lt;p&gt;That hit me.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;Phase 1: Just Survive (2004–2008)&lt;/p&gt;&lt;p&gt;Back then, Mirror42 was an on-prem BI tool. No funding. No fluff. Just solving a problem for real customers.&lt;br&gt;By 2008, they were profitable.&lt;/p&gt;&lt;p&gt;Karel wasn’t trying to go viral. He was trying to stay alive.&lt;br&gt;And that worked.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;Phase 2: Betting on the Cloud (2008–2010)&lt;/p&gt;&lt;p&gt;In 2010, the cloud was still weird to a lot of people. Karel rewrote the whole stack to support it anyway.&lt;br&gt;He didn’t chase the trend. He saw what was coming.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;Phase 3: Building with Community (2008–2013)&lt;/p&gt;&lt;p&gt;While scaling the company, Karel launched something wild.&lt;br&gt;KPI Library.&lt;br&gt;A shared space where 400,000 people added 6,000+ metric templates.&lt;/p&gt;&lt;p&gt;He basically open-sourced strategy. That move built trust, reach, and a moat.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;After the Acquisition&lt;/p&gt;&lt;p&gt;ServiceNow bought Mirror42 for $13M.&lt;/p&gt;&lt;p&gt;Most people would walk away.&lt;/p&gt;&lt;p&gt;Karel didn’t.&lt;br&gt;He scaled Performance Analytics to $75M+, then helped launch NowX and over 30 new products inside ServiceNow. This is generally part of premium SKUs, or a standalone product at a double-digit percent annual contract value increase.&lt;/p&gt;&lt;p&gt;He didn’t stop at the finish line. He treated it like the start of the next thing.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;Stuff I’m Taking From This&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Build for deployment, not hype&lt;br&gt;Karel made something useful for real teams. He focused on being installable, usable, and flexible.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Community matters&lt;br&gt;KPI Library wasn’t flashy, but it created something that lived on.&lt;br&gt;Letting users shape the product made it stronger.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Long games win&lt;br&gt;Nine years at Mirror42. Eleven years (and counting) at ServiceNow.&lt;br&gt;That’s what sticking with it looks like.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Not everything needs to go big right away.&lt;br&gt;Sometimes you just need to make something that works, solve a problem, and keep showing up.&lt;/p&gt;&lt;p&gt;That’s what Karel did.&lt;br&gt;That’s what I want to do too. If you want to know about that, schedule a meeting with me on &lt;a href=&quot;https://getaiinabox.com&quot; rel=&quot;noopener&quot;&gt;https://getaiinabox.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Want to see more, here’s some interesting links.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>From Startup to ServiceNow: The Story of ITapp</title>
      <link href="https://jace.pro/blog/from-startup-to-servicenow-the-story-of-itapp/" />
      <updated>2025-04-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/from-startup-to-servicenow-the-story-of-itapp/</id>
      <content type="html">
				&lt;p&gt;&lt;em&gt;This is part of a series I’m writing to inspire myself and other builders by shining a light on companies that ServiceNow has acquired. If you’re dreaming of building something yourself, these stories aren’t just history, they’re playbooks with lessons we can learn.&lt;/em&gt;&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;what-was-itapp&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/from-startup-to-servicenow-the-story-of-itapp/#what-was-itapp&quot; class=&quot;heading-anchor&quot;&gt;What Was ITapp?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Founded in 2012 and based in San Jose, ITapp set out to make managing cloud infrastructure easier for businesses. They did this with visual app assembly, faster integrations, and a streamlined, cost-effective approach to cloud orchestration.&lt;/p&gt;&lt;p&gt;Back then, I wasn’t building full-stack sites yet and didn’t realize the significance. In hindsight, it’s clear this was a big deal. ITapp wasn’t just offering cloud management, they made it easy. Look at Netlify and Vercel: both wrap complex infrastructure from AWS or Google Cloud in an easy-to-use package. ITapp was doing something similar.&lt;/p&gt;&lt;p&gt;On their &lt;a href=&quot;https://web.archive.org/web/20151101114337/http://www.itapp.com/?_bhlid=6088df797ee93d35e090d692cb4f983b15578926&quot; rel=&quot;noopener&quot;&gt;website in 2015&lt;/a&gt;, ITapp made some big claims.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;75% faster&lt;/strong&gt; installation in HA mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;80% faster&lt;/strong&gt; integration time&lt;/li&gt;&lt;li&gt;&lt;strong&gt;75% less complexity&lt;/strong&gt; in app assembly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;40% lower&lt;/strong&gt; cost than competitors&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It wasn’t just hype. The integrated with AWS, Azure, OpenStack, Citrix XenServer, and VMware. They weren’t trying to reinvent the wheel; they wanted to make it easier to drive.&lt;/p&gt;&lt;h2 id=&quot;the-founders-seasoned-builders-not-first-timers&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/from-startup-to-servicenow-the-story-of-itapp/#the-founders-seasoned-builders-not-first-timers&quot; class=&quot;heading-anchor&quot;&gt;The Founders: Seasoned Builders, Not First-Timers&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ITapp’s founding team was stacked with enterprise veterans:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/brajeshgoyal/?_bhlid=4a126fd9af40a1ba1f08f3b02d0010c8a05c028c&quot; rel=&quot;noopener&quot;&gt;Brajesh “BG” Goyal&lt;/a&gt; brought deep technical and product experience from Oracle and NetApp, and would go on to lead product integration of ITapp at ServiceNow after the acquisition.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/krugone/?_bhlid=eab5e58f17f9d69d20d10bc4a817c21f9bf8135e&quot; rel=&quot;noopener&quot;&gt;Brian Krug&lt;/a&gt;, previously a VP at Cisco, co-founded ITapp and later served as VP of Product Success at ServiceNow before founding AppFaktors.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/giridhar-padmanabh/?_bhlid=4fe66e5fc9bc535ce6347cd95ef00e663d0df389&quot; rel=&quot;noopener&quot;&gt;Giridhar “Gigi” Padmanabh&lt;/a&gt; came with cloud experience from newScale (acquired by Cisco) and became a Senior Director at ServiceNow.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/tahvildary/?_bhlid=df8620cd3ebb7ddfdbeeb2871da251a206656f18&quot; rel=&quot;noopener&quot;&gt;Andrew Tahvildary&lt;/a&gt;, though not a founder, was an early advisor and investor. Bringing in battle-tested engineering leadership from his time at Primavera, newScale, and later companies acquired by Oracle, EMC, and Apple.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This wasn’t a bunch of first-time founders learning as they went. These were people who had built and shipped real enterprise software at scale, and were now playing to win.&lt;/p&gt;&lt;h2 id=&quot;the-product-a-next-gen-cloud-management-platform&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/from-startup-to-servicenow-the-story-of-itapp/#the-product-a-next-gen-cloud-management-platform&quot; class=&quot;heading-anchor&quot;&gt;The Product: A Next-Gen Cloud Management Platform&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ITapp positioned itself as a next-gen cloud management platform with a visual, policy-driven approach to provisioning and orchestration. You could:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Visually assemble full-stack applications&lt;/li&gt;&lt;li&gt;Attach custom storage and networking containers&lt;/li&gt;&lt;li&gt;Manage quotas and delivery across multiple cloud providers&lt;/li&gt;&lt;li&gt;Automate deployments with integrated CI/CD pipelines&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It was part cloud broker, part orchestrator, part DevOps enabler, built with the enterprise in mind.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;the-acquisition-servicenow-buys-in&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/from-startup-to-servicenow-the-story-of-itapp/#the-acquisition-servicenow-buys-in&quot; class=&quot;heading-anchor&quot;&gt;The Acquisition: ServiceNow Buys In&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In April 2016, ServiceNow acquired ITapp for &lt;a href=&quot;https://www.sec.gov/Archives/edgar/data/0001373715/0001373715-16-000364-index.htm?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=from-startup-to-servicenow-the-story-of-itapp&amp;amp;_bhlid=5feb389e415367f6dc1f384bbe39a9a517fcc4ee&quot; rel=&quot;noopener&quot;&gt;$15 million&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It was a quiet but strategic move. At the time, ServiceNow was aggressively expanding beyond its help desk roots into broader IT Operations Management (ITOM) and cloud-native tools. ITapp wasn’t about giving ServiceNow new capabilities from scratch, it was about accelerating their existing cloud management roadmap.&lt;/p&gt;&lt;p&gt;As Sri Chandrashekar, then VP/GM of ITOM at ServiceNow, put it:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“ITapp will augment our existing cloud management solution, allowing customers to optimize their cloud ecosystem while ensuring compliance and security.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The goal: take ITapp’s tech and integrate it deeply into the Now Platform, giving ServiceNow-native experiences for cloud provisioning, governance, and policy enforcement.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;where-it-is-today-from-itapp-to-cloud-management-to-cloud-accelerate&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/from-startup-to-servicenow-the-story-of-itapp/#where-it-is-today-from-itapp-to-cloud-management-to-cloud-accelerate&quot; class=&quot;heading-anchor&quot;&gt;Where It Is Today: From ITapp to Cloud Management to Cloud Accelerate&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ITapp’s DNA lives on in &lt;a href=&quot;https://www.servicenow.com/products/cloud-management.html?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=from-startup-to-servicenow-the-story-of-itapp&amp;amp;_bhlid=201d5dbeb5c9a190c84c9028e9d97597f0b8d52e&quot; rel=&quot;noopener&quot;&gt;ServiceNow Cloud Management&lt;/a&gt;, officially launched in May 2017. Over time, the product has evolved, been repackaged, and now sits under &lt;a href=&quot;https://www.servicenow.com/products/cloud-management.html?_bhlid=cf3d61f48ac814cbe199b3f1abc304a3baacff28&quot; rel=&quot;noopener&quot;&gt;Cloud Accelerate&lt;/a&gt; as part of the &lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/other-document/entitlements/sn-it-operations-management.pdf?_bhlid=7aba6ee7a19768d10f93170869805b824089ba30&quot; rel=&quot;noopener&quot;&gt;AI Ops Enterprise&lt;/a&gt; offering.&lt;/p&gt;&lt;p&gt;What started as a standalone cloud orchestration platform has become a foundational element in how ServiceNow helps enterprises manage cloud at scale—wrapping it in workflows, automation, and policy enforcement powered by the Now Platform.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;what-im-taking-from-this&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/from-startup-to-servicenow-the-story-of-itapp/#what-im-taking-from-this&quot; class=&quot;heading-anchor&quot;&gt;What I’m Taking From This&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Here are three takeaways for builders and product-minded folks:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Solve real problems, not just trendy ones.&lt;/strong&gt;&lt;br&gt;ITapp didn’t try to ride the latest hype wave. They focused on pain points, complexity, cost, integration time, and built something that made a difference.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Deep enterprise experience matters.&lt;/strong&gt;&lt;br&gt;The founding team knew their buyers, their constraints, and how enterprise IT works. That domain knowledge gave them credibility and clarity.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Integration can be more valuable than innovation.&lt;/strong&gt;&lt;br&gt;ServiceNow didn’t need a shiny new product. They needed a way to deliver cloud management faster. ITapp gave them a shortcut.&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>From Consultant to Catalyst - Intreis and the GRC Shift at ServiceNow</title>
      <link href="https://jace.pro/blog/from-consultant-to-catalyst-intreis-and-the-grc-shift-at-servicenow/" />
      <updated>2025-04-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/from-consultant-to-catalyst-intreis-and-the-grc-shift-at-servicenow/</id>
      <content type="html">
				&lt;p&gt;Back in 2012, I spent many evenings and weekends on the ServiceNow Community, answering forum posts, helping people troubleshoot tricky platform issues, and doing whatever I could to level up. (Shoutout to &lt;a href=&quot;https://www.servicenow.com/community/developer-articles/from-the-archives-2013-member-of-the-month/ta-p/2306880?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow&amp;amp;_bhlid=25d0b25f68a2ccd6c5c87a4514ab8c98d1fb306e&quot; rel=&quot;noopener&quot;&gt;October 2013 - Member of the Month&lt;/a&gt; was a proud moment!)&lt;/p&gt;&lt;p&gt;While I was busy solving problems post by post, something bigger was brewing behind the scenes: a small group of consultants saw an opportunity to transform how organizations approached governance, risk, and compliance. That group became &lt;strong&gt;Intreis&lt;/strong&gt; - and their work helped shape ServiceNow’s entire GRC offering.&lt;/p&gt;&lt;p&gt;This is part of a series I’m writing to inspire myself and other builders by shining a light on companies that ServiceNow has acquired. If you’re dreaming of building something yourself, these stories aren’t just history, they’re playbooks with lessons we can learn.&lt;/p&gt;&lt;p&gt;Though my personal memory of Intreis is limited, I’ve learned that they ran a highly focused consultancy around Governance, Risk, and Compliance. ServiceNow noticed and wanted them to help.&lt;/p&gt;&lt;h2 id=&quot;kristopher-markham-and-morgan-hunter&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/from-consultant-to-catalyst-intreis-and-the-grc-shift-at-servicenow/#kristopher-markham-and-morgan-hunter&quot; class=&quot;heading-anchor&quot;&gt;Kristopher Markham and Morgan Hunter&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Every great company starts with a couple of people who see things differently. In the case of Intreis this was &lt;a href=&quot;https://www.linkedin.com/in/kristopher-markham-3b8bab7/?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow&amp;amp;_bhlid=5600d9747f9830609a80add7b3be2ae0d9f79f56&quot; rel=&quot;noopener&quot;&gt;Kristopher Markham&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/in/morgan-hunter-35a905/?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow&amp;amp;_bhlid=233f68ce6bd9f04d6fdbda86564a344c4ec1586c&quot; rel=&quot;noopener&quot;&gt;Morgan Hunter&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Kristopher had deep technical knowledge of ServiceNow, and Morgan brought real world experience from her time at Kantar IT Partnership.&lt;/p&gt;&lt;p&gt;In hindsight, a clear opportunity had presented itself: to bring governance, risk, and compliance practices into the same workflow-driven systems that were already transforming IT operations. &lt;a href=&quot;https://web.archive.org/web/20131031170220/http://intreis.com/about/company/?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow&amp;amp;_bhlid=1a66c0c7aacb258aac12ba67c5a5ca89f5c5f585&quot; rel=&quot;noopener&quot;&gt;Intreis (wayback link)&lt;/a&gt; was formed in 2012 to explore that opportunity, and in just a few years, they would help define the foundation for what became ServiceNow’s GRC product.&lt;/p&gt;&lt;h2 id=&quot;what-did-intreis-do&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/from-consultant-to-catalyst-intreis-and-the-grc-shift-at-servicenow/#what-did-intreis-do&quot; class=&quot;heading-anchor&quot;&gt;What did Intreis do?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Rather than treating compliance as a siloed function that was just a box to check, Intreis embedded it directly into ServiceNow’s ITSM workflows, allowing businesses to streamline both operations and compliance. The idea was to leverage existing platforms, like ServiceNow, to build frameworks that didn’t just help businesses meet compliance requirements, they helped them operate more efficiently, too.&lt;/p&gt;&lt;h2 id=&quot;the-acquisition&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/from-consultant-to-catalyst-intreis-and-the-grc-shift-at-servicenow/#the-acquisition&quot; class=&quot;heading-anchor&quot;&gt;The Acquisition&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In 2015, after a few years of refining their approach and proving its value, ServiceNow recognized the opportunity to deepen their GRC offering and acquired Intreis. This acquisition wasn’t just about adding another tool to the GRC stack. It was about deepening the GRC capabilities of ServiceNow’s platform. Kristopher and Morgan, having already worked closely with ServiceNow, helped shape this offering, bringing practical, real-world experience to the table. Once there Kristopher worked on expanding the GRC product, and Morgan helped partners and ServiceNow strategy around said partners.&lt;/p&gt;&lt;h2 id=&quot;the-legacy&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/from-consultant-to-catalyst-intreis-and-the-grc-shift-at-servicenow/#the-legacy&quot; class=&quot;heading-anchor&quot;&gt;The Legacy&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;GRC is still a large part of the platform and companies solely focus on it today. This product wouldn’t be where it was without this acquisition. If you’re using the Unified Compliance Framework you’ve benefited from this acquisition.&lt;/p&gt;&lt;h2 id=&quot;what-im-taking-from-this&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/from-consultant-to-catalyst-intreis-and-the-grc-shift-at-servicenow/#what-im-taking-from-this&quot; class=&quot;heading-anchor&quot;&gt;What I’m taking from This&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Make compliance work for the business&lt;/strong&gt; - Intreis didn’t build a tool. They solved a real problem by embedding compliance into existing workflows. This was essential to operational effectiveness.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The power of deep, hands-on experience&lt;/strong&gt; - Kristopher and Morgan’s time at Fruition Partners and Kantar IT gave them a wealth of knowledge about the challenges businesses face when integrating compliance. This insight was essential in shaping how GRC could be delivered more effectively within ServiceNow.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Entrepreneurship never stops&lt;/strong&gt; - Even after their time with ServiceNow, Kristopher and Morgan continued to innovate by founding new ventures (&lt;a href=&quot;https://www.serenityehs.com/?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow&amp;amp;_bhlid=8119cd8e42e077642334db0e612811a70164cf7c&quot; rel=&quot;noopener&quot;&gt;Serentiy EHS&lt;/a&gt;, and &lt;a href=&quot;https://www.medusaas.org/?utm_source=jace.pro&amp;amp;utm_medium=newsletter&amp;amp;utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow&amp;amp;_bhlid=408b3059864f5ef7bfe9ac74bcbcd5675d692701&quot; rel=&quot;noopener&quot;&gt;Medusaas&lt;/a&gt;). Their journey is a reminder that the spirit of entrepreneurship is about continual growth and the pursuit of new opportunities.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Rails, sqlite, Hetzner, Kamal2</title>
      <link href="https://jace.pro/blog/rails-sqlite-hetzner-kamal2/" />
      <updated>2025-04-05T00:00:00Z</updated>
      <id>https://jace.pro/blog/rails-sqlite-hetzner-kamal2/</id>
      <content type="html">
				&lt;p&gt;You’ll need a few things to get started here.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;A docker registry (I’m using &lt;a href=&quot;http://hub.docker.com?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;hub.docker.com&lt;/a&gt;) with an &lt;a href=&quot;https://app.docker.com/settings/personal-access-tokens?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;access token&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href=&quot;https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;SSH Key&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A server (I’m using &lt;a href=&quot;https://console.hetzner.cloud/?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;Hetzner&lt;/a&gt;) with a SSH Key&lt;/li&gt;&lt;li&gt;A folder on the server where we’ll store our sqlite and other storage stuff.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dotenvx.com/docs/install?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;dovenvx&lt;/a&gt; to allow us to set up the secrets and environment variables &lt;a href=&quot;http://easily.is&quot; rel=&quot;noopener&quot;&gt;easily.is&lt;/a&gt; a work in progress and isn’t complete.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;table-of-contents&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#table-of-contents&quot; class=&quot;heading-anchor&quot;&gt;Table of Contents&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#1-getting-started&quot;&gt;1. Getting Started&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#11-installing-ruby-on-rails&quot;&gt;1.1. Installing Ruby on Rails&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#12-setting-up-your-rails-app&quot;&gt;1.2 Setting up your Rails app&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#13-creating-a-home-page&quot;&gt;1.3. Creating a home page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#14-cleaning-up-the-application-styles&quot;&gt;1.4. Cleaning up the application styles&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#15-replacing-the-home-page-content&quot;&gt;1.5. Replacing the Home page content&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#16-setting-up-user-login-with-devise&quot;&gt;1.6. Setting up User Login with Devise&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#17-making-the-navbar-stick-to-the-top&quot;&gt;1.7. Making the Navbar stick to the top&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#18-adding-a-dashboard-after-login&quot;&gt;1.8. Adding a dashboard after login&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#19-hiding-login-and-register-for-logged-in-users&quot;&gt;1.9. Hiding Login and Register for logged in users&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#2-deploying&quot;&gt;2. Deploying&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#21-getting-the-things-ready&quot;&gt;2.1. Getting the things ready&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#deployyml-setting-the-things-up&quot;&gt;deploy.yml - setting the things up&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#installing-kamal&quot;&gt;Installing Kamal&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#configuring-the-deployyml&quot;&gt;Configuring the deploy.yml&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#service&quot;&gt;service&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#image&quot;&gt;image&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#servers&quot;&gt;servers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#proxy&quot;&gt;proxy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#registry&quot;&gt;registry&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#env&quot;&gt;env&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#setting-up-env&quot;&gt;Setting up .env&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#running-kamal-setup&quot;&gt;Running kamal setup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#setting-up-a-path-for-sqlite&quot;&gt;Setting up a path for sqlite&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#testing-over-http-on-the-ip-address&quot;&gt;Testing over http on the ip address&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#adding-a-domain-and-ssl&quot;&gt;Adding a domain and SSL&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#useful-resources&quot;&gt;Useful resources&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Okay, so I’m learning Ruby on Rails. I’m looking forward to working on something that doesn’t constantly shift and has been out there for quite a while. I also love the idea of all the generators.&lt;/p&gt;&lt;p&gt;That being said, if you’re working on rails app and you deploy there’s always a number of steps here. I’m going to try to spell out everything I did from the getting started page on ruby on rails to the kamal deploy comand.&lt;/p&gt;&lt;p&gt;Let’s get into it.&lt;/p&gt;&lt;h2 id=&quot;1-getting-started&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#1-getting-started&quot; class=&quot;heading-anchor&quot;&gt;1. Getting Started&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I started the &lt;a href=&quot;https://guides.rubyonrails.org/getting_started.html?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;Getting Started tutorial&lt;/a&gt; this week. I however hit some snags. So we’re going to skip it and follow what Indigo Tech Tutorials published. There’s a few prerequisites we got to meet first.&lt;/p&gt;&lt;h3 id=&quot;11-installing-ruby-on-rails&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#11-installing-ruby-on-rails&quot; class=&quot;heading-anchor&quot;&gt;1.1. Installing Ruby on Rails&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://guides.rubyonrails.org/install_ruby_on_rails.html?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;They have a page here&lt;/a&gt;, for my set up (building on Windows) Here’s my notes.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Install WSL for Ubuntu&lt;br&gt;&lt;code&gt;wsl --install --distribution Ubuntu-24.04&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Open it up, create a user, and password you will remember.&lt;/li&gt;&lt;li&gt;Install a few things&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;    &lt;span class=&quot;token comment&quot;&gt;# install the packages needed&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; build-essential rustc libssl-dev
    &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; libyaml-dev zlib1g-dev libgmp-dev
    &lt;span class=&quot;token comment&quot;&gt;# get mise to install ruby on rails 3&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; https://mise.run &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;eval &quot;$(~/.local/bin/mise activate bash)&quot;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
    &lt;span class=&quot;token builtin class-name&quot;&gt;source&lt;/span&gt; ~/.bashrc
    &lt;span class=&quot;token comment&quot;&gt;# install ruby&lt;/span&gt;
    mise use &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; ruby@3
    &lt;span class=&quot;token comment&quot;&gt;# verify ruby&lt;/span&gt;
    ruby &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# install rails&lt;/span&gt;
    gem &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; rails
    &lt;span class=&quot;token comment&quot;&gt;# verify rails&lt;/span&gt;
    rails &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;12-setting-up-your-rails-app&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#12-setting-up-your-rails-app&quot; class=&quot;heading-anchor&quot;&gt;1.2 Setting up your Rails app&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;You should be on your terminal in WSL.&lt;/p&gt;&lt;p&gt;Let’s make a new project we’ll call it &lt;code&gt;rubystore&lt;/code&gt; with Tailwind.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;    rails new rubystore &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; tailwind
    &lt;span class=&quot;token comment&quot;&gt;# this will build the project out&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; rubystore
    code &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#open in vs code&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I press the &lt;code&gt;ctrl+`&lt;/code&gt; to open the terminal in the editor.&lt;/p&gt;&lt;h3 id=&quot;13-creating-a-home-page&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#13-creating-a-home-page&quot; class=&quot;heading-anchor&quot;&gt;1.3. Creating a home page&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Now let’s set up the controller&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;    rails g controller pages home&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You’ll want to edit the &lt;code&gt;config/routes.rb&lt;/code&gt; file to match this.&lt;/p&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;    Rails&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;application&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;routes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;draw &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# Can be used by load balancers and uptime monitors to verify that the app is live.&lt;/span&gt;
      get &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;up&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rails/health#show&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token symbol&quot;&gt;:rails_health_check&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# Render dynamic PWA files from app/views/pwa/* (remember to link manifest in application.html.erb)&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# get &quot;manifest&quot; =&amp;gt; &quot;rails/pwa#manifest&quot;, as: :pwa_manifest&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# get &quot;service-worker&quot; =&amp;gt; &quot;rails/pwa#service_worker&quot;, as: :pwa_service_worker&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# Defines the root path route (&quot;/&quot;)&lt;/span&gt;
      root &lt;span class=&quot;token string-literal&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;pages#home&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;At anytime you can test this by running &lt;code&gt;bin/dev&lt;/code&gt;. Let’s do that and ensure you get the page was generated page.&lt;/p&gt;&lt;h3 id=&quot;14-cleaning-up-the-application-styles&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#14-cleaning-up-the-application-styles&quot; class=&quot;heading-anchor&quot;&gt;1.4. Cleaning up the application styles&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Open the &lt;code&gt;/views/layouts/application.html.erb&lt;/code&gt; and let’s remove the classes on the `` element.&lt;/p&gt;&lt;h3 id=&quot;15-replacing-the-home-page-content&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#15-replacing-the-home-page-content&quot; class=&quot;heading-anchor&quot;&gt;1.5. Replacing the Home page content&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Open the &lt;code&gt;/views/pages/home.html.erb&lt;/code&gt;, and look for a landing page template with tailwind, searching for free tailwind css components will find you some sites. I found this one called &lt;a href=&quot;https://www.creative-tim.com/twcomponents/component/tailwind-landing-page?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;Landing Page by zoltanszogyenyi&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Copy the code and past it in that file. Run you server and check it out.&lt;/p&gt;&lt;h3 id=&quot;16-setting-up-user-login-with-devise&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#16-setting-up-user-login-with-devise&quot; class=&quot;heading-anchor&quot;&gt;1.6. Setting up User Login with Devise&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;On the terminal add the devise and tailwind devise gems, and the user model and migrate that to the database.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;    bundle &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; devise tailwind_devise
    rails g devise:install
    rails g tailwind_devise:views
    rails g devise User
    rails db:migrate&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Open the &lt;code&gt;/views/pages/home.html.erb&lt;/code&gt; and find the register and login links.&lt;/p&gt;&lt;p&gt;Update them with the following.&lt;/p&gt;&lt;p&gt;Login link should use the following &lt;code&gt;hrefs&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/%25=%20new_user_registration_path%20%25&quot;&gt;Register&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/%25=%20new_user_session_path%20%25&quot;&gt;Login&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;17-making-the-navbar-stick-to-the-top&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#17-making-the-navbar-stick-to-the-top&quot; class=&quot;heading-anchor&quot;&gt;1.7. Making the Navbar stick to the top&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;First let’s edit the &lt;code&gt;/views/layouts/application.html.erb&lt;/code&gt; by adding this in in the body tag.&lt;/p&gt;&lt;p&gt;&amp;lt;%= render “layouts/navbar” %&amp;gt;&lt;/p&gt;&lt;p&gt;Find the header html content and cut it from the &lt;code&gt;/views/pages/home.html.erb&lt;/code&gt;, and paste it into a new partial file &lt;code&gt;/views/layouts/_navbar.html.erb&lt;/code&gt;&lt;/p&gt;&lt;p&gt;You can test this out by registering. You won’t notice anything different after logging in. Let’s fix that.&lt;/p&gt;&lt;h3 id=&quot;18-adding-a-dashboard-after-login&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#18-adding-a-dashboard-after-login&quot; class=&quot;heading-anchor&quot;&gt;1.8. Adding a dashboard after login&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;We’re going to create a new controller definition in &lt;code&gt;/controllers/pages_controller.rb&lt;/code&gt; It should look like this.&lt;/p&gt;&lt;pre class=&quot;language-ruby&quot;&gt;&lt;code class=&quot;language-ruby&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PagesController&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; ApplicationController
      &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token method-definition&quot;&gt;&lt;span class=&quot;token function&quot;&gt;home&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token method-definition&quot;&gt;&lt;span class=&quot;token function&quot;&gt;dashboard&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We need to now tell the routes to handle authenticated users by adding this authenticated logic.&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;    Rails.application.routes.draw do
      devise_for :users
      get &quot;pages/home&quot;
      # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
      # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
      # Can be used by load balancers and uptime monitors to verify that the app is live.
      get &quot;up&quot; =&amp;gt; &quot;rails/health#show&quot;, as: :rails_health_check
      authenticated :user do
        root &quot;pages#dashboard&quot;, as: :authenticated_user_root
      end
      # Defines the root path route (&quot;/&quot;)
      root &quot;pages#home&quot;
    end&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lastly, before you can test this, you’ll need a dashboard page. Create one at &lt;code&gt;/views/pages/dashboard.html.erb&lt;/code&gt;. Like before find a tailwind component that makes sense. I’m using &lt;a href=&quot;https://www.creative-tim.com/twcomponents/component/dashboard-example?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;Dark Dashboard Example by pantazisoftware&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Okay now the login and register loads and lands on the dashboard.&lt;/p&gt;&lt;h3 id=&quot;19-hiding-login-and-register-for-logged-in-users&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#19-hiding-login-and-register-for-logged-in-users&quot; class=&quot;heading-anchor&quot;&gt;1.9. Hiding Login and Register for logged in users&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Edit the &lt;code&gt;/views/layouts/_navbar.html.erb&lt;/code&gt; partial.&lt;/p&gt;&lt;p&gt;We’re going to wrap those links we modified above with this snippet.&lt;/p&gt;&lt;pre class=&quot;language-erb&quot;&gt;&lt;code class=&quot;language-erb&quot;&gt;&lt;span class=&quot;token erb language-erb&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;&amp;lt;%&lt;/span&gt;&lt;span class=&quot;token ruby language-ruby&quot;&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; current_user &lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token erb language-erb&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;&amp;lt;%=&lt;/span&gt;&lt;span class=&quot;token ruby language-ruby&quot;&gt; destroy_user_session_path &lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
        &lt;span class=&quot;token attr-name&quot;&gt;data-turbo-method&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;delete&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;...&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        Log out
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token erb language-erb&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;&amp;lt;%&lt;/span&gt;&lt;span class=&quot;token ruby language-ruby&quot;&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;/span&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!--your links here--&amp;gt;&lt;/span&gt;
&amp;lt;% end %&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now that it’s all set up. Try it out and when you’re ready let’s deploy it.&lt;/p&gt;&lt;h2 id=&quot;2-deploying&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#2-deploying&quot; class=&quot;heading-anchor&quot;&gt;2. Deploying&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;21-getting-the-things-ready&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#21-getting-the-things-ready&quot; class=&quot;heading-anchor&quot;&gt;2.1. Getting the things ready&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;You’ll need a few things to get started here.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;A docker registry (I’m using &lt;a href=&quot;http://hub.docker.com?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;hub.docker.com&lt;/a&gt;) with an &lt;a href=&quot;https://app.docker.com/settings/personal-access-tokens?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;access token&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A &lt;a href=&quot;https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;SSH Key&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A server (I’m using &lt;a href=&quot;https://console.hetzner.cloud/?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;Hetzner&lt;/a&gt;) with a SSH Key&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A folder on the server where we’ll store our sqlite and other storage stuff.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://dotenvx.com/docs/install?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;dotenvx&lt;/a&gt; to allow us to set up the secrets and environment variables easily.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;deployyml-setting-the-things-up&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#deployyml-setting-the-things-up&quot; class=&quot;heading-anchor&quot;&gt;deploy.yml - setting the things up&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;There’s a lot in this file, I’m just going to paste my uncommented version, you can read more on it on &lt;a href=&quot;https://kamal-deploy.org/docs/configuration/overview/?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;the official Kamal Configuration page&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;installing-kamal&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#installing-kamal&quot; class=&quot;heading-anchor&quot;&gt;Installing Kamal&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;On the terminal install kamal, then initialize it for the current project.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;    gem &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; kamal
    kamal init &lt;span class=&quot;token comment&quot;&gt;# this may throw a message that Config already exists&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# that&#39;s okay.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;setting-up-ssh-access-to-your-server&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#setting-up-ssh-access-to-your-server&quot; class=&quot;heading-anchor&quot;&gt;Setting up SSH access to your server&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Before you can deploy, you need passwordless SSH access to your server.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;&lt;strong&gt;Can&#39;t login with SSH? Click here for setup instructions&lt;/strong&gt;&lt;/summary&gt;&lt;p&gt;&lt;strong&gt;Step 1: Copy your SSH key to the server&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;ssh-copy-id root@YOUR_SERVER_IP&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Enter the root password when prompted. This installs your public key on the server.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 2: Test SSH access&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; root@YOUR_SERVER_IP &lt;span class=&quot;token string&quot;&gt;&quot;echo success&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you see “success” without entering a password, you’re ready to deploy!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Troubleshooting:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If &lt;code&gt;ssh-copy-id&lt;/code&gt; doesn’t work, you can manually copy your key:&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Display your public key&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub

&lt;span class=&quot;token comment&quot;&gt;# SSH into server&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; root@YOUR_SERVER_IP

&lt;span class=&quot;token comment&quot;&gt;# On the server, add your key&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; ~/.ssh
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;PASTE_YOUR_PUBLIC_KEY_HERE&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/authorized_keys
&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;600&lt;/span&gt; ~/.ssh/authorized_keys
&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Test it worked&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; root@YOUR_SERVER_IP &lt;span class=&quot;token string&quot;&gt;&quot;echo success&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;&lt;h3 id=&quot;configuring-the-deployyml&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#configuring-the-deployyml&quot; class=&quot;heading-anchor&quot;&gt;Configuring the deploy.yml&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I want to lay out all the things you’ll need for this, but there’s a bunch. Instead I’m going to address each configuration.&lt;/p&gt;&lt;h4 id=&quot;service&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#service&quot; class=&quot;heading-anchor&quot;&gt;service&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The service is the name of your application. I’m going to just call mine rubystore&lt;/p&gt;&lt;h4 id=&quot;image&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#image&quot; class=&quot;heading-anchor&quot;&gt;image&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;This is the docker image. You’ll need a docker registry to do this. I’m using dockerhub. You’ll need to &lt;a href=&quot;https://app.docker.com/settings/personal-access-tokens?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;create an access token on docker hub&lt;/a&gt;. Make sure it has &lt;strong&gt;read&lt;/strong&gt; and &lt;strong&gt;write&lt;/strong&gt; permissions. You can use another registry, I’m not going to set that up. This value should be you’re username/repo. Put this in the &lt;code&gt;.env&lt;/code&gt; file (create it if it doesn’t exist). You should have something like this&lt;/p&gt;&lt;p&gt;KAMAL_REGISTRY_PASSWORD=your_key_goeshere12345&lt;/p&gt;&lt;h4 id=&quot;servers&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#servers&quot; class=&quot;heading-anchor&quot;&gt;servers&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Here we need the IP address of the server we’re going to deploy to. Spin up a machine on &lt;a href=&quot;https://console.hetzner.cloud/?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;Hetzner&lt;/a&gt; that is running Ubuntu and at least 1 GB of ram. Copy that IP address here.&lt;/p&gt;&lt;h4 id=&quot;proxy&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#proxy&quot; class=&quot;heading-anchor&quot;&gt;proxy&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Initially we’re going to skip this so comment this block out. You can do that by prepending a &lt;code&gt;#&lt;/code&gt; for each line here.&lt;/p&gt;&lt;h4 id=&quot;registry&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#registry&quot; class=&quot;heading-anchor&quot;&gt;registry&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Kamal uses docker hub by default, we are also going to use that. Set the username here. This block lets you connect to different registries.&lt;/p&gt;&lt;h4 id=&quot;env&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#env&quot; class=&quot;heading-anchor&quot;&gt;env&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The env block defines what environment variable get passed as secret or as clear text. Here we’re just going to pass the secret of &lt;code&gt;RAILS_MASTER_KEY&lt;/code&gt;. To send that the secrets for Ruby is odd to me yet. You’ll need edit the &lt;code&gt;./kamal/secret&lt;/code&gt; and add &lt;code&gt;RAILS_MASTER_KEY=$RAILS_MASTER_KEY&lt;/code&gt;. I’ll write a little more about this for the kamal commands later.&lt;/p&gt;&lt;h3 id=&quot;setting-up-env&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#setting-up-env&quot; class=&quot;heading-anchor&quot;&gt;Setting up .env&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Now Kamal needs access to the KAMAL_REGISTRY_PASSWORD and RAILS_MASTER_KEY. Create a &lt;code&gt;.env&lt;/code&gt; file and put those in there. Getting your master key is as easy as opening &lt;code&gt;./config/master.key&lt;/code&gt;. If you don’t have a file there run &lt;code&gt;rails credientals:edit&lt;/code&gt; and then just exit using &lt;code&gt;:q&lt;/code&gt;. Now you will have that &lt;code&gt;master.key&lt;/code&gt; file.&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;    KAMAL_REGISTRY_PASSWORD=dckr_pat_asdf
    RAILS_MASTER_KEY=asdfasdfasdf&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;running-kamal-setup&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#running-kamal-setup&quot; class=&quot;heading-anchor&quot;&gt;Running kamal setup&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Running kamal setup needs some details available to it. To set these we’ll just prepend the command with these environment variables. Kamal also needs to be on a machine that can connect to the server. That means setting up ssh on that server and this one, or typing in the ssh password.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;KAMAL_REGISTRY_PASSWORD&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dckr_pat_asdf &lt;span class=&quot;token assign-left variable&quot;&gt;RAILS_MASTER_KEY&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;asdfasdfasdf kamal setup&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A note, on windows you need to have docker desktop installed and integrated with the ubuntu wsl you are running. &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/wsl/tutorials/wsl-containers?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;Microsoft WSL Docker page&lt;/a&gt; has some instructions on this.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;kamal setup&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sometimes I get an error running this&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;INFO &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;fd944dda&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Running &lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; login &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;REDACTED&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;REDACTED&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; as jace@localhost
ERROR &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SSHKit::Command::Failed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: &lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; status: &lt;span class=&quot;token number&quot;&gt;32000&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you get this, your &lt;code&gt;.env&lt;/code&gt; or &lt;code&gt;.kamal/secrets&lt;/code&gt; file probably isn’t working properly. I found that I can run &lt;code&gt;kamal secrets print&lt;/code&gt; to see what secrets are available to kamal. This is great for debugging.&lt;/p&gt;&lt;p&gt;I ended up install dotenvx to correct this.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-sfS&lt;/span&gt; https://dotenvx.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then updated the secrets file (&lt;code&gt;.kamal/secrets&lt;/code&gt;) to use dotenvx for both secrets:&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Grab the registry password from ENV&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;KAMAL_REGISTRY_PASSWORD&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;dotenvx get KAMAL_REGISTRY_PASSWORD &lt;span class=&quot;token parameter variable&quot;&gt;--quiet&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; .env&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Grab the Rails master key from ENV&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;RAILS_MASTER_KEY&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;dotenvx get RAILS_MASTER_KEY &lt;span class=&quot;token parameter variable&quot;&gt;--quiet&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; .env&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; You can verify secrets are loading correctly with &lt;code&gt;kamal secrets print&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;This just worked for me! Sweet. However, when I try to register, I don’t get logged in.&lt;/p&gt;&lt;h3 id=&quot;setting-up-a-path-for-sqlite&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#setting-up-a-path-for-sqlite&quot; class=&quot;heading-anchor&quot;&gt;Setting up a path for sqlite&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://www.erikminkel.com/2024/01/04/deploy-an-app-kamal-sqlite-activestorage/?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;Erik Minkel wrote a piece&lt;/a&gt; on how he set’s this up so the sqlite file doesn’t get destroyed on every deploy.&lt;/p&gt;&lt;p&gt;We’re going to copy his lead.&lt;/p&gt;&lt;h4 id=&quot;option-1-automatic-setup-with-kamal-hooks-recommended&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#option-1-automatic-setup-with-kamal-hooks-recommended&quot; class=&quot;heading-anchor&quot;&gt;Option 1: Automatic setup with Kamal hooks (Recommended)&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Create a file at &lt;code&gt;.kamal/hooks/docker-setup&lt;/code&gt; (no file extension):&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/sh&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# This hook runs LOCALLY after Docker is installed on remote servers&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# We need to SSH into each host to set up directories with proper permissions&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Setting up storage directories on remote servers...&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Loop through all hosts (KAMAL_HOSTS is space-separated)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token for-or-select variable&quot;&gt;host&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$KAMAL_HOSTS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Setting up /storage on &lt;span class=&quot;token variable&quot;&gt;$host&lt;/span&gt;...&quot;&lt;/span&gt;
  
  &lt;span class=&quot;token comment&quot;&gt;# SSH into the remote host and create the directory with proper permissions&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$host&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mkdir -p /storage &amp;amp;&amp;amp; chown -R 1000:1000 /storage &amp;amp;&amp;amp; chmod -R 755 /storage&quot;&lt;/span&gt;
  
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$?&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;✓ Successfully set up /storage on &lt;span class=&quot;token variable&quot;&gt;$host&lt;/span&gt; (UID 1000:1000)&quot;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;✗ Failed to set up /storage on &lt;span class=&quot;token variable&quot;&gt;$host&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;2&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;✓ All servers configured successfully&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Make it executable:&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; +x .kamal/hooks/docker-setup&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now when you run &lt;code&gt;kamal setup&lt;/code&gt;, this directory will be created automatically! You can skip to &lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#edit-deployyml&quot;&gt;editing deploy.yml&lt;/a&gt;.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;&lt;strong&gt;Option 2: Manual setup (if you prefer)&lt;/strong&gt;&lt;/summary&gt;&lt;p&gt;If you prefer to create directories manually, SSH into the server:&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; root@yourserversipaddress
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; /storage
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;:1000 /storage&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Why 1000:1000?&lt;/strong&gt; The Rails Dockerfile creates a &lt;code&gt;rails&lt;/code&gt; user with UID 1000 and runs the application as that user for security. The mounted volume on the host must be owned by the same UID so the Rails app can read/write the SQLite database files.&lt;/p&gt;&lt;p&gt;Log off the server and edit the deploy.yml locally by adding&lt;/p&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;    &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/storage:/rails/storage&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Rails 8 expects the production database at &lt;code&gt;storage/production.sqlite3&lt;/code&gt;, which becomes &lt;code&gt;/rails/storage/production.sqlite3&lt;/code&gt; in the Docker container. The volume mount must point to &lt;code&gt;/rails/storage&lt;/code&gt; to match this path. If you mount to &lt;code&gt;/rails/sqlite&lt;/code&gt;, you’ll get &lt;code&gt;SQLite3::CantOpenException: unable to open database file&lt;/code&gt; errors.&lt;/p&gt;&lt;p&gt;Now let’s add these changes to git, and redeploy.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;    &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;added volumes&quot;&lt;/span&gt;
    kamal deploy&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;&lt;h3 id=&quot;testing-over-http-on-the-ip-address&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#testing-over-http-on-the-ip-address&quot; class=&quot;heading-anchor&quot;&gt;Testing over http on the ip address&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Okay this is not where we want to leave things but I like to test things out.&lt;/p&gt;&lt;p&gt;To test out the site it should be up right now but if you try to auth, you’ll have issues. That’s because when signing up you get the following error on the console (visible by &lt;code&gt;kamal logs&lt;/code&gt; )&lt;/p&gt;&lt;p&gt;If you search for &lt;code&gt;Processing by Devise::RegistrationsController#create&lt;/code&gt; you’ll find &lt;code&gt;ActionController::InvalidAuthenticityToken (HTTP Origin header (http://1.2.3.4) didn&#39;t match request.base_url (https://1.2.3.4))&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Okay, let get around that. In the &lt;code&gt;/config/environments/production.rb&lt;/code&gt; there’s an &lt;code&gt;config.force_ssh&lt;/code&gt; which were going to change to false and a &lt;code&gt;config.assume_ssl&lt;/code&gt; which we’ll comment out.&lt;/p&gt;&lt;p&gt;Do another deploy, and success I’m able to register an account and log in on separate windows.&lt;/p&gt;&lt;h3 id=&quot;adding-a-domain-and-ssl&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#adding-a-domain-and-ssl&quot; class=&quot;heading-anchor&quot;&gt;Adding a domain and SSL&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;First part of this is configuring your Domain Name Server to point to your server.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Verify DNS is working:&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;dig&lt;/span&gt; +short your-domain.com
&lt;span class=&quot;token comment&quot;&gt;# Should return your server&#39;s IP address&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then undo what we did before.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Open &lt;code&gt;/config/environments/production.rb&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Update &lt;code&gt;config.force_ssl&lt;/code&gt; to true&lt;/li&gt;&lt;li&gt;Uncomment &lt;code&gt;config.assume_ssl&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;    kamal proxy logs
    kamal proxy &lt;span class=&quot;token function&quot;&gt;reboot&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Verify SSL certificate:&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Check HTTPS works&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-I&lt;/span&gt; https://your-domain.com

&lt;span class=&quot;token comment&quot;&gt;# View certificate details&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; openssl s_client &lt;span class=&quot;token parameter variable&quot;&gt;-connect&lt;/span&gt; your-domain.com:443 &lt;span class=&quot;token parameter variable&quot;&gt;-servername&lt;/span&gt; your-domain.com &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; openssl x509 &lt;span class=&quot;token parameter variable&quot;&gt;-noout&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-subject&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-issuer&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-dates&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Should show &quot;issuer=C=US, O=Let&#39;s Encrypt&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The SSL certificate from Let’s Encrypt is automatically obtained and will auto-renew.&lt;/p&gt;&lt;h2 id=&quot;common-deployment-issues&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#common-deployment-issues&quot; class=&quot;heading-anchor&quot;&gt;Common Deployment Issues&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Here are the most common issues you might encounter and how to fix them:&lt;/p&gt;&lt;h3 id=&quot;sqlite3cantopenexception-unable-to-open-database-file&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#sqlite3cantopenexception-unable-to-open-database-file&quot; class=&quot;heading-anchor&quot;&gt;SQLite3::CantOpenException: unable to open database file&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; Deployment fails with “target failed to become healthy” and logs show SQLite can’t open database.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Causes:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Volume mount path doesn’t match &lt;code&gt;config/database.yml&lt;/code&gt; expectations&lt;/li&gt;&lt;li&gt;Incorrect permissions on &lt;code&gt;/storage&lt;/code&gt; directory&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# On your local machine, verify deploy.yml has:&lt;/span&gt;
volumes:
  - &lt;span class=&quot;token string&quot;&gt;&quot;/storage:/rails/storage&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Must be /rails/storage, not /rails/sqlite&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# On the server, verify permissions:&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; root@YOUR_SERVER_IP &lt;span class=&quot;token string&quot;&gt;&quot;chown -R 1000:1000 /storage &amp;amp;&amp;amp; chmod -R 755 /storage&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Redeploy:&lt;/span&gt;
kamal deploy&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;docker-exit-status-32000-flag-needs-an-argument-p&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#docker-exit-status-32000-flag-needs-an-argument-p&quot; class=&quot;heading-anchor&quot;&gt;docker exit status: 32000 - flag needs an argument: ‘p’&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; &lt;code&gt;kamal setup&lt;/code&gt; fails with Docker login error.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; The &lt;code&gt;.kamal/secrets&lt;/code&gt; file isn’t extracting the password correctly from &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;br&gt;Install dotenvx and update &lt;code&gt;.kamal/secrets&lt;/code&gt;:&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Install dotenvx&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-sfS&lt;/span&gt; https://dotenvx.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Edit .kamal/secrets to use:&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;KAMAL_REGISTRY_PASSWORD&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;dotenvx get KAMAL_REGISTRY_PASSWORD &lt;span class=&quot;token parameter variable&quot;&gt;--quiet&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; .env&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;RAILS_MASTER_KEY&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;dotenvx get RAILS_MASTER_KEY &lt;span class=&quot;token parameter variable&quot;&gt;--quiet&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; .env&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Debug secrets with:&lt;/span&gt;
kamal secrets print&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;permission-denied-errors-in-logs&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#permission-denied-errors-in-logs&quot; class=&quot;heading-anchor&quot;&gt;Permission Denied Errors in Logs&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; Container starts but crashes with permission errors writing to database.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; The &lt;code&gt;/storage&lt;/code&gt; directory on the server isn’t owned by UID 1000 (the &lt;code&gt;rails&lt;/code&gt; user in the container).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; root@YOUR_SERVER_IP
&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-R&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;:1000 /storage
&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-R&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;755&lt;/span&gt; /storage
&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;

kamal deploy&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ssl-certificate-not-obtained&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#ssl-certificate-not-obtained&quot; class=&quot;heading-anchor&quot;&gt;SSL Certificate Not Obtained&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; HTTPS doesn’t work, &lt;code&gt;curl https://domain.com&lt;/code&gt; shows SSL error.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Check:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;DNS is pointing to server: &lt;code&gt;dig +short your-domain.com&lt;/code&gt; (should return your server IP)&lt;/li&gt;&lt;li&gt;Ports 80 and 443 are open in firewall&lt;/li&gt;&lt;li&gt;No other service is using port 80/443&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Check DNS first&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;dig&lt;/span&gt; +short your-domain.com

&lt;span class=&quot;token comment&quot;&gt;# If DNS is correct, restart proxy to retry Let&#39;s Encrypt:&lt;/span&gt;
kamal proxy &lt;span class=&quot;token function&quot;&gt;reboot&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Check proxy logs:&lt;/span&gt;
kamal proxy logs&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;useful-kamal-commands&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#useful-kamal-commands&quot; class=&quot;heading-anchor&quot;&gt;Useful Kamal Commands&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# View application logs&lt;/span&gt;
kamal logs
kamal logs &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Follow/tail logs&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Access Rails console&lt;/span&gt;
kamal app &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--interactive&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--reuse&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bin/rails console&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# SSH into running container&lt;/span&gt;
kamal app &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--interactive&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--reuse&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bash&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Restart the application&lt;/span&gt;
kamal app restart

&lt;span class=&quot;token comment&quot;&gt;# Rollback to previous version&lt;/span&gt;
kamal rollback

&lt;span class=&quot;token comment&quot;&gt;# View deployment details&lt;/span&gt;
kamal app details&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;useful-resources&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rails-sqlite-hetzner-kamal2/#useful-resources&quot; class=&quot;heading-anchor&quot;&gt;Useful resources&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I found “How To Deploy Rails 7 App With Kamal 2” by Indigo Tech Tutorials the most useful. He’s able to offer help too for a fee on his site, &lt;a href=&quot;https://indigotechtutorials.com/pricing?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=rails-sqlite-hetzner-kamal2&quot; rel=&quot;noopener&quot;&gt;Indigo Tech Tutorials&lt;/a&gt;.&lt;/p&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/TfortG9QKWU&quot; title=&quot;Kamal Deployment: The Newest Form of Self-Torture | I&#39;m Mary Poppins, y&#39;all!&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;p&gt;Kamal Deployment: The Newest Form of Self-Torture | I’m Mary Poppins, y’all!&lt;/p&gt;&lt;p&gt;How to configure Kamal and avoid common deployment pitfalls&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://alec-c4.com/posts/2025-04-02-kamal&quot; rel=&quot;noopener&quot;&gt;&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Hiding follow on tables in ServiceNow</title>
      <link href="https://jace.pro/blog/hiding-follow-on-tables-in-servicenow/" />
      <updated>2025-03-31T00:00:00Z</updated>
      <id>https://jace.pro/blog/hiding-follow-on-tables-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;To remove the “Follow” button, you can do this by disabling the live_feed in the dictionary of the collection record.&lt;/p&gt;&lt;p&gt;Goto the sys_dictionary table and look for the table where the type is collection.&lt;/p&gt;&lt;p&gt;Add live_feed=false, if there’s already something there put a comma before this.&lt;/p&gt;&lt;p&gt;Thanks &lt;a href=&quot;https://www.servicenow.com/community/developer-forum/discuss-and-follow-buttons/td-p/3187907?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=hiding-follow-on-tables-in-servicenow&quot; rel=&quot;noopener&quot;&gt;Ankur for posting this&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Mobile Development on ServiceNow is different</title>
      <link href="https://jace.pro/blog/mobile-development-on-servicenow-is-different/" />
      <updated>2025-03-30T00:00:00Z</updated>
      <id>https://jace.pro/blog/mobile-development-on-servicenow-is-different/</id>
      <content type="html">
				&lt;p&gt;I was looking at the mobile setup for ServiceNow today because I was asked by someone how to get this to work. And it turned into a scavenger hunt, even with these notes here.&lt;/p&gt;&lt;p&gt;Turns out you need a lot more than just what I thought we needed.&lt;/p&gt;&lt;h2 id=&quot;plugins-needed&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#plugins-needed&quot; class=&quot;heading-anchor&quot;&gt;Plugins needed&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Mobile Studio (&lt;code&gt;com.glide.sg.studio&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Geolocation (&lt;code&gt;com.snc.geolocation&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Service Management Geolocation (&lt;code&gt;com.snc.serivce_management.geolocation&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Service Management Geolocation Mobile (&lt;code&gt;com.snc.serivce_management_m&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;SG Offline support (&lt;code&gt;com.glide.sg.offline&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;ServiceNow NowMobile App Screens and Applet Launcher (&lt;code&gt;com.glide.mobile-employee&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;for mobile onboarding only&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Human Resources Scoped App (&lt;code&gt;com.sn_hr_lifecycle_events&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;licensing-considerations&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#licensing-considerations&quot; class=&quot;heading-anchor&quot;&gt;Licensing Considerations&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Accessing Custom Tables may not be available in “Data Items” due to customer entitlements. A change the property, &lt;code&gt;subscription.custom_table.enforce_entitlement&lt;/code&gt; The value needs to be set to false&lt;/p&gt;&lt;h2 id=&quot;definitions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#definitions&quot; class=&quot;heading-anchor&quot;&gt;Definitions&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Term&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Definition&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Apps&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;physical applications downloaded from the app store for the device on which testing will occur (Now Mobile, Mobile Agent)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Applications&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;applications created and used within the instance. These include new scoped mobile applications that are created, existing scoped mobile applications, including base system applications, such as ITSM Mobile Agent, and existing Now Platform applications, such as System Mobile.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Launcher Screens&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;a homepage or landing page&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;UI Sections&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;UI section is in the main area of the Launcher screen and displays a screen or collection of screens. It may be configured as an icon section, which can include multiple applets, a record section, which can include only one screen, an analytics section, a campaign section, a media section, or a navigation section.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Navigation Bar&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The navigation bar is a configurable and customizable menu bar that displays Launcher screens, screens, settings, and notifications. It may also be called the dynamic menu bar.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;dynamic menu bar&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The navigation bar is a configurable and customizable menu bar that displays Launcher screens, screens, settings, and notifications. It may also be called the dynamic menu bar.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Screens&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Screens are how the data is configured and displayed within the mobile apps.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Screen Template&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The screen template determines the features of the screen, what is available for configuration, and how the users will interact with it. The screen templates include: List, Record, Employee Directory, Map, Group List, Calendar, Mobile Web, Input Form, and Chart. However, only List, Record, Input Form, and Mobile Web are available within Mobile App Builder. Additional screens include: Details, Activity Stream, Related List(s), and Embedded List(s).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Segment&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Screens can contain multiple segments. The segments display different information relating to the content screen. Segments are displayed as tabs within the screen and can be a details screen, activity stream, related lists, and embedded lists.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Item Stream&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;An item stream identifies the data stream being used for the screen, as well as its configuration. The item stream contains both a data item and a master item, which determine what is shown and how it is displayed. Multiple item streams can be associated with an screen, which permits one screen to display items from multiple tables using multiple configuration options.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Data Item&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Data items are sets of data sets that represent a table or subset of information from a table in the Now Platform. Data items determine the information that appears on a screen within a screen. They are associated with specific screens to determine the purpose of each screen and what information is available within the screen.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Cards&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Cards define the pattern for the data to be available and how it appears.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Functions&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;There are like UI Actions in platform. Functions can be used throughout the mobile apps to complete activities, including but not limited to, jumping to another screen, reassigning a task, and launching the virtual chat. Some functions include actions and may be referred to as such.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;apps&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#apps&quot; class=&quot;heading-anchor&quot;&gt;Apps&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Mobile Agent - Focused for fulfillers&lt;/li&gt;&lt;li&gt;Now Mobile - more for requestors and employees (hr?)&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;hierarchy-of-mobile-development&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#hierarchy-of-mobile-development&quot; class=&quot;heading-anchor&quot;&gt;Hierarchy of Mobile Development&lt;/a&gt;&lt;/h2&gt; &lt;div class=&quot;mermaid&quot;&gt;flowchart TD
    MobileApp[Mobile App]
    MobileAppConfig[Mobile App Config]
    NavigationBar[Navigation Bar]
    NavigationBarTab[Navigation Bar Tab]
    ScreenTab[Screen Tab]
    LauncherTab[Launcher Tab]
    SavedTab[Saved Tab]
    NotificationsTab[Notifications Tab]
    SettingsTab[Settings Tab]
    Icon[Icon]
    Screen[Screen]
    LauncherScreen[Launcher Screen]
    MobileApp --&amp;gt; MobileAppConfig
    MobileAppConfig --&amp;gt; NavigationBar
    NavigationBar --&amp;gt; NavigationBarTab
    NavigationBarTab --&amp;gt; ScreenTab
    NavigationBarTab --&amp;gt; LauncherTab
    NavigationBarTab --&amp;gt; SavedTab
    NavigationBarTab --&amp;gt; NotificationsTab
    NavigationBarTab --&amp;gt; SettingsTab
    ScreenTab --&amp;gt; Screen
    ScreenTab --&amp;gt; Icon
    LauncherTab --&amp;gt; LauncherScreen
    LauncherTab --&amp;gt; Icon
    SavedTab --&amp;gt; Icon
    NotificationsTab --&amp;gt; Icon
    SettingsTab --&amp;gt; Icon
&lt;/div&gt; &lt;h2 id=&quot;tables&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#tables&quot; class=&quot;heading-anchor&quot;&gt;Tables&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;What&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Table&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Note&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Mobile App Config&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;sys_sg_native_client&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Define what mobile client, Now Mobile, or Mobile Agent for the app.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Nagivation Bar&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;sys_sg_nagivation_tab&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The bottom links&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Tabs can be split into 5 different … things?&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Screen Tab, Launcher Tab&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;sys_sg_applet_launcher_tab&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Saved Tab, Notification Tab, Settings Tab&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;…&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Every customer has these… not changeable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Screens&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;sys_sg_screen&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Launcher Header&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;sys_sg_applet_launcher_header (access from sys_sg_applet_launcher)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Add’s custom messages to header&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Launcher Header Function&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;sys_sg_button_instance (access from sys_sg_applet_launcher)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Defines where user goes when they click on header icons&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Launcher Quick Action&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Not listed (access from sys_sg_applet_launcher)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;E.g. Create a new record, launch native chat&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Launcher Search Config&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;sys_sg_global_search (access from sys_sg_applet_launcher)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Gives ability to search sources from mobile app (Zing for Agent, AI Search or Zing for Now Mobile)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;UI Sections&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;sys_sg_section (access from sys_sg_applet_launcher)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;constols how screens are displayed onlauncher screens, thing order of the itemson the display&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Screens have a bunch of types, liek list, record etc.&lt;/p&gt;&lt;h2 id=&quot;launcher-screens&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#launcher-screens&quot; class=&quot;heading-anchor&quot;&gt;Launcher Screens&lt;/a&gt;&lt;/h2&gt; &lt;div class=&quot;mermaid&quot;&gt;flowchart LR
    LauncherScreen[Launcher Screen]
    HeaderTitle[Header Title]
    HeaderFunction[Header Function]
    QuickAction[Quick Action]
    SearchConfig[Serach Config]
    UISection[UI Section]
    Function
    Icon
    LauncherScreen--&amp;gt;HeaderTitle
    LauncherScreen--&amp;gt;HeaderFunction
    LauncherScreen--&amp;gt;QuickAction
    LauncherScreen--&amp;gt;SearchConfig
    LauncherScreen--&amp;gt;UISection
    HeaderFunction--&amp;gt;Function
    HeaderFunction--&amp;gt;Icon
    QuickAction--&amp;gt;Function2[Function]
    QuickAction--&amp;gt;Icon2[Icon]
    SearchConfig--&amp;gt;EmptyState[Empty State]
    SearchConfig--&amp;gt;ListItemConfig[List Item Config]
    SearchConfig--&amp;gt;SearchAppConfig[Search App Config]
    SearchAppConfig--&amp;gt;SearchSource[Search Source]
    UISection--&amp;gt;LegacyIconSection[Legacy Icon Section]
    LegacyIconSection--&amp;gt;Screen
    UISection--&amp;gt;IconSection[Icon Section]
    IconSection--&amp;gt;LauncherScreen2[Launcher Screen]
    IconSection--&amp;gt;Screen2[Screen]
    IconSection--&amp;gt;Function3[Function]
    UISection--&amp;gt;RecordSection[Record Section]
    RecordSection--&amp;gt;ListScreen[List Screen]
    UISection--&amp;gt;ContentSection[Content Section]
    ContentSection--&amp;gt;StreamContainer[Stream Container]
    StreamContainer--&amp;gt;Stream
    Stream--&amp;gt;DataItem[Data Item]
    Stream--&amp;gt;ListItemConfig2[List Item Config]
    UISection--&amp;gt;MediaSection[Media Section]
    UISection--&amp;gt;AnalyticsSection[AnalyticsSection]
    AnalyticsSection--&amp;gt;AnalyticsPreview[Analytics Preview]
&lt;/div&gt; &lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=sF-pFb1v73Q&amp;amp;utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=mobile-development-on-servicenow-is-different&quot; rel=&quot;noopener&quot;&gt;Youtube&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;list-screen&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#list-screen&quot; class=&quot;heading-anchor&quot;&gt;List Screen&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;sys_sg_list_screen&lt;/p&gt;&lt;p&gt;List screens require a screen segment &lt;code&gt;sys_sg_item_stream_segment&lt;/code&gt;. When a list has a single segment, you don’t see the segments at the top. Example, “Open” and “Closed” incidents.&lt;/p&gt;&lt;p&gt;Of course. for stream segments to work you need a stream of data &lt;code&gt;sys_sg_item_stream&lt;/code&gt;. You will have streams of Data Items in a consistent format. The stream however doesn’t query the table, it needs a “Data Item” &lt;code&gt;sys_sg_data_itme&lt;/code&gt;. This is where you say this table is queried.&lt;/p&gt;&lt;p&gt;Item Configuration &lt;code&gt;sys_sg_master_item&lt;/code&gt; controls how data is displayed on cards. Of course… the item configuration contains the “Card” sys_sg_view_config. Cards are only built in the Mobile Card Builder, not in anything else.&lt;/p&gt;&lt;p&gt;Card Templates sys_sg_view_tempate define how the ui elements will be arranged in individual cards. Again only editable in Mobile Card Builder.&lt;/p&gt;&lt;p&gt;Card Actions sys_sg_view_config_element or sys_sg_view_template_element gives uses actions on each card. Again only editable in Mobile Card Builder.&lt;/p&gt;&lt;h2 id=&quot;record-screen&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#record-screen&quot; class=&quot;heading-anchor&quot;&gt;Record Screen&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;From the List Screen it will be likely you’ll land on a record screen from a List Item Config. Record Screen is on table sys_sg_form_screen.&lt;/p&gt;&lt;p&gt;Records can have no segments (default) and just show the fields boom bam done. If you want more segments that can be set up using Record Screen Segment records &lt;code&gt;sys_sg_form_screen_segment&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Some things you might embed are&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Detail screen&lt;/li&gt;&lt;li&gt;Activity Stream&lt;/li&gt;&lt;li&gt;Related List&lt;/li&gt;&lt;li&gt;Embedded List&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;domain-seperation&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#domain-seperation&quot; class=&quot;heading-anchor&quot;&gt;Domain Seperation&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In Mobile the “Company” or “Account” fields are used to display appropriate records by domain.&lt;/p&gt;&lt;h2 id=&quot;mobile-publishing&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#mobile-publishing&quot; class=&quot;heading-anchor&quot;&gt;Mobile Publishing&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This allows us to change the icon of the app on the iPhone or android, also colors and what note. Mobile Branding is a “For-Fee” service.&lt;/p&gt;&lt;h2 id=&quot;compliance&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#compliance&quot; class=&quot;heading-anchor&quot;&gt;Compliance&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Mobile is also GovCommunityCloud (GCC) compliant making the apps compliant for use in the United States federal, state, and local governments. The environment is FedRAMP High and DoD Impact Leve 4 authorized and compliant. Each mobile app uses FIPS 140-2 certified encryption modules.&lt;/p&gt;&lt;h2 id=&quot;mobile-card-builder&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mobile-development-on-servicenow-is-different/#mobile-card-builder&quot; class=&quot;heading-anchor&quot;&gt;Mobile Card Builder&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://youtu.be/JAEACheU9dY&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/JAEACheU9dY&lt;/a&gt;&lt;/p&gt;&lt;p&gt;There’s a plugin to install.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Reading flows encrypted and compressed values</title>
      <link href="https://jace.pro/blog/reading-flows-encrypted-and-compressed-values/" />
      <updated>2025-03-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/reading-flows-encrypted-and-compressed-values/</id>
      <content type="html">
				&lt;p&gt;The other day, I was on the community slack, and a question popped up about reading the values for flows (flow designer, subflows, etc).&lt;/p&gt;&lt;p&gt;I was under the impression that the data was all still in the giant sys_variable_value table.&lt;/p&gt;&lt;p&gt;This has changed. Now it’s in the sys_hub_action_instance_v2 table. The baffling part about this table is the data on it is compressed and in base 64.&lt;/p&gt;&lt;p&gt;Anders Figenschow shared a colleague’s solution to decompress and convert form base64 is as follows.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// just put your sys_hub_action_instance_v2 sys_id here&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_hub_action_instance_v2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setLimit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; compressedData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;values&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Retrieved base64 encoded data from field.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; cs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; GlideStringUtil&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;base64DecodeAsBytes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;compressedData&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dec &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;GlideCompressionUtil&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;expandToString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dec&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now a few notes here.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;What is GlideCompressionUtil? I’ve not heard of this before.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Morten from Norway, wrote &lt;a href=&quot;https://www.servicenow.com/community/workflow-automation-forum/viewing-the-quot-values-quot-field-of-sys-hub-action-instance-v2/td-p/3149163?utm_source=jace.pro&amp;amp;utm_medium=referral&amp;amp;utm_campaign=reading-flow-s-encrypted-and-compressed-values&quot; rel=&quot;noopener&quot;&gt;this post about doing this same thing&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>The approval field and why it works the way it does</title>
      <link href="https://jace.pro/blog/the-approval-field-and-why-it-works-the-way-it-does/" />
      <updated>2024-12-19T00:00:00Z</updated>
      <id>https://jace.pro/blog/the-approval-field-and-why-it-works-the-way-it-does/</id>
      <content type="html">
				&lt;ol&gt;&lt;li&gt;There’s the told approval engine that I believe evaluates the &lt;code&gt;sysrule_approvals&lt;/code&gt; and &lt;code&gt;process_guide&lt;/code&gt; records. There’s a number of approval rules against &lt;code&gt;sc_request&lt;/code&gt;&lt;br&gt;Depending on how the &lt;code&gt;approval_engines.do&lt;/code&gt; page is configured controls how the legacy approvals work. Lets look at the three tables in question;&lt;ol&gt;&lt;li&gt;Catalog Task is set to use Process Guides&lt;/li&gt;&lt;li&gt;Requested Item using approval engine when it’s associated to a delivery plan, otherwise it’s handled in the workflow or flow.&lt;/li&gt;&lt;li&gt;Request is managed by workflows only.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Catalog Task Process Guide&lt;ol&gt;&lt;li&gt;Catalog Task Default ( when this condition is true &lt;code&gt;state=1^delivery_task.sys_class_name=cat_item_dt_approval&lt;/code&gt;)&lt;br&gt;Those invoke a call to this script include &lt;code&gt;GlideappTaskApprovalHelper&lt;/code&gt; which is hidden/unavailable but is setting the approval to &lt;code&gt;requested&lt;/code&gt; when there are no approvers.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Catalog Task Business Rules&lt;ol&gt;&lt;li&gt;Auto Close on Approval - This is used on Execution Plan tasks and sets the &lt;code&gt;active&lt;/code&gt; and &lt;code&gt;work_end&lt;/code&gt; fields.&lt;/li&gt;&lt;li&gt;Reject Parent - This is used on Execution Plan tasks and sets the &lt;code&gt;sc_req_item.approval&lt;/code&gt; based on the &lt;code&gt;sc_task&lt;/code&gt; if it’s rejected.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Task Business Rules&lt;ol&gt;&lt;li&gt;Stamp Approvals - This sets &lt;code&gt;approval_set&lt;/code&gt; to the current time when approved or rejected, otherwise it clears the value.&lt;/li&gt;&lt;li&gt;Moot Approvals Upon Cancellation - This looks at all individual and group approvals for the current task, if the state of the &lt;code&gt;sysapproval_approver&lt;/code&gt; or &lt;code&gt;sysapproveral_group&lt;/code&gt; are &lt;code&gt;requested&lt;/code&gt; or &lt;code&gt;not requested&lt;/code&gt; this sets’ the approval record to &lt;code&gt;not_required&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;task events - This generates events that notifications and script actions can trigger against.&lt;ol&gt;&lt;li&gt;&lt;code&gt;task.approved&lt;/code&gt; - no script actions against this&lt;/li&gt;&lt;li&gt;&lt;code&gt;task.rejected&lt;/code&gt; - no script actions against this&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Requested Items Approval Engines - &lt;a href=&quot;https://deltasndev.service-now.com/sysrule_approvals_list.do?sysparm_query=active%3Dtrue%5Etable%3Dsc_req_item&amp;amp;sysparm_view=&quot; rel=&quot;noopener&quot;&gt;There are none&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Requested Items Workflows (&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0538552&quot; rel=&quot;noopener&quot;&gt;KB0538552&lt;/a&gt;)&lt;ol&gt;&lt;li&gt;&lt;code&gt;Approval Action&lt;/code&gt; - Sets the approval as configured.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Approval - User&lt;/code&gt; - Sets approval to Requested, and then Approved or Rejected as configured.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Approval - Group&lt;/code&gt; - Sets approval to Requested, and then Approved or Rejected as configured.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Rollback To&lt;/code&gt; - Sets approval to Not Yet Requested or Requested as configured.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Requested Items Flows&lt;ol&gt;&lt;li&gt;&lt;code&gt;Ask for Approval&lt;/code&gt; - Sets the approval to Requested, and then Approved or Rejected as configured.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Requested Items Business Rules&lt;ol&gt;&lt;li&gt;Items Added After Request Approved - runs &lt;strong&gt;before insert&lt;/strong&gt;, where &lt;strong&gt;&lt;code&gt;current.request.approval == approved and current.stage == waiting_for_approval&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;Then if the catalog item associated uses workflow or flow, set the &lt;strong&gt;&lt;code&gt;current.approval = requested&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;Else, &lt;strong&gt;&lt;code&gt;current.approval = current.request.approval&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Set RITM Due Date On Insert - calculates the &lt;code&gt;due_date&lt;/code&gt;&lt;/li&gt;&lt;li&gt;request item closure - cancels related approvals when the item becomes cancelled&lt;/li&gt;&lt;li&gt;sc_ic: Copy Approval Definitions - This calls &lt;code&gt;sc_ic_Factory&lt;/code&gt; which &lt;a href=&quot;https://docs.servicenow.com/bundle/vancouver-servicenow-platform/page/product/service-catalog-management/reference/r_InstalledWithCatalogItemDesigner.html&quot; rel=&quot;noopener&quot;&gt;deals with the catalog item designer&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;reject approval on closed incomplete - runs &lt;strong&gt;before insert or update&lt;/strong&gt; where &lt;strong&gt;&lt;code&gt;current.state.changesTo(4)&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;Then it sets the approval to rejected.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Request Workflows&lt;ol&gt;&lt;li&gt;&lt;strong&gt;CUSTOM&lt;/strong&gt;Delta_HC_Request Level Approval &lt;strong&gt;active == true&lt;/strong&gt; (&lt;code&gt;parent.ref_sc_req_item.cat_item.category=&amp;lt;hardware/software procurement&amp;gt;^EQ&lt;/code&gt;) Looks for a variable of &lt;code&gt;Requested_For&lt;/code&gt; to find the manager. Then asks for an &lt;code&gt;Aproval - User&lt;/code&gt; or ends.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CUSTOM&lt;/strong&gt;Delta Service Catalog Request &lt;strong&gt;active == true&lt;/strong&gt; (&lt;code&gt;no condition&lt;/code&gt;) set’s &lt;code&gt;approval&lt;/code&gt; to &lt;code&gt;requested&lt;/code&gt; then &lt;strong&gt;Marks task approved&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Source Request &lt;strong&gt;active == false&lt;/strong&gt; (&lt;code&gt;sourceable=true^approval=approved^EQ&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Service Catalog Request &lt;strong&gt;active == false&lt;/strong&gt; (&lt;code&gt;no condition&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Delta Hardware Catalog Generic &lt;strong&gt;active == false&lt;/strong&gt; (&lt;code&gt;parent.ref_sc_req_item.cat_item.category!=&amp;lt;hardware/software procurement^EQ&lt;/code&gt;)&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Request Business Rules&lt;ol&gt;&lt;li&gt;request closure - this appears to cancel related approvals by calling &lt;code&gt;SNC.Request&lt;/code&gt; but that code is not accessible.&lt;/li&gt;&lt;li&gt;Set Request State - this sets the &lt;code&gt;sc_request.stage&lt;/code&gt; and &lt;code&gt;sc_request.state&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Cascade Request Approval to Request Item - runs &lt;strong&gt;after insert or update&lt;/strong&gt; where &lt;strong&gt;current.approval.changes()&lt;/strong&gt;&lt;br&gt;if the item is a sequenced request item, sets the stage to not started&lt;br&gt;else cascade the approval to the request item, which works differently for workflow, flow and delivery plan&lt;br&gt;workflow if current.hasWorkflow, if (stage is &lt;code&gt;waiting_for_approval&lt;/code&gt; or is sequenced item) and request.approval == approved, current.approval = &lt;code&gt;requested&lt;/code&gt;, else &lt;code&gt;rejected&lt;/code&gt;&lt;br&gt;flow if current.hasFlowDesigner, if (stage is &lt;code&gt;waiting_for_approval&lt;/code&gt; or is sequenced item) and request.approval == approved, current.approval = &lt;code&gt;requested&lt;/code&gt;, else &lt;code&gt;rejected&lt;/code&gt;&lt;br&gt;delivery plan copies the approval from the request.approval&lt;/li&gt;&lt;li&gt;sc request events - triggers events - look for script actions&lt;ol&gt;&lt;li&gt;sc_request.approved - no script action&lt;/li&gt;&lt;li&gt;other events not applicable&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>2024 VPS host pricing </title>
      <link href="https://jace.pro/blog/2024-vps-host-pricing/" />
      <updated>2024-12-09T00:00:00Z</updated>
      <id>https://jace.pro/blog/2024-vps-host-pricing/</id>
      <content type="html">
				&lt;p&gt;Virtual Private Servers… There’s a little bit to know here. I was trying to find a good comparison site. Didn’t see one so thought I’d toss my notes up here. These prices were as of December, 2024.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Not all hosts are the same.&lt;/li&gt;&lt;li&gt;Shared vCPU = Allowing multiple customers to compete for the same vCPU&lt;/li&gt;&lt;li&gt;Dedicated vCPU = No one else can have it&lt;/li&gt;&lt;li&gt;vCPU = # processors ✖️ ( # cores ✖️ # of threads ). E.g. my home computer has 1 processor with 8 cores, and 8 threads. = 64vCPU&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Let’s start making some notes…&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Plan Type&lt;/th&gt;&lt;th&gt;CPU/GPU&lt;/th&gt;&lt;th&gt;Ram&lt;/th&gt;&lt;th&gt;Vultr&lt;/th&gt;&lt;th&gt;cloudfanatic&lt;/th&gt;&lt;th&gt;Hetzner&lt;/th&gt;&lt;th&gt;Linode&lt;/th&gt;&lt;th&gt;DO&lt;/th&gt;&lt;th&gt;IONOS&lt;/th&gt;&lt;th&gt;Hostgater&lt;/th&gt;&lt;th&gt;&lt;a href=&quot;http://fly.io&quot; rel=&quot;noopener&quot;&gt;fly.io&lt;/a&gt;&lt;/th&gt;&lt;th&gt;dreamhost&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Shared&lt;/td&gt;&lt;td&gt;1x vCPU&lt;/td&gt;&lt;td&gt;1gb&lt;/td&gt;&lt;td&gt;5/mo&lt;/td&gt;&lt;td&gt;3/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;5/mo&lt;/td&gt;&lt;td&gt;6/mo&lt;/td&gt;&lt;td&gt;2/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;6/mo&lt;/td&gt;&lt;td&gt;6/mo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Shared&lt;/td&gt;&lt;td&gt;4x vCPU&lt;/td&gt;&lt;td&gt;8gb&lt;/td&gt;&lt;td&gt;40/mo&lt;/td&gt;&lt;td&gt;18/mo&lt;/td&gt;&lt;td&gt;8/mo&lt;/td&gt;&lt;td&gt;48/mo&lt;/td&gt;&lt;td&gt;48/mo&lt;/td&gt;&lt;td&gt;10/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;42/mo&lt;/td&gt;&lt;td&gt;48/mo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dedicated&lt;/td&gt;&lt;td&gt;1x vCPU&lt;/td&gt;&lt;td&gt;2gb&lt;/td&gt;&lt;td&gt;28/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;31/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dedicated&lt;/td&gt;&lt;td&gt;4x vCPU&lt;/td&gt;&lt;td&gt;8gb&lt;/td&gt;&lt;td&gt;80/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;27/mo&lt;/td&gt;&lt;td&gt;72/mo&lt;/td&gt;&lt;td&gt;84/mo&lt;/td&gt;&lt;td&gt;60/mo&lt;/td&gt;&lt;td&gt;93/mo&lt;/td&gt;&lt;td&gt;124/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BareMetal&lt;/td&gt;&lt;td&gt;4c 8thread 64vCPU&lt;/td&gt;&lt;td&gt;32gb&lt;/td&gt;&lt;td&gt;120/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BareMetal&lt;/td&gt;&lt;td&gt;6c 12thread 72vCPU&lt;/td&gt;&lt;td&gt;64gb&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;42/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU&lt;/td&gt;&lt;td&gt;1/8 A16 ( 2gb)&lt;/td&gt;&lt;td&gt;8gb&lt;/td&gt;&lt;td&gt;44/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU&lt;/td&gt;&lt;td&gt;1 A16 (16gb)&lt;/td&gt;&lt;td&gt;64gb&lt;/td&gt;&lt;td&gt;350/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU&lt;/td&gt;&lt;td&gt;1/8 A100 ( 4gb)&lt;/td&gt;&lt;td&gt;15gb&lt;/td&gt;&lt;td&gt;254/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU&lt;/td&gt;&lt;td&gt;1 A100 (80gb)&lt;/td&gt;&lt;td&gt;120gb&lt;/td&gt;&lt;td&gt;1783/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;2604/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU&lt;/td&gt;&lt;td&gt;H100 (80gb) 20vCPU&lt;/td&gt;&lt;td&gt;240gb&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;2522/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GPU&lt;/td&gt;&lt;td&gt;i5, RTX4000&lt;/td&gt;&lt;td&gt;64gb&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;205/mo*&lt;/td&gt;&lt;td&gt;638/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;*Setup Fee&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Quirks of db_image, db_video, and db_audio in ServiceNow</title>
      <link href="https://jace.pro/blog/quirks-of-db_image-db_video-and-db_audio-in-servicenow/" />
      <updated>2024-12-05T00:00:00Z</updated>
      <id>https://jace.pro/blog/quirks-of-db_image-db_video-and-db_audio-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;The &lt;code&gt;db_image&lt;/code&gt;, &lt;code&gt;db_video&lt;/code&gt;, and &lt;code&gt;db_audio&lt;/code&gt; tables in ServiceNow do something interesting: they completely ignore access controls (ACLs). That means any file stored here is publicly accessible. While this is great for assets like images in public-facing knowledge base (KB) articles, it does come with some caveats.&lt;/p&gt;&lt;p&gt;For example, files from these tables are served straight from the root domain (e.g., &lt;code&gt;https://support.service-now.com/image.png&lt;/code&gt;). This makes them easy to link to, but it also bypasses user permissions entirely. In some cases, this behavior can cause issues. I’ve seen KB articles with copied images that still point to the original article, which some users couldn’t access. The attachments copy forward with the article, but the image references in the HTML don’t update.&lt;/p&gt;&lt;p&gt;I got curious and tested a few edge cases, like uploading files without extensions or trying to host unauthorized content. ServiceNow held up. Files without extensions still work as expected, and there doesn’t seem to be a way to abuse this feature for anything malicious. That said, the lack of ACL checks is still something to keep in mind.&lt;/p&gt;&lt;p&gt;This isn’t necessarily a problem, but it’s worth noting. If you’re using these tables, make sure they’re only for files you intend to be public. Also, if you’re working with KB articles, double-check your image references when creating new versions. A little awareness here can go a long way toward keeping things working smoothly.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>App Administration VS Delegated Development</title>
      <link href="https://jace.pro/blog/app-administration-vs-delegated-development/" />
      <updated>2024-12-03T00:00:00Z</updated>
      <id>https://jace.pro/blog/app-administration-vs-delegated-development/</id>
      <content type="html">
				&lt;p&gt;I’m building a solution and as part of this, I’m trying to make a easy to show interactive environment.&lt;/p&gt;&lt;p&gt;One of the things I was thinking about was setting up Delegated development on my Personal Developer Instance.&lt;/p&gt;&lt;p&gt;It became apparent to me that I didn’t understand Application Administration compared to Delegated Development, at least not how the &lt;a href=&quot;https://www.servicenow.com/docs/csh?topicname=c_DelegatedDevelopment.html&amp;amp;version=latest&quot; rel=&quot;noopener&quot;&gt;docs&lt;/a&gt; say.&lt;/p&gt;&lt;p&gt;If you’re coming across this and want to know the difference, here it is.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenow.com/docs/csh?topicname=application-administration.html&amp;amp;version=latest&quot; rel=&quot;noopener&quot;&gt;Application Administration&lt;/a&gt; is the functionality to &lt;strong&gt;restrict&lt;/strong&gt; standard administrators from accessing a scoped application. Think Human Resources Service Delivery. You may not want global admin’s mucking up columns on their tables, business rules, flows, etc.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenow.com/docs/csh?topicname=c_DelegatedDevelopment.html&amp;amp;version=latest&quot; rel=&quot;noopener&quot;&gt;Delegated Development&lt;/a&gt; is the functionality to &lt;strong&gt;invite and allow&lt;/strong&gt; others to build automation within a specific scope.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I want to take a few moment and dive into each a little more as my understanding now, may help me later when.&lt;/p&gt;&lt;h2 id=&quot;application-administration&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/app-administration-vs-delegated-development/#application-administration&quot; class=&quot;heading-anchor&quot;&gt;Application Administration&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This was not what I was looking for before, but let’s talk about it, and how you can set it up.&lt;/p&gt;&lt;p&gt;You need a scoped application to get this, and then once you look at the scoped application you’ll notice a checkbox next to Application Administration that looks like it’s a simple check. It is, but you wont be able to save that record until you have a role with the Application Administrator of true.&lt;/p&gt;&lt;p&gt;Here’s a quick and dirty checklist to try it out.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a scoped application&lt;/li&gt;&lt;li&gt;Change your current scope to the new scope.&lt;/li&gt;&lt;li&gt;Create a role.&lt;/li&gt;&lt;li&gt;On the list view of the role, show &lt;code&gt;Application Administrator&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Set &lt;code&gt;Application Administrator&lt;/code&gt; to true&lt;/li&gt;&lt;li&gt;Go back to “My company applications” and click the left-side of the tile to open the application’s details.&lt;/li&gt;&lt;li&gt;Check the box.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;What did this just do? Well, if you don’t have this role, you wont be able to mess with anything inside of that scope.&lt;/p&gt;&lt;h2 id=&quot;delegated-development&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/app-administration-vs-delegated-development/#delegated-development&quot; class=&quot;heading-anchor&quot;&gt;Delegated Development&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This &lt;strong&gt;was&lt;/strong&gt; what I was looking for, but after seeing it, I’m not user it’s what I need.&lt;/p&gt;&lt;p&gt;Let’s say you wanted to let some folks not on your team build on ServiceNow in a way that is separated by scope from you. This would be how to achieve that. Here’s a quick list of steps to try it out.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Create a scoped application&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;In the related links you might see “Manage Collaborators” from the App, or in Legacy studio under the file menu, you can see the same.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Click on that, a Modal will appear with a invite field, and level.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/eV1lxNusWN-650.webp 650w, https://jace.pro/img/eV1lxNusWN-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/eV1lxNusWN-650.jpeg&quot; alt=&quot;App Administration Interface&quot; width=&quot;960&quot; height=&quot;197&quot; srcset=&quot;https://jace.pro/img/eV1lxNusWN-650.jpeg 650w, https://jace.pro/img/eV1lxNusWN-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;So it appears you can pick anyone&lt;/li&gt;&lt;li&gt;The level’s are limited to editor and owner. Owner should include all access, and it nearly does. It’s missing the scripting option.&lt;/li&gt;&lt;li&gt;Pick a user, or better create a user with no roles, then pick that person.&lt;/li&gt;&lt;li&gt;Pick owner&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Once that’s submitted, you’ll probably notice something about the request being auto rejected. This is… by design. I forgot to mention you will need to ensure the group, &lt;code&gt;App Engine Admins&lt;/code&gt; need’s to have some folks in it who can approve these tasks.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Start over, at step 3. Welcome back.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Now you might be wondering what task did this create? It made a &lt;code&gt;sn_collab_request_dev_collab_task&lt;/code&gt; record and an approval against it to the group &lt;code&gt;App Engine Admins&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;You can look up the flow, it has over 30 steps. If you approve the request the user will be given over 20 roles (given you gave them “owner” access).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Now if you have them or impersonate them to see what they can do, you can notice you can see all the appropriate buttons in legacy studio and the new ServiceNow studio to create flows, business rules, portal widget etc. However, you may notice, they can’t edit or create any scripts in those records.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Stop impersonating them and go back to where you invited them, that modal. You’ll see they are listed as a collaborator, go ahead and change their access.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/4cbXkm_nPS-650.webp 650w, https://jace.pro/img/4cbXkm_nPS-937.webp 937w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/4cbXkm_nPS-650.jpeg&quot; alt width=&quot;937&quot; height=&quot;424&quot; srcset=&quot;https://jace.pro/img/4cbXkm_nPS-650.jpeg 650w, https://jace.pro/img/4cbXkm_nPS-937.jpeg 937w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;See the options, there’s a “Allow Scripting” near the bottom.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/IwU1VHnjYB-650.webp 650w, https://jace.pro/img/IwU1VHnjYB-917.webp 917w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/IwU1VHnjYB-650.jpeg&quot; alt width=&quot;917&quot; height=&quot;872&quot; srcset=&quot;https://jace.pro/img/IwU1VHnjYB-650.jpeg 650w, https://jace.pro/img/IwU1VHnjYB-917.jpeg 917w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;further-reading-and-thoughts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/app-administration-vs-delegated-development/#further-reading-and-thoughts&quot; class=&quot;heading-anchor&quot;&gt;Further Reading and thoughts&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;These two features might be a bit weird to understand. Hopefully this helped. Thanks John Dahl for letting me bounce these ideas around with you, that helped me get to this understanding faster.&lt;/p&gt;&lt;p&gt;If you’d like to read more on this, these are the links I was using to try to understand it.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenow.com/docs/csh?topicname=c_DelegatedDevelopment.html&amp;amp;version=latest&quot; rel=&quot;noopener&quot;&gt;Docs: Delegated development and deployment&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenow.com/docs/csh?topicname=application-administration.html&amp;amp;version=latest&quot; rel=&quot;noopener&quot;&gt;Docs: Application administration&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dancovic.com/2024/11/citizen-development-101.html&quot; rel=&quot;noopener&quot;&gt;Dan Covic: Citizen Development&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=6kAFiX5dtl8&amp;amp;t=2119&quot; rel=&quot;noopener&quot;&gt;Lisa Holenstein, Kiernan McMorrow, and Robert Ninness Platform Academy Video (43 mins)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>How to change the MOTD on Ubuntu</title>
      <link href="https://jace.pro/blog/how-to-change-the-motd-on-ubuntu/" />
      <updated>2024-11-30T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-change-the-motd-on-ubuntu/</id>
      <content type="html">
				&lt;p&gt;The Message of the day on linux is helpful, but its long and… a little hard for things to stand out.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/aC8wpVOwuQ-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/aC8wpVOwuQ-650.jpeg&quot; alt=&quot;MOTD&quot; width=&quot;650&quot; height=&quot;457&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;I had a few questions about the MOTD.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Where is it stored?&lt;/li&gt;&lt;li&gt;How is it set up?&lt;/li&gt;&lt;li&gt;Can I change it?&lt;/li&gt;&lt;li&gt;If I can, how can I test it?&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;where-is-the-motd-stored&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-change-the-motd-on-ubuntu/#where-is-the-motd-stored&quot; class=&quot;heading-anchor&quot;&gt;Where is the MOTD stored?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The message of the day on Ubuntu is stored in the &lt;code&gt;/etc/update-motd.d/&lt;/code&gt; folder as a number of scripts.&lt;/p&gt;&lt;p&gt;You can view these scripts by running &lt;code&gt;ls -la /etc/update-motd.d/&lt;/code&gt;&lt;/p&gt;&lt;h2 id=&quot;how-is-the-motd-set-up&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-change-the-motd-on-ubuntu/#how-is-the-motd-set-up&quot; class=&quot;heading-anchor&quot;&gt;How is the MOTD set up?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The Message of the day is broken up into individual scripts.&lt;br&gt;Here’s what mine currently shows.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/NMnwpyUiY6-650.webp 650w, https://jace.pro/img/NMnwpyUiY6-960.webp 960w, https://jace.pro/img/NMnwpyUiY6-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/NMnwpyUiY6-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/NMnwpyUiY6-650.jpeg 650w, https://jace.pro/img/NMnwpyUiY6-960.jpeg 960w, https://jace.pro/img/NMnwpyUiY6-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;It seems that &lt;code&gt;cat /run/motd.dynamic&lt;/code&gt; is run when you login and something else generates it. At least according to, &lt;a href=&quot;https://til.hashrocket.com/posts/rymit7rzif-view-the-motd-after-login-in-ubuntu&quot; rel=&quot;noopener&quot;&gt;chriserin on their blog&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;can-you-change-the-motd&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-change-the-motd-on-ubuntu/#can-you-change-the-motd&quot; class=&quot;heading-anchor&quot;&gt;Can you change the MOTD?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Yes. There’s loads of ways to do this.&lt;/p&gt;&lt;p&gt;I don’t want to remove it for everyone so you can disable it on a user by user basis by doing this;&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; &lt;span class=&quot;token environment constant&quot;&gt;$HOME&lt;/span&gt;/.hushlogin&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then you can add a custom script or echo to &lt;code&gt;/etc/profile/&lt;/code&gt; and it will print it at the end.&lt;/p&gt;&lt;p&gt;I added `neofetch` to mine.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/m1jvVIUXo2-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/m1jvVIUXo2-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;359&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;further-reading&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-change-the-motd-on-ubuntu/#further-reading&quot; class=&quot;heading-anchor&quot;&gt;Further Reading&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://askubuntu.com/questions/105689/how-is-etc-motd-updated&quot; rel=&quot;noopener&quot;&gt;server - How is /etc/motd updated? - Ask Ubuntu&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://docs.vultr.com/working-with-the-ubuntu-message-of-the-day-motd-service&quot; rel=&quot;noopener&quot;&gt;Working with the Ubuntu Message of the Day (MOTD) Service | Vultr Docs&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Table Cleaners - Troubleshooting</title>
      <link href="https://jace.pro/blog/table-cleaners-troubleshooting/" />
      <updated>2024-11-01T00:00:00Z</updated>
      <id>https://jace.pro/blog/table-cleaners-troubleshooting/</id>
      <content type="html">
				&lt;p&gt;Sometimes you need to answer questions like “Why does this do this?” or “How does this work?” This is a set of notes on these kinds of question regarding table cleaners.&lt;/p&gt;&lt;h2 id=&quot;properties&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#properties&quot; class=&quot;heading-anchor&quot;&gt;Properties&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;property&lt;/th&gt;&lt;th&gt;default value&lt;/th&gt;&lt;th&gt;description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;glide.db.tablecleaner.days_before_slow_rule_reattempt&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;When a table cleaner rule has a query that takes longer than 30 seconds to complete, the entire table cleaner job is stopped. By default, table cleaner waits two days before including that rule in the table cleaner job again.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;glide.db.tablecleaner.chunk_delete_max_time_spent&lt;/td&gt;&lt;td&gt;1200&lt;/td&gt;&lt;td&gt;Limits how long the cleaner spends trying to batch-delete records per rule during a single run. The value is given in seconds and defaults to 1200 (20 minutes), which means the table cleaner runs hourly for a maximum of 20 minutes.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;This is from the &lt;a href=&quot;https://docs.servicenow.com/csh?topicname=table-cleaner-properties.html&amp;amp;version=latest&quot; rel=&quot;noopener&quot;&gt;docs&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;community&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#community&quot; class=&quot;heading-anchor&quot;&gt;Community&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This &lt;a href=&quot;https://www.servicenow.com/community/developer-forum/table-cleaner-stopped-working/m-p/2991648&quot; rel=&quot;noopener&quot;&gt;post&lt;/a&gt; is about the slow rule attempt property&lt;br&gt;This &lt;a href=&quot;https://www.servicenow.com/community/developer-forum/over-your-storage-limit-table-cleaner-and-its-limits/m-p/2623443&quot; rel=&quot;noopener&quot;&gt;post&lt;/a&gt; is about the limits table cleaners have&lt;/p&gt;&lt;h2 id=&quot;official-kb-articles&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#official-kb-articles&quot; class=&quot;heading-anchor&quot;&gt;Official KB Articles&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;kb0958075-check-if-table-cleaner-is-working-well-and-how-much-data-a-table-cleaner-rule-deletes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#kb0958075-check-if-table-cleaner-is-working-well-and-how-much-data-a-table-cleaner-rule-deletes&quot; class=&quot;heading-anchor&quot;&gt;KB0958075 - Check if table cleaner is working well and how much data a table cleaner rule deletes&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB1437672&quot; rel=&quot;noopener&quot;&gt;OOTB Table cleaner is applied for tables with table rotation or table extension - Support and Troubleshooting (servicenow.com)&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;There are old OOTB table cleaner that exist for tables with table rotation or table extension&lt;/p&gt;&lt;p&gt;Generally table cleaner rules are not meaningful for table rotation tables. These rules are legacy rules that exist before table rotation was put in place.&lt;/p&gt;&lt;p&gt;As these table cleaners are not causing any performance/other issues, these rules can be ignored&lt;br&gt;Rotation tables that have a OOTB table cleaner rule in place&lt;/p&gt;&lt;ul&gt;&lt;li&gt;cmdb_metric&lt;/li&gt;&lt;li&gt;sys_replication_queue&lt;/li&gt;&lt;li&gt;sysevent&lt;/li&gt;&lt;li&gt;ecc_queue&lt;/li&gt;&lt;li&gt;syslog&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sys_kb_id=20e77933934aa550def533527cba1085&quot; rel=&quot;noopener&quot;&gt;Check if table cleaner is working well and how much data a table cleaner rule deletes - Support and Troubleshooting (servicenow.com)&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;kb0551417-troubleshooting-the-table-cleaner-scheduled-job&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#kb0551417-troubleshooting-the-table-cleaner-scheduled-job&quot; class=&quot;heading-anchor&quot;&gt;KB0551417 Troubleshooting the Table Cleaner Scheduled Job&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&quot;description&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#description&quot; class=&quot;heading-anchor&quot;&gt;Description&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;Table Cleaner is running excessively long&lt;/li&gt;&lt;li&gt;Table Cleaner is intermittently cleaning a certain table&lt;/li&gt;&lt;li&gt;Table Cleaner is causing replication lag&lt;/li&gt;&lt;li&gt;System degradation during Table Cleaner operation&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;how-table-cleaner-works&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#how-table-cleaner-works&quot; class=&quot;heading-anchor&quot;&gt;How Table Cleaner Works&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Table Cleaner is an internal feature to manage the cleanup of very large tables. The feature is mainly configured through a module of the same name that is not visible to customers or partners. Do not&amp;nbsp;configure the related table without the assistance of ServiceNow.&lt;/p&gt;&lt;p&gt;Table Cleaner is essentially&amp;nbsp;a scheduled job that runs every hour and deletes all records older than a specified date. For example, there is an out-of-box table cleaner configuration record that deletes all&amp;nbsp;cmdb_tcp&amp;nbsp;tables that have not been updated in the last 24 hours that have been marked&amp;nbsp;absent&amp;nbsp;=&amp;nbsp;true.&lt;/p&gt;&lt;p&gt;Due to the high-risk nature of creating a new Table Cleaner, it should only be done with the assistance of ServiceNow development or if there is a documented, reviewed, and approved workaround.&lt;/p&gt;&lt;h4 id=&quot;table-cleaning-modes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#table-cleaning-modes&quot; class=&quot;heading-anchor&quot;&gt;Table Cleaning Modes&lt;/a&gt;&lt;/h4&gt;&lt;h5 id=&quot;iterative&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#iterative&quot; class=&quot;heading-anchor&quot;&gt;&lt;strong&gt;Iterative&lt;/strong&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;If a table has the “iterativeDelete” attribute on its dictionary record then it&amp;nbsp;must be deleted in an&amp;nbsp;&lt;em&gt;iterative&lt;/em&gt;&amp;nbsp;fashion. If a table is determined to require iterative deletes, the Table Cleaner job will run in iterative mode. Iterative table cleaner mode uses a&amp;nbsp;GlideRecord.query() loop to go through each matching record in a table and delete them one by one.&lt;/p&gt;&lt;p&gt;N.B. Iterative delete mode is normally used for a larger variety of tables but for the purposes of Table Cleaning, the only thing that goes through iterative delete are tables that have the attribute explicitly set.&lt;/p&gt;&lt;h5 id=&quot;bulk&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#bulk&quot; class=&quot;heading-anchor&quot;&gt;&lt;strong&gt;Bulk&lt;/strong&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;The normal mode for Table Cleaner is&amp;nbsp;&lt;em&gt;bulk operation&lt;/em&gt;&amp;nbsp;mode. In this mode, Table Cleaner deletes multiple records with a single database operation. The two types of bulk operation modes are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Chunk&amp;nbsp;- As of Helsinki, this optimized method of deleting records first queries for all the&amp;nbsp;sys_ids of records that match the Table Cleaner condition and then uses that list as the query criteria for a bulk delete statement. This method avoids costly gap-lock that can cause database contention during Table Cleaning. (See&amp;nbsp;PRB650197.) To enable chunk processing you must activate the property&amp;nbsp;&lt;em&gt;&lt;strong&gt;&lt;code&gt;glide.db.tablecleaner.chunk_delete_sysid&lt;/code&gt;&lt;/strong&gt;&lt;/em&gt;. In Helsinki this table cleaning method will only be used for testing but should become the default method of table cleaning in the Istanbul release. This is also better for reducing replication impact since fewer statements are issued.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Nibble&amp;nbsp;- As of Geneva, this was the method used for all out-of-box Table Cleaners and is described in more detail below.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;how-the-table-cleaner-nibbles&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#how-the-table-cleaner-nibbles&quot; class=&quot;heading-anchor&quot;&gt;How the Table Cleaner “Nibbles”&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Table Cleaner has a functionality called “nibble” that breaks the records to be deleted into small groups so it can “nibble” instead of trying to delete them all at once. This functionality enables the process to delete in a series of nibbles to prevent long-running deletes that could potentially lead to performance issues.&lt;/p&gt;&lt;p&gt;This functionality works as follows (the capitalized words refer to actual variables in the TableCleaner code):&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Calculate a DELTA in Milliseconds between the value of the&amp;nbsp;sys_updated_on&amp;nbsp;field for the YOUNGEST record and the ELDEST record to be deleted.&lt;/li&gt;&lt;li&gt;Get the COUNT of records older than the youngest record to be deleted. For example:&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; cmdb_tcp &lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; absent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; sys_updated_on &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; hours ago&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Divide the COUNT by desired size of nibbles (controlled by the property, glide.db.nibble.size, 250 by default) to find the NUMBER OF&amp;nbsp;NIBBLES&amp;nbsp;required&lt;/li&gt;&lt;li&gt;Divide the DELTA by the NUMBER OF NIBBLES&amp;nbsp;to find out how many Milliseconds should hypothetically contain the desired number of&amp;nbsp;records. This value becomes the NIBBLESIZE.&lt;/li&gt;&lt;li&gt;Start a loop that increments the ELDEST variable by the NIBBLESIZE each time.&lt;/li&gt;&lt;li&gt;Delete everything older than the value of ELDEST&lt;/li&gt;&lt;li&gt;Sleep for the amount of time it took to do step 6 multiplied by a&amp;nbsp;&lt;em&gt;sleep factor&lt;/em&gt;&amp;nbsp;(determined either by the attribute “nibbleSleep” on the dictionary record of the table or the default sleep value set by “glide.db.nibble.sleep” or 1, if the property&amp;nbsp;does not exist)&lt;/li&gt;&lt;li&gt;Do another loop unless ELDEST is younger than YOUNGEST.&lt;br&gt;The desired result of this design is&amp;nbsp;DELETE&amp;nbsp;statements that look like the following example, assuming a NIBBLESIZE of 5:31 minutes:&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;DELETE * FROM X WHERE sys_created_on &amp;lt; &quot;2015-02-34 02:15:27&quot;
DELETE * FROM X WHERE sys_created_on &amp;lt; &quot;2015-02-34 02:20:38&quot;
DELETE * FROM X WHERE sys_created_on &amp;lt; &quot;2015-02-34 02:25:59&quot;
... &lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The localhost logs will contain output like the following examples:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Every time a chunk delete begins for a new table:&lt;br&gt;&lt;code&gt;TableCleaner&lt;/code&gt; deleting by key: &lt;code&gt;&amp;lt;column name&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Every time an iterative delete completes cleaning a table:&lt;br&gt;&lt;code&gt;TableCleaner&lt;/code&gt; DELETED approximately &lt;code&gt;&amp;lt;number of records deleted in that nibble&amp;gt;&lt;/code&gt;&amp;nbsp;old records from &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;&amp;nbsp;via&amp;nbsp;&lt;strong&gt;iterative deletes&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Every time a nibble completes:&lt;br&gt;&lt;code&gt;TableCleaner&lt;/code&gt; DELETED approximately &lt;code&gt;&amp;lt;number of records deleted in that nibble&amp;gt;&lt;/code&gt;&amp;nbsp;old records from &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;&amp;nbsp;via&amp;nbsp;**nibble&lt;br&gt;**&lt;/li&gt;&lt;li&gt;Every time a chunk completes:&lt;br&gt;&lt;code&gt;TableCleaner&lt;/code&gt; DELETED approximately &lt;code&gt;&amp;lt;number of records deleted in that nibble&amp;gt;&lt;/code&gt; old records from &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; via&amp;nbsp;&lt;strong&gt;chunk&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Every time either nibble or chunk completes cleaning a table:&lt;br&gt;&lt;code&gt;TableCleaner&lt;/code&gt; DELETED approximately &lt;code&gt;&amp;lt;number of records deleted in total for a table&amp;gt;&lt;/code&gt; old records from &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; via&amp;nbsp;&lt;strong&gt;bulk operations&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;solutions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#solutions&quot; class=&quot;heading-anchor&quot;&gt;Solutions&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&quot;performance-degradation-during-table-cleaner&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#performance-degradation-during-table-cleaner&quot; class=&quot;heading-anchor&quot;&gt;&lt;strong&gt;Performance Degradation&amp;nbsp;during Table Cleaner&lt;/strong&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The table cleaning operation attempts to avoid any database locking by cleaning in small chunks. However, even a small chunk of records can take a very long time to delete if the WHERE clause is inefficient.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The steps for troubleshooting this are the same as the steps below for #2.&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;replication-impact&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#replication-impact&quot; class=&quot;heading-anchor&quot;&gt;&lt;strong&gt;Replication Impact&lt;/strong&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Sometimes the high volume of delete operations creates enough write traffic that the secondary databases cannot keep up with replication. If this occurs, you can throttle Table cleaner using the following properties or attributes:&lt;/p&gt;&lt;p&gt;Nibble and Chunk sleep controls how long TableCleaner will wait between each delete statement (be they nibble or chunk). Each delete is timed. This value is then multiplied by a number determined by the following property and attribute. The resulting multiplication result is how long the TableCleaner will wait between delete statements.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;glide.db.nibble.sleep&lt;/code&gt; - property to control global multiplication factor for nibble sleep. Default is 1. (e.g. for every second spent doing a delete, spend 1 second sleeping)&lt;/li&gt;&lt;li&gt;&lt;code&gt;nibble_sleep&lt;/code&gt; - attribute on the “collection” type &lt;code&gt;sys_dictionary&lt;/code&gt; record for the desired table to control table level multiplication factor for nibble sleep to override the global default.&lt;/li&gt;&lt;li&gt;&lt;code&gt;glide.db.tablecleaner.chunk_delete_sleep&lt;/code&gt; - property to control global multiplication factor for chunk sleep. Chunk sleep has a hard coded x/2 denominator. Default is 0 - meaning that there are no sleeps between chunk deletes by default. (e.g. if you set this value to 1, then for every second spent doing a chunk delete, spend 1/2 seconds sleeping.)&lt;/li&gt;&lt;li&gt;&lt;code&gt;chunk_delete_sleep&lt;/code&gt; - attribute on the “collection” type &lt;code&gt;sys_dictionary&lt;/code&gt; record for the desired table to control table level multiplication factor for chunk sleep to override the global default.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;table-cleaner-is-running-longer-than-expected&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#table-cleaner-is-running-longer-than-expected&quot; class=&quot;heading-anchor&quot;&gt;&lt;strong&gt;Table Cleaner is Running Longer than&amp;nbsp;Expected&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Generally, the table cleaner should be completed in a few seconds to 1 or 2 minutes. If you suspect the table cleaner is running too long, check the following:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;In the localhost logs check the&amp;nbsp;TableCleaner DELETED&amp;nbsp;messages.&lt;ol&gt;&lt;li&gt;What table is running the longest? There will usually be one very clear front runner.&lt;/li&gt;&lt;li&gt;Are the nibble sizes around 250 to 1,000? If not, check to see if the user is experiencing&amp;nbsp;&lt;a href=&quot;https://support.servicenow.com/nav_to.do?uri=problem.do?sys_id=135a60970f568a001c7e938172050e53&quot; rel=&quot;noopener&quot;&gt;PRB646685&lt;/a&gt;&amp;nbsp;(see below)&lt;/li&gt;&lt;li&gt;Is the table being cleaned with&amp;nbsp;&lt;em&gt;iterative&lt;/em&gt;&amp;nbsp;mode? Iterative mode is the least efficient mode. Find out if the table can be cleaned without iterative mode.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Review the Transaction Logs table.&lt;ol&gt;&lt;li&gt;Is the SQL Time taking over 50% of the total job execution time? If so, the cause may be related to the database.&lt;ol&gt;&lt;li&gt;Review the localhost logs or MySQL process list logs to see if any long-running queries were being executed by Table Cleaner.&lt;/li&gt;&lt;li&gt;Is there a single DELETE query that is running long and a large number of INSERT/UPDATE queries that seem to be blocked? This problem is caused by a behavior known as “gap-lock” that is required to freeze any record in the “gap” between points on an index. This issue can be avoided by basing DELETE operations on the sys_id column - using “chunk” deletes in Helsinki (&lt;a href=&quot;https://support.servicenow.com/problem.do?sysparm_query=number=PRB650197&quot; title=&quot;PRB650197&quot; rel=&quot;noopener&quot;&gt;PRB650197&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Table Cleaner should always have a supporting indexed column to build the WHERE clause of its query. The operations that Table Cleaner executes should only be a few milliseconds each. Make sure that the query and the database have been optimized. There is a known case of such missing indexes for the Discovery tables documented in&amp;nbsp;&lt;a href=&quot;https://support.servicenow.com/nav_to.do?uri=problem.do?sys_id=35aecdae6f6c7180a2c1f7307f3ee457&quot; title=&quot;PRB616428&quot; rel=&quot;noopener&quot;&gt;PRB616428&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Table Cleaner will run a table locking optimize operation if 50% or more of the rows in a table have been deleted. The only exception to this rule is if the table has the “&lt;code&gt;no_optimize&lt;/code&gt;” attribute on the System Dictionary record. The only &lt;code&gt;syslog_transaction&lt;/code&gt; has this attribute out-of-the-box. Keep this in mind if you are implementing a new Table Cleaner. One particularly tricky way this can hurt you is if you are cleaning a small table that is a part of a very large table hierarchy. For example, suppose you have only 10,000 &lt;code&gt;cmdb_ci_cloud_template&lt;/code&gt; records, but your total CMDB hierarchy has 20 million records. If you clean 5,000 or more of your &lt;code&gt;cmdb_ci_cloud_template&lt;/code&gt; records, the platform will consider that more than 50% of the table being cleaned and will initiate a costly table optimize on the entire 20 million record CMDB table hierarchy since it is technically all a single table on the database!&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;If the time is not being taken up in SQL, the only other likely option is some kind of defect with the platform scheduled job mechanism. This category of problem is beyond the scope of this article.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0551417&quot; rel=&quot;noopener&quot;&gt;KB0551417 - Troubleshooting the Table Cleaner Scheduled Job - Support and Troubleshooting (servicenow.com)&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;notes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/table-cleaners-troubleshooting/#notes&quot; class=&quot;heading-anchor&quot;&gt;Notes&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You can check if a table cleaner ran by going to &lt;code&gt;sys_auto_flush_run&lt;/code&gt; on your instance&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Run a Trigger as System from a script</title>
      <link href="https://jace.pro/blog/run-a-trigger-as-system-from-a-script/" />
      <updated>2024-11-01T00:00:00Z</updated>
      <id>https://jace.pro/blog/run-a-trigger-as-system-from-a-script/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0820233&quot; rel=&quot;noopener&quot;&gt;How to excute a script as system - Support and Troubleshooting (servicenow.com)&lt;/a&gt;&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//get the gr of whatever record you want current to be on the script &lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sc_req_item&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;aeed229047801200e0ef563dbb9a71c2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;     

&lt;span class=&quot;token comment&quot;&gt;//execute one second after running this script&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gdt &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideDateTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gdt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addSeconds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gdt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;//define the script you want to run, in this example it&#39;s the stack trace, and don&#39;t forget to escape special charectors&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; script &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gs.log(&#39;***** DEBUG - op:&#39;+ current.operation() + &#39;, sess:&#39; + gs.getSessionID() + &#39;, time:&#39; + new Date().getTime() + &#39;, sys_id:&#39; + current.sys_id + &#39; - &#92;&#92;n&#39; + GlideLog.getStackTrace(new Packages.java.lang.Throwable()), &#39;Stacktrace Debug&#39;);&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;//create the sys_trigger record to be executed by the schedule worker thread&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sched &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ScheduleOnce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
sched&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;script &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; script&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
sched&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gdt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
sched&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setDocument&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
sched&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setLabel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;run this as system&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
sched&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;schedule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Developer Guidelines (have ai rewrite each line in my voice)</title>
      <link href="https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/" />
      <updated>2024-11-01T00:00:00Z</updated>
      <id>https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/</id>
      <content type="html">
				&lt;h2 id=&quot;update-sets&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/#update-sets&quot; class=&quot;heading-anchor&quot;&gt;Update sets&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;If an update is identified to be in the incorrect update set (or should not be in an update set), go to `sys_update_xml` table and change the update set field to reflect the correct update set (Default in the appropriate scope if removing).&lt;/li&gt;&lt;li&gt;The Description field on each Update set can include a brief description of the change being made for future reference.&amp;nbsp; You can copy and paste the contents of the card’s description into the update set’s description as an easy option.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;table-and-fields&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/#table-and-fields&quot; class=&quot;heading-anchor&quot;&gt;Table &amp;amp; fields&lt;/a&gt;&lt;/h2&gt;&lt;ol start=&quot;3&quot;&gt;&lt;li&gt;Extend a table rather than creating a new one if an existing table contains fields, attributes, and scripts that meet the requirement.&amp;nbsp;&lt;br&gt;Give tables a singular name; fields may have a singular or plural name.&lt;/li&gt;&lt;li&gt;Use drop-down fields with Yes, No and Null instead of True/False, especially if the field is required.&lt;/li&gt;&lt;li&gt;Label fields according to ServiceNow’s standard of sentence case (e.g., &quot;Focus area,&quot;not “Focus Area”) and no more than two words.&lt;/li&gt;&lt;li&gt;Use fields as designed / intended and do not repurpose them.&lt;/li&gt;&lt;li&gt;Use view rules to automatically set the correct view if more than one view is used for a particular table for different teams/types of tasks.&lt;/li&gt;&lt;li&gt;Fields should be auto populated when the data can be looked up in the system (such as the logged in user or current date).&lt;/li&gt;&lt;li&gt;All reference fields should at minimum include a query of &lt;code&gt;active=true&lt;/code&gt; if the table has an active flag (and there’s not a specific need to include inactive records).&lt;/li&gt;&lt;li&gt;When deleting a table, remove it’s associated license association &lt;code&gt;ua_custom_table_inventory&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;scripting&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/#scripting&quot; class=&quot;heading-anchor&quot;&gt;Scripting&lt;/a&gt;&lt;/h2&gt;&lt;ol start=&quot;11&quot;&gt;&lt;li&gt;&lt;p&gt;Use comments to educate others on the script functionality and changes made.&amp;nbsp; For example, comments could be used in the following locations:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Include the task and date to document the original card that this change was completed for.&lt;/li&gt;&lt;li&gt;Groups of variables or objects (a single line describing what each group is for)&lt;/li&gt;&lt;li&gt;Functions (describe in a few lines the purpose of the function and what arguments or return values it uses)&lt;/li&gt;&lt;li&gt;If blocks or for/while loops (describe the purpose of each)&lt;/li&gt;&lt;li&gt;Comments should not be added to an OOB script object unless it’s around new customization.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Use white space and indentation to make the code more readable for future developers. Click the format code button in the syntax editor to apply automatic formatting.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Name variables using camelCase.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Name glide record variables with a relevant keyword to the type of record and GR, such as &lt;code&gt;incidentGR&lt;/code&gt; or &lt;code&gt;userGR&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Return some type of value (e.g., integer, true/false) from a function.&amp;nbsp;&lt;br&gt;&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0538866&quot; rel=&quot;noopener&quot;&gt;Best Practices – System Properties - Support and Troubleshooting (servicenow.com)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Respect the active field when performing reference field lookups.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Create assignment group records in production following the standard process and then export the xml file to import into non-production instances for development.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Store function results in variables.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Encode queries for &lt;code&gt;GlideRecord&lt;/code&gt; API calls (via the &lt;code&gt;addEncodedQuery()&lt;/code&gt; method) rather than using the&amp;nbsp;&lt;code&gt;addQuery()&lt;/code&gt; or &lt;code&gt;addOrCondition()&lt;/code&gt; methods for complex queries.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Use the &lt;code&gt;getDisplayValue()&lt;/code&gt; method in place of directly referencing the name or number field.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Use the Filter Conditions where possible.&amp;nbsp; If the condition is complex, use a function, in a script include, called from the condition field.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Log statements using &lt;code&gt;gs.debug()&lt;/code&gt;, &lt;code&gt;gs.info()&lt;/code&gt;, &lt;code&gt;gs.warn()&lt;/code&gt;, &lt;code&gt;gs.error()&lt;/code&gt; rather than &lt;code&gt;gs.print()&lt;/code&gt; and &lt;code&gt;gs.log()&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Use try / catch in your coding to ensure you are addressing any errors.&amp;nbsp; Make sure errors are outputted in a meaningful way vs. just catching them and not logging them.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Keep business rules simple by using actions instead of scripting where possible.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Update the current record using an on before business rule and update related records using an on after or async business rule.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Never use &lt;code&gt;current.update()&lt;/code&gt; in an on before business rule&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Never create a global business rule. Instead, write script includes and call the necessary functions.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Codeless configuration via UI Policies is preferable over client scripts where possible.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Use the GlideForm API.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If synchronous calls from a client script must be made via the GlideRecord API or the getReference() method, use a callback function.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Use scripting as a last resort to build your logic in the UI policy and UI policy actions.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Never run automated tests on a production instance.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Avoid using multiple AJAX calls on the form when possible so that load times are faster.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;atf&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/#atf&quot; class=&quot;heading-anchor&quot;&gt;ATF&lt;/a&gt;&lt;/h2&gt;&lt;ol start=&quot;33&quot;&gt;&lt;li&gt;&lt;p&gt;Start an ATF test by copying a Quick Start Test, then modifying as required instead of starting from scratch.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ATF Components should be used appropriately, including:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Parameterized Tests: Use case best for when need to test multiple data sets against the same tests.&lt;/li&gt;&lt;li&gt;Templates: Saves a set of test steps that can be retrieved/inserted into a test anywhere - prompts for table, then manually fill out the test criteria&lt;/li&gt;&lt;li&gt;Suites: Suites can be nested, but each suite can only have 1 parent. One parent can have many children suites.&lt;/li&gt;&lt;li&gt;Copying Tests: Another alternative to creating tests rather than starting from scratch&lt;/li&gt;&lt;li&gt;Tests: Can only pass inputs/outputs within a test, not outside of the test&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;transform-maps&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/#transform-maps&quot; class=&quot;heading-anchor&quot;&gt;Transform Maps&lt;/a&gt;&lt;/h2&gt;&lt;ol start=&quot;35&quot;&gt;&lt;li&gt;If using an &lt;code&gt;onBefore&lt;/code&gt; script to set the row to ignore a row in certain conditions, and an &lt;code&gt;onAfter&lt;/code&gt; to do further processing, use the following code to stop the &lt;code&gt;onAfter&lt;/code&gt; from running as setting the row to ignore does not always stop the transform.&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;source&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sys_import_state&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;ignored&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
   &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;reports&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/#reports&quot; class=&quot;heading-anchor&quot;&gt;Reports&lt;/a&gt;&lt;/h2&gt;&lt;ol start=&quot;36&quot;&gt;&lt;li&gt;Never share dashboards with broad roles such as &lt;code&gt;itil&lt;/code&gt;. Instead, identify the narrowest set of users as will regularly use the dashboard and share only with them.&lt;/li&gt;&lt;li&gt;When updating an out of box report or dashboard, save and insert to create a copy that you can then modify as needed.&lt;/li&gt;&lt;li&gt;Always name reports and dashboards according to their intended audience and purpose.&lt;/li&gt;&lt;li&gt;Always share reports only with those users who need to see it.&lt;/li&gt;&lt;li&gt;Always create tabs on a dashboard to enhance the usability and performance.&lt;/li&gt;&lt;li&gt;Always share dashboards and the underlying reports with the same groups to ensure visibility and access to the underlying data.&lt;/li&gt;&lt;li&gt;Share dashboards and reports with groups rather than individual users.&lt;/li&gt;&lt;li&gt;Place indicators such as single score widgets at the top of a dashboard tab with charts in the middle and list widgets at the bottom.&lt;/li&gt;&lt;li&gt;Use reference fields to join tables for reporting rather than creating database views. If a database view is needed, test the reports carefully to gauge the potential impact to performance.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;workflows-and-flows&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/#workflows-and-flows&quot; class=&quot;heading-anchor&quot;&gt;Workflows &amp;amp; flows&lt;/a&gt;&lt;/h2&gt;&lt;ol start=&quot;45&quot;&gt;&lt;li&gt;Never create conflicting logic with business rules and workflows&lt;/li&gt;&lt;li&gt;Flow Designer trigger types - &lt;a href=&quot;https://www.servicenow.com/community/incident-management-forum/i-want-to-know-about-flow-designer-concept/m-p/2458846&quot; rel=&quot;noopener&quot;&gt;https://www.servicenow.com/community/incident-management-forum/i-want-to-know-about-flow-designer-concept/m-p/2458846&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Include a description that identifies what the workflow is used for and what it does. If it is only designed to work for a specific catalog item, etc. make sure to identify that.&lt;/li&gt;&lt;li&gt;Credentials should be setup with the correct mid servers/capabilities, so they do not get used in an unintended way.&lt;/li&gt;&lt;li&gt;Make sure that you’re in your update set whenever working on a flow, subflow, or action.&amp;nbsp; Unlike workflow, it captures updates prior to it being published.&lt;/li&gt;&lt;li&gt;Look for and use a generic action or subflow for common functions instead of recreating it for a common step, such as getting a manager or director approval. If one does not exist, try to create a generic one instead of one specific to your use case.&lt;/li&gt;&lt;li&gt;When requesting an approval, always check if it was rejected first, then proceed with the flow in an else instead of checking if its approved.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;ci-classification-pattern-selection&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/#ci-classification-pattern-selection&quot; class=&quot;heading-anchor&quot;&gt;CI Classification Pattern Selection&lt;/a&gt;&lt;/h2&gt;&lt;ol start=&quot;52&quot;&gt;&lt;li&gt;&lt;p&gt;When creating a new pattern or updating a pattern execution, be sure to set the Discovery Classification Process to select the desired discovery pattern to be executed:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Ensure the pattern to be executed exists and is active.&amp;nbsp; Open Pattern Designer --&amp;gt; Discovery Patterns and search for your desired pattern name.&amp;nbsp; Check the Active flag.&lt;/li&gt;&lt;li&gt;Find the Process Classification record for the device or process type.&amp;nbsp; Open&amp;nbsp; Discovery --&amp;gt;&amp;nbsp; CI Classification&amp;nbsp; --&amp;gt; Process.&amp;nbsp; Search for the type of discovery classification desired.&amp;nbsp; Open the record once found.&lt;/li&gt;&lt;li&gt;At the bottom of the record opened check the related list tab TRIGGERS PROBES.&amp;nbsp; Check the Condition Script field to find the type of occurrence execution desired (type = Linux).&amp;nbsp;&amp;nbsp; The Pattern field will be the name of the pattern executed when this type of device or service is to be executed.&lt;/li&gt;&lt;li&gt;Update as needed.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;skip-remediation-for-an-upgrade-or-a-patch&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/#skip-remediation-for-an-upgrade-or-a-patch&quot; class=&quot;heading-anchor&quot;&gt;Skip Remediation for an upgrade&amp;nbsp;or a patch&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;For each update, confirm which of the following categories the skip falls into.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Skipped Error, or other non-actionable record.&amp;nbsp; – Set to “Reviewed” and add a comment such as “Error – no action available.”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Related List, Form Section, List Layout&lt;/p&gt;&lt;ol&gt;&lt;li&gt;For &lt;strong&gt;patches&lt;/strong&gt; we do not generally review these as they are very hard to compare using the XML format and we are generally not able to get OOB PDI’s for the specific patch versions.&amp;nbsp; Set to Reviewed and Retained, and add a comment such as “Related List, so was not able to review.&amp;nbsp; Will take further action during next major upgrade.”&lt;/li&gt;&lt;li&gt;For &lt;strong&gt;upgrades&lt;/strong&gt; we do this. On a OOB PDI, compare changes from our instances, to the PDI.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Other type of object – Compare the new OOB version vs. the current version.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;If there are no differences, it should be reverted.&amp;nbsp; Make sure to click Revert first, then add a comment, otherwise, the comment will wipe out when you click the button.&lt;/li&gt;&lt;li&gt;If there are differences, and it’s clear what is our customization vs. OOB, take the OOB changes, leaving our customizations in place.&amp;nbsp; Set it to Reviewed and Merged, with a comment stating what you took and what you didn’t.&amp;nbsp; Use “CUSTOMIZATION START” and “CUSTOMIZATION END” in scripted objects to make skip remediation in the future where applicable.&amp;nbsp; Be very careful to ensure parentheses and curly brackets still match up correctly.&lt;/li&gt;&lt;li&gt;If you think it is not a meaningful customization and should be reverted, verify with your team and take action.&lt;/li&gt;&lt;li&gt;NOTE: There are certain things in base versions provided by the vendor that they have otherwise published as bad practices (e.g. Reports that are published which makes them available without authentication).&amp;nbsp; Unfortunately, we must leave that customization in place.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;after-skip-remediation-is-completed&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/#after-skip-remediation-is-completed&quot; class=&quot;heading-anchor&quot;&gt;After skip remediation is completed&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Make sure that you don’t have any updates in an update set where the scope doesn’t match.&amp;nbsp; This is very easy to do in this process.&amp;nbsp; Move any in the wrong scoped update set to an appropriate one.&lt;/li&gt;&lt;li&gt;Remove all Upgrade Details.&amp;nbsp; These create errors when trying to move an update set to another environment.&lt;/li&gt;&lt;li&gt;Batch all update sets together.&lt;/li&gt;&lt;li&gt;Move it up.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;helpful-hints&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/developer-guidelines-have-ai-rewrite-each-line-in-my-voice/#helpful-hints&quot; class=&quot;heading-anchor&quot;&gt;Helpful Hints&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;If it’s known we’re keeping the customization, but you’re struggling to tell what’s OOB vs. what’s a customization, make sure to compare current OOB vs. upgraded OOB versions so you know what was changed then apply those changes in the resolve conflicts screen.&lt;/li&gt;&lt;li&gt;Quering &lt;code&gt;sys_upgrade_history_log&lt;/code&gt; may show this was also updated through a plugin upgrade or something else more recently.&amp;nbsp; Try updating it through that record instead.&lt;/li&gt;&lt;li&gt;For non-scripted objects, such as forms and lists, its often easier to update it through the normal interface, instead of the backend record (Form Layout vs. &lt;code&gt;sys_ui_section&lt;/code&gt;).&amp;nbsp; That’s fine, as long as you go back and update the skip appropriately.&lt;/li&gt;&lt;li&gt;Don’t be afraid to ask other developers to research and make a recommendation on what to do.&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Batching Updates (GlideRecord and GlideMultipleUpdate)</title>
      <link href="https://jace.pro/blog/batching-updates-gliderecord-and-glidemultipleupdate/" />
      <updated>2024-11-01T00:00:00Z</updated>
      <id>https://jace.pro/blog/batching-updates-gliderecord-and-glidemultipleupdate/</id>
      <content type="html">
				&lt;p&gt;Update Many does not need &lt;code&gt;.query()&lt;/code&gt;&lt;br&gt;Update Many does not work with &lt;code&gt;.chooseWindow()&lt;/code&gt; or &lt;code&gt;.setLimit()&lt;/code&gt;&lt;/p&gt;&lt;h2 id=&quot;glass-putan-post&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/batching-updates-gliderecord-and-glidemultipleupdate/#glass-putan-post&quot; class=&quot;heading-anchor&quot;&gt;Glass’ Putan Post&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://glassputan.wordpress.com/2012/01/26/updating-multiple-entries/&quot; rel=&quot;noopener&quot;&gt;Updating Multiple Entries | Glass &#39;putan with Service-Now (wordpress.com)&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;This does not work for inherited tables. For example if you inherit from task (incident, change) and try to use a field on task in your query clause, you will end up updating every record&lt;/p&gt;&lt;p&gt;How to do it:&lt;br&gt;Normally when iterating trough a list of records, you would create a GlideRecord object, execute a query, iterate though each return and update the records one at a time.&lt;/p&gt;&lt;/blockquote&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; mu &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sys_user&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   mu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;column_to_search&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;value_to_search_on&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   my&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      mu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;column_to_set&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;new_value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      mu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Exceptionht: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; xx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;Using this method also has a strong chance of timing out with larger data sets and face it, this is great for those paid by the hour, but in our situation where extra time is our time, there’s a better way to do it.&lt;/p&gt;&lt;/blockquote&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; mu &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Packages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;glide&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;db&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MultipleUpdate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sys_user  mu.addQuery(&quot;&lt;/span&gt;column_to_search&lt;span class=&quot;token string&quot;&gt;&quot;,&quot;&lt;/span&gt;value_to_search_on&quot;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   mu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;column_to_set&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;new_value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   mu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Exceptionht: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; xx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;What this does:&lt;br&gt;This package basically generates a SQL command that’s executed behind the scenes.&lt;br&gt;In this case it would look something like:&lt;/p&gt;&lt;p&gt;&lt;code&gt;update sys_user set column_to_set=&quot;new_value&quot; where column_to_search=&quot;value_to_search_on&quot;&lt;/code&gt;&lt;br&gt;Disclaimer:&lt;br&gt;These tips and tricks are to give you more power to handle the tasks that you may face developing and maintaining the Service-Now application. Use them at our own risk, and by all means use them in a “sand box” environment first. With great power, comes great responsibility.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;community-post-how-to-do-a-mass-update-all&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/batching-updates-gliderecord-and-glidemultipleupdate/#community-post-how-to-do-a-mass-update-all&quot; class=&quot;heading-anchor&quot;&gt;Community Post - How to do a mass ‘Update All’&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.servicenow.com/community/developer-forum/how-to-do-a-mass-update-all/m-p/1462601/highlight/true#M119527&quot; rel=&quot;noopener&quot;&gt;Solved: Re: How to do a mass ‘Update All’ - ServiceNow Community&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://glassputan.wordpress.com/2012/01/26/updating-multiple-entries/&quot; title=&quot;https://glassputan.wordpress.com/2012/01/26/updating-multiple-entries/&quot; rel=&quot;noopener&quot;&gt;Updating Multiple Entries | Glass &#39;putan with Service-Now&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Because of its age it does use an old package call. &amp;nbsp; Here is an out of the box example of its use with import sets when you click “reprocess”. &amp;nbsp; Make sure you use the new &lt;code&gt;GlideMultipleUpdate&lt;/code&gt; API call instead.&lt;/p&gt;&lt;/blockquote&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; mu &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideMultipleUpdate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sys_import_set_row&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
mu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sys_import_set&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
mu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sys_import_state&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pending&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
mu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;community-post-updatemultiple-doesnt-update-system-fields&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/batching-updates-gliderecord-and-glidemultipleupdate/#community-post-updatemultiple-doesnt-update-system-fields&quot; class=&quot;heading-anchor&quot;&gt;Community Post - updateMultiple() doesn’t update system fields&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.servicenow.com/community/now-platform-forum/updatemultiple-doesn-t-update-system-fields-like-sys-updated-on/m-p/2616035/highlight/true#M190371&quot; rel=&quot;noopener&quot;&gt;Re: updateMultiple() doesn’t update system fields … - ServiceNow Community&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Matthew Watkins&lt;br&gt;I’m surprised that this isn’t documented anywhere else, but it seems this is a little known platform behavior. In almost all cases, &lt;code&gt;GlideRecord.updateMultiple()&lt;/code&gt; is going to execute as an iterative update in the background&amp;nbsp;(i.e. 1,000 records updated results in 1,000 UPDATE statements in SQL since we basically just loop over all the matching records and call &lt;code&gt;GlideRecord.update()&lt;/code&gt; on them). During the iterative update operation, the business logic will execute that records the sys_ field changes (this is in the Java layer), but there is an exception. If you run &lt;code&gt;GlideRecord.updateMultiple&lt;/code&gt; on a table that&amp;nbsp;DOES NOT&amp;nbsp;meet any of the criteria at the bottom, then it will not run as an iterative update, it will run as&amp;nbsp;&lt;a href=&quot;https://www.servicenow.com/community/developer-forum/how-to-do-a-mass-update-all/m-p/1462600&quot; rel=&quot;noopener&quot;&gt;GlideMultipleUpdate&lt;/a&gt;&amp;nbsp;(which I don’t think we’ve ever officially documented) and it will execute a single database operation (i.e. 1,000 records updated results in only 1 UPDATE statement in SQL!). Another side effect of &lt;code&gt;GlideMultipleUpdate&lt;/code&gt; is that it doesn’t update the sys_ fields unless you explicitly tell it to.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Table is text indexed&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Table is audited&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;SetWorkflow(false)&lt;/code&gt; has not been called and table or it’s children have any before or after update business rules&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Table has any restricted cascade rule&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Table has any currency fields&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Table has the attribute “&lt;code&gt;iterativeDelete&lt;/code&gt;” set true&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Table has the attribute “&lt;code&gt;update_synch&lt;/code&gt;” set true&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Table is registered with a Record Watcher&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Table is replicated by IDR&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Operation is against the&amp;nbsp;&lt;code&gt;sys_administrative_script_transaction&lt;/code&gt; table&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Approval field and why it works the way it does</title>
      <link href="https://jace.pro/blog/approval-field-and-why-it-works-the-way-it-does/" />
      <updated>2024-11-01T00:00:00Z</updated>
      <id>https://jace.pro/blog/approval-field-and-why-it-works-the-way-it-does/</id>
      <content type="html">
				&lt;ol&gt;&lt;li&gt;There’s the told approval engine that I believe evaluates the &lt;code&gt;sysrule_approvals&lt;/code&gt; and &lt;code&gt;process_guide&lt;/code&gt; records. There’s a number of approval rules against &lt;code&gt;sc_request&lt;/code&gt;&lt;br&gt;Depending on how the &lt;code&gt;approval_engines.do&lt;/code&gt; page is configured controls how the legacy approvals work. Lets look at the three tables in question;&lt;ol&gt;&lt;li&gt;Catalog Task is set to use Process Guides&lt;/li&gt;&lt;li&gt;Requested Item using approval engine when it’s associated to a delivery plan, otherwise it’s handled in the workflow or flow.&lt;/li&gt;&lt;li&gt;Request is managed by workflows only.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Catalog Task Process Guide&lt;ol&gt;&lt;li&gt;Catalog Task Default ( when this condition is true &lt;code&gt;state=1^delivery_task.sys_class_name=cat_item_dt_approval&lt;/code&gt;)&lt;br&gt;Today we have &lt;a href=&quot;https://deltasndev.service-now.com/sc_cat_item_list.do?sysparm_query=type!%3Dbundle%5Esys_class_name!%3Dsc_cat_item_guide%5Etype!%3Dpackage%5Esys_class_name!%3Dsc_cat_item_content%5Epublished_refISEMPTY%5Edelivery_planISNOTEMPTY%5Eactive%3Dtrue%5Esys_class_name!%3Dstd_change_record_producer%5EORsys_class_name%3DNULL%5Esys_class_name!%3Dsc_cat_item_producer%5EORsys_class_name%3DNULL%5Esys_class_name!%3Dsc_cat_item_composite_producer%5EORsys_class_name%3DNULL%5Esys_class_name!%3Dpc_product_cat_item%5EORsys_class_name%3DNULL&amp;amp;sysparm_view=&quot; rel=&quot;noopener&quot;&gt;9 items using DEFAULT execution plan here&lt;/a&gt;.&lt;br&gt;Those invoke a call to this script include &lt;code&gt;GlideappTaskApprovalHelper&lt;/code&gt; which is hidden/unavailable but is setting the approval to &lt;code&gt;requested&lt;/code&gt; when there are no approvers.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Catalog Task Business Rules&lt;ol&gt;&lt;li&gt;Auto Close on Approval - This is used on Execution Plan tasks and sets the &lt;code&gt;active&lt;/code&gt; and &lt;code&gt;work_end&lt;/code&gt; fields.&lt;/li&gt;&lt;li&gt;Reject Parent - This is used on Execution Plan tasks and sets the &lt;code&gt;sc_req_item.approval&lt;/code&gt; based on the &lt;code&gt;sc_task&lt;/code&gt; if it’s rejected.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Task Business Rules&lt;ol&gt;&lt;li&gt;Stamp Approvals - This sets &lt;code&gt;approval_set&lt;/code&gt; to the current time when approved or rejected, otherwise it clears the value.&lt;/li&gt;&lt;li&gt;Moot Approvals Upon Cancellation - This looks at all individual and group approvals for the current task, if the state of the &lt;code&gt;sysapproval_approver&lt;/code&gt; or &lt;code&gt;sysapproveral_group&lt;/code&gt; are &lt;code&gt;requested&lt;/code&gt; or &lt;code&gt;not requested&lt;/code&gt; this sets’ the approval record to &lt;code&gt;not_required&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;task events - This generates events that notifications and script actions can trigger against.&lt;ol&gt;&lt;li&gt;&lt;code&gt;task.approved&lt;/code&gt; - no script actions against this&lt;/li&gt;&lt;li&gt;&lt;code&gt;task.rejected&lt;/code&gt; - no script actions against this&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Requested Items Approval Engines - &lt;a href=&quot;https://deltasndev.service-now.com/sysrule_approvals_list.do?sysparm_query=active%3Dtrue%5Etable%3Dsc_req_item&amp;amp;sysparm_view=&quot; rel=&quot;noopener&quot;&gt;There are none&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Requested Items Workflows (&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0538552&quot; rel=&quot;noopener&quot;&gt;KB0538552&lt;/a&gt;)&lt;ol&gt;&lt;li&gt;&lt;code&gt;Approval Action&lt;/code&gt; - Sets the approval as configured.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Approval - User&lt;/code&gt; - Sets approval to Requested, and then Approved or Rejected as configured.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Approval - Group&lt;/code&gt; - Sets approval to Requested, and then Approved or Rejected as configured.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Rollback To&lt;/code&gt; - Sets approval to Not Yet Requested or Requested as configured.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Requested Items Flows&lt;ol&gt;&lt;li&gt;&lt;code&gt;Ask for Approval&lt;/code&gt; - Sets the approval to Requested, and then Approved or Rejected as configured.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Requested Items Business Rules&lt;ol&gt;&lt;li&gt;Items Added After Request Approved - runs &lt;strong&gt;before insert&lt;/strong&gt;, where &lt;strong&gt;&lt;code&gt;current.request.approval == approved and current.stage == waiting_for_approval&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;Then if the catalog item associated uses workflow or flow, set the &lt;strong&gt;&lt;code&gt;current.approval = requested&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;Else, &lt;strong&gt;&lt;code&gt;current.approval = current.request.approval&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Set RITM Due Date On Insert - calculates the &lt;code&gt;due_date&lt;/code&gt;&lt;/li&gt;&lt;li&gt;request item closure - cancels related approvals when the item becomes cancelled&lt;/li&gt;&lt;li&gt;sc_ic: Copy Approval Definitions - This calls &lt;code&gt;sc_ic_Factory&lt;/code&gt; which &lt;a href=&quot;https://docs.servicenow.com/bundle/vancouver-servicenow-platform/page/product/service-catalog-management/reference/r_InstalledWithCatalogItemDesigner.html&quot; rel=&quot;noopener&quot;&gt;deals with the catalog item designer&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;reject approval on closed incomplete - runs &lt;strong&gt;before insert or update&lt;/strong&gt; where &lt;strong&gt;&lt;code&gt;current.state.changesTo(4)&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;Then it sets the approval to rejected.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Request Workflows&lt;br&gt;2. Service Catalog Request &lt;strong&gt;active == true&lt;/strong&gt; (&lt;code&gt;no condition&lt;/code&gt;) set’s &lt;code&gt;approval&lt;/code&gt; to &lt;code&gt;requested&lt;/code&gt; then &lt;strong&gt;Marks task approved&lt;/strong&gt;&lt;br&gt;5. Source Request &lt;strong&gt;active == false&lt;/strong&gt; (&lt;code&gt;sourceable=true^approval=approved^EQ&lt;/code&gt;)&lt;br&gt;6. Service Catalog Request &lt;strong&gt;active == false&lt;/strong&gt; (&lt;code&gt;no condition&lt;/code&gt;)&lt;br&gt;7. Delta Hardware Catalog Generic &lt;strong&gt;active == false&lt;/strong&gt; (&lt;code&gt;parent.ref_sc_req_item.cat_item.category!=&amp;lt;hardware/software procurement^EQ&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Request Business Rules&lt;ol&gt;&lt;li&gt;request closure - this appears to cancel related approvals by calling &lt;code&gt;SNC.Request&lt;/code&gt; but that code is not accessible.&lt;/li&gt;&lt;li&gt;Set Request State - this sets the &lt;code&gt;sc_request.stage&lt;/code&gt; and &lt;code&gt;sc_request.state&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Cascade Request Approval to Request Item - runs &lt;strong&gt;after insert or update&lt;/strong&gt; where &lt;strong&gt;current.approval.changes()&lt;/strong&gt;&lt;br&gt;if the item is a sequenced request item, sets the stage to not started&lt;br&gt;else cascade the approval to the request item, which works differently for workflow, flow and delivery plan&lt;br&gt;workflow if current.hasWorkflow, if (stage is &lt;code&gt;waiting_for_approval&lt;/code&gt; or is sequenced item) and request.approval == approved, current.approval = &lt;code&gt;requested&lt;/code&gt;, else &lt;code&gt;rejected&lt;/code&gt;&lt;br&gt;flow if current.hasFlowDesigner, if (stage is &lt;code&gt;waiting_for_approval&lt;/code&gt; or is sequenced item) and request.approval == approved, current.approval = &lt;code&gt;requested&lt;/code&gt;, else &lt;code&gt;rejected&lt;/code&gt;&lt;br&gt;delivery plan copies the approval from the request.approval&lt;/li&gt;&lt;li&gt;sc request events - triggers events - look for script actions&lt;ol&gt;&lt;li&gt;sc_request.approved - no script action&lt;/li&gt;&lt;li&gt;other events not applicable&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Do you need new JavaScript to work in ServiceNow?</title>
      <link href="https://jace.pro/blog/do-you-need-new-javascript-to-work-in-servicenow/" />
      <updated>2024-10-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/do-you-need-new-javascript-to-work-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;Sometimes you need new code converted to things ServiceNow understands. Arrow functions now work in ServiceNow in some places but not others. &lt;code&gt;let&lt;/code&gt;, &lt;code&gt;const&lt;/code&gt; same thing.&lt;/p&gt;&lt;p&gt;Here’s a way to take any new script and make it work. This is called transpiling. It’s complicated. The way I understand it is, you give it new code, and it makes it work with and older set of JavaScript features that were available a long time ago using polyfills.&lt;/p&gt;&lt;p&gt;Enough dry stuff let’s get trying it.&lt;/p&gt;&lt;p&gt;Go to &lt;a href=&quot;https://babeljs.io/repl/&quot; rel=&quot;noopener&quot;&gt;babeljs.io/repl&lt;/a&gt; and set the target to, &lt;code&gt;defaults, ie 11&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Then paste in the new JavaScript. Or if you want something to start with try pasting this code.&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// see let becomes var&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// and () =&amp;gt; {} becomes function(..)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// lets try other things&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;red&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;green&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;blue&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// copying into a new object&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; person &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;token literal-property property&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MN&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* 
// if you uncomment this, it will add a polyfill to do this
let copy = {
 ...person
}
*/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That should become something like;&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// see let becomes var&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// and () =&amp;gt; {} becomse function(..)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// lets try other things&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// spread&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; red &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  green &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  blue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// copying into a new object&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; person &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MN&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* 
// if you uncomment this, it will add a polyfill to do this
let copy = {
  ...person
}
*/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Tools I am tracking</title>
      <link href="https://jace.pro/blog/tools-i-am-tracking/" />
      <updated>2024-10-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/tools-i-am-tracking/</id>
      <content type="html">
				&lt;h1 id=&quot;tools-im-tracking&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/tools-i-am-tracking/#tools-im-tracking&quot; class=&quot;heading-anchor&quot;&gt;Tools I’m tracking&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Look, in the circles I run we all use ServiceNow, but sometimes, you want a solution that doesnt have that same enterprise price. This is my note on what tools I’ve been dabbling with.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tool&lt;/th&gt;&lt;th&gt;Custom Forms&lt;/th&gt;&lt;th&gt;Automation&lt;/th&gt;&lt;th&gt;Whose Database&lt;/th&gt;&lt;th&gt;Pricing for 100 users&lt;/th&gt;&lt;th&gt;Difference&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/lpgp/pricing-itsm.html&quot; rel=&quot;noopener&quot;&gt;ServiceNow&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;Quote only&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.tooljet.com/pricing&quot; rel=&quot;noopener&quot;&gt;ToolJet&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yours&lt;/td&gt;&lt;td&gt;$0-24/user/mo&lt;/td&gt;&lt;td&gt;Can be selfhosted for cost at your cost.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.spiceworks.com/pricing/&quot; rel=&quot;noopener&quot;&gt;Spiceworks&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Yours&lt;/td&gt;&lt;td&gt;$0/user/mo&lt;/td&gt;&lt;td&gt;Makes money by serving ads.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.spiceworks.com/free-cloud-help-desk-software/&quot; rel=&quot;noopener&quot;&gt;Spiceworks Cloud&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;$0/user/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;[Appsmith]&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs or Yours&lt;/td&gt;&lt;td&gt;$0-16*/user/mo&lt;/td&gt;&lt;td&gt;Appsmith charges by hours used per agent at $0.40/hr.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://retool.com/pricing&quot; rel=&quot;noopener&quot;&gt;Retool&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs or Yours&lt;/td&gt;&lt;td&gt;$5-$10/user/mo&lt;/td&gt;&lt;td&gt;Granular Access Controls only for Enterprise clients&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://budibase.com/pricing/&quot; rel=&quot;noopener&quot;&gt;BudiBase&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs or Yours&lt;/td&gt;&lt;td&gt;$5-50/user/mo&lt;/td&gt;&lt;td&gt;Can be selfhosted, which gives you different limits.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.atlassian.com/software/jira/service-management/pricing&quot; rel=&quot;noopener&quot;&gt;Jira&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;$8-13/user/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;[Zoho ManageEngine ServiceDesk Plus]&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;$13-67/user/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.freshworks.com/freshservice/pricing/&quot; rel=&quot;noopener&quot;&gt;Freshservices&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;$19-119/user/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://airtable.com/pricing&quot; rel=&quot;noopener&quot;&gt;Airtable&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;$20-40/user/mo&lt;/td&gt;&lt;td&gt;Limited on Record count per “base” 50k-125k.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.solarwinds.com/service-desk/pricing&quot; rel=&quot;noopener&quot;&gt;SolarWinds&lt;/a&gt; ServiceDesk&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$39-99/user/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.zendesk.com/pricing/&quot; rel=&quot;noopener&quot;&gt;Zendesk&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;$55-115/user/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.bmc.com/it-solutions/bmc-helix-itsm.html&quot; rel=&quot;noopener&quot;&gt;BMC Helix ITSM&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;Quote only&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.ivanti.com/lp/esm/contact/enterprise-service-management&quot; rel=&quot;noopener&quot;&gt;Ivanti Service Manager&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Quote only&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.sysaid.com/plans&quot; rel=&quot;noopener&quot;&gt;SysAid&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Quote only&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;names-of-things-like-servicenow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/tools-i-am-tracking/#names-of-things-like-servicenow&quot; class=&quot;heading-anchor&quot;&gt;Names of things like ServiceNow&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Middleware&lt;/th&gt;&lt;th&gt;Cron Jobs&lt;/th&gt;&lt;th&gt;Portals&lt;/th&gt;&lt;th&gt;Access&lt;/th&gt;&lt;th&gt;Reporting&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ServiceNow&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Business Rules, Flows, Workflow&lt;/td&gt;&lt;td&gt;Scheduled Jobs/Flows&lt;/td&gt;&lt;td&gt;Service Portal&lt;/td&gt;&lt;td&gt;ACLs, Before Query Business Rules&lt;/td&gt;&lt;td&gt;Platform Analytics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;ToolJet&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Transformations&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;App&lt;/td&gt;&lt;td&gt;RBAC&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SpiceWorks&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Ticket Rules&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;User Portals&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Reports&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Appsmith&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;JS Objects, Actions&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;App&lt;/td&gt;&lt;td&gt;Granular Access Controls (GAC)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Retool&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Transformers&lt;/td&gt;&lt;td&gt;Workflows&lt;/td&gt;&lt;td&gt;App&lt;/td&gt;&lt;td&gt;RBAC&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Jira&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Automation Rules&lt;/td&gt;&lt;td&gt;Automation Rules&lt;/td&gt;&lt;td&gt;Customer Portal&lt;/td&gt;&lt;td&gt;Project Permissions&lt;/td&gt;&lt;td&gt;Jira Reports&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Zoho&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Workflows&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;App/Portal&lt;/td&gt;&lt;td&gt;Role-Based Permissions&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Freshservice&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Automations&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Self-Service&lt;/td&gt;&lt;td&gt;Roles and Permissions&lt;/td&gt;&lt;td&gt;Reports&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Airtable&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Automations&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Field &amp;amp; Table Permissions&lt;/td&gt;&lt;td&gt;Airtable Reporting&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SolarWinds ServiceDesk&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Automation Rules&lt;/td&gt;&lt;td&gt;Time Based Automations&lt;/td&gt;&lt;td&gt;Self-Service Portal&lt;/td&gt;&lt;td&gt;Roles and Permissions&lt;/td&gt;&lt;td&gt;Reports &amp;amp; Analytics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Zendesk&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Triggers, Automations&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Help Center, Web Widget&lt;/td&gt;&lt;td&gt;Custom Roles &amp;amp; Permissions&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;BMC Helix ITSM&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Business Rules, Workflow Orchestration&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Self-Service Portal&lt;/td&gt;&lt;td&gt;RBAC, Permission Models&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Ivanti Service Manager&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Workflows&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Service Portal&lt;/td&gt;&lt;td&gt;Role-Based Access Control (RBAC)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;SysAid&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Automations&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Self-Service Portal&lt;/td&gt;&lt;td&gt;Role-Based Access Control (RBAC)&lt;/td&gt;&lt;td&gt;SysAid Reports&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Getting the RSS Feed from a Youtube Page</title>
      <link href="https://jace.pro/blog/getting-the-rss-feed-from-a-youtube-page/" />
      <updated>2024-10-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/getting-the-rss-feed-from-a-youtube-page/</id>
      <content type="html">
				&lt;p&gt;Getting the RSS feed from Youtube Channels is harder and harder every year.&lt;/p&gt;&lt;p&gt;I wrote this up after looking for a few hours. This will if ran on a video page land you on the user’s “featured” page and from that page you can get the RSS Feed. Just paste this in your browsers console (hit f12 on your keyboard). If it doesn’t land you on the rss feed, run it a second time and it should.&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// if not currently on the channels&#39; featured page... go there&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// assume we&#39;re on youtube&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// 1 check if we&#39;re on a video page&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// e.g. https://www.youtube.com/watch?v=YyWZmdkPfDM&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// if so look for this element&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// &amp;lt;link rel=&quot;alternate&quot; media=&quot;handheld&quot; href=&quot;https://m.youtube.com/@google/featured&quot;&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// 2 if so, go to the channel featured page&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// if we&#39;re on th channel featured page, get the rss feed&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; isVideoPage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;watch?v=&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; channelLink &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;body&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;span[itemprop=&quot;author&quot;]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;link[itemprop=&quot;url&quot;]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// this is on every video and channel page&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// so if we&#39;re not on the featured page, go there&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; featuredPage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; channelLink &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;/featured&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; isFeaturedPage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; featuredPage&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;isVideoPage&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; channelLink&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; featuredPage&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isFeaturedPage&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;isFeaturedPage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; featuredPage&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; rssLink &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;link[type=&quot;application/rss+xml&quot;]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rssLink&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rssLink&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Comparing 9 Email as a Service Providers</title>
      <link href="https://jace.pro/blog/comparing-9-email-as-a-service-providers/" />
      <updated>2024-10-05T00:00:00Z</updated>
      <id>https://jace.pro/blog/comparing-9-email-as-a-service-providers/</id>
      <content type="html">
				&lt;h1 id=&quot;i-spent-weeks-comparing-9-email-as-a-service-providers-heres-what-i-found&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-9-email-as-a-service-providers/#i-spent-weeks-comparing-9-email-as-a-service-providers-heres-what-i-found&quot; class=&quot;heading-anchor&quot;&gt;I spent weeks comparing 9 email as a service providers. Here’s what I found.&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;A few years ago I was set on building a tool called Tskr, I still am. This post isn’t about Tskr though. You can read more on that at &lt;a href=&quot;https://tskr.io&quot; rel=&quot;noopener&quot;&gt;tskr.io&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This post is about the journey I took to find the best email as a service provider for Tskr. I spent weeks comparing 9 email as a service providers. Here’s what I found.&lt;/p&gt;&lt;p&gt;These notes may be a bit dated but they are probably still relevant. I hope you find them useful.&lt;/p&gt;&lt;h2 id=&quot;table-comparison&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-9-email-as-a-service-providers/#table-comparison&quot; class=&quot;heading-anchor&quot;&gt;Table comparison&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Many of these have free tiers.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Product&lt;/th&gt;&lt;th&gt;Outbound&lt;/th&gt;&lt;th&gt;Inbound&lt;/th&gt;&lt;th&gt;SMS&lt;/th&gt;&lt;th&gt;Tier Limits&lt;/th&gt;&lt;th&gt;Pricing&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mailgun.com&quot; rel=&quot;noopener&quot;&gt;Mailgun&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://documentation.mailgun.com/en/latest/quickstart-sending.html&quot; rel=&quot;noopener&quot;&gt;API&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://documentation.mailgun.com/en/latest/quickstart-receiving.html#supported-actions-for-routes&quot; rel=&quot;noopener&quot;&gt;Webhook&lt;/a&gt;&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;td&gt;100/day, 15k/mo&lt;/td&gt;&lt;td&gt;$15/mo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://sendgrid.com&quot; rel=&quot;noopener&quot;&gt;Sendgrid&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://sendgrid.com/solutions/email-api/&quot; rel=&quot;noopener&quot;&gt;API&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://docs.sendgrid.com/for-developers/parsing-email/inbound-email&quot; rel=&quot;noopener&quot;&gt;Webhook&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;100/day, 50k/mo&lt;/td&gt;&lt;td&gt;$20/mo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://sendinblue.com&quot; rel=&quot;noopener&quot;&gt;Sendinblue - brevo&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.sendinblue.com/api/&quot; rel=&quot;noopener&quot;&gt;API&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developers.sendinblue.com/reference/inbound-parsing&quot; rel=&quot;noopener&quot;&gt;Beta&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;300/day, 5k/mo&lt;/td&gt;&lt;td&gt;$9/mo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mailjet.com&quot; rel=&quot;noopener&quot;&gt;Mailjet&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://dev.mailjet.com/email/guides/send-api-v31/&quot; rel=&quot;noopener&quot;&gt;API&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://dev.mailjet.com/email/guides/parse-api/&quot; rel=&quot;noopener&quot;&gt;Webhook&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.mailjet.com/sms/&quot; rel=&quot;noopener&quot;&gt;SMS&lt;/a&gt;&lt;/td&gt;&lt;td&gt;200/day, 15k/mo&lt;/td&gt;&lt;td&gt;$17/mo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mailchimp.com&quot; rel=&quot;noopener&quot;&gt;Mailchimp&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mailchimp.com/developer/transactional/guides/quick-start/#make-your-first-api-call&quot; rel=&quot;noopener&quot;&gt;API&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mailchimp.com/developer/transactional/guides/set-up-inbound-email-processing/&quot; rel=&quot;noopener&quot;&gt;Webhook&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mailchimp.com/integrations/sms-and-text-message-marketing/&quot; rel=&quot;noopener&quot;&gt;SMS&lt;/a&gt;&lt;/td&gt;&lt;td&gt;500/day, 12·contacts&lt;/td&gt;&lt;td&gt;$20/mo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://constantcontact.com&quot; rel=&quot;noopener&quot;&gt;ConstantContact&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://v3.developer.constantcontact.com/api_reference/index.html#!/Email_Campaigns/retrieveEmailCampaignsUsingGET&quot; rel=&quot;noopener&quot;&gt;API&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$80/mo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://aws.amazon.com/ses/&quot; rel=&quot;noopener&quot;&gt;Amazon SES&lt;/a&gt; &lt;a href=&quot;https://aws.amazon.com/sns/&quot; rel=&quot;noopener&quot;&gt;Amazon SNS&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://aws.amazon.com/ses/&quot; rel=&quot;noopener&quot;&gt;API&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ses/latest/DeveloperGuide/receiving-email-concepts.html&quot; rel=&quot;noopener&quot;&gt;SNS&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ses/latest/DeveloperGuide/receiving-email-concepts.html&quot; rel=&quot;noopener&quot;&gt;SNS&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.10/1000 emails&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://nodemailer.com&quot; rel=&quot;noopener&quot;&gt;Nodemailer&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.edwardbeazer.com/sending-email-using-nodemailer-using-a-lambda/&quot; rel=&quot;noopener&quot;&gt;API&lt;/a&gt;&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;td&gt;Unlimited&lt;/td&gt;&lt;td&gt;$ mail server&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://emailengine.app&quot; rel=&quot;noopener&quot;&gt;EmailEngine&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/postalsys/emailengine&quot; rel=&quot;noopener&quot;&gt;API&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/postalsys/emailengine&quot; rel=&quot;noopener&quot;&gt;Webhook&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Unlimited&lt;/td&gt;&lt;td&gt;$ mail server, ~$1k/yr&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Portal Widget On Catalog Items have access to the default value</title>
      <link href="https://jace.pro/blog/portal-widget-on-catalog-items-have-access-to-the-default-value/" />
      <updated>2024-09-26T00:00:00Z</updated>
      <id>https://jace.pro/blog/portal-widget-on-catalog-items-have-access-to-the-default-value/</id>
      <content type="html">
				&lt;p&gt;on a `item_option_new` if you use the sp_widget, you can access the “default_value” in `c.options`&lt;/p&gt;&lt;p&gt;so if you have a default value of `{“mode”:“jace_was_here”}` you can read it by ``&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>10 Elements of a great landing page</title>
      <link href="https://jace.pro/blog/10-elements-of-a-great-landing-page/" />
      <updated>2024-09-21T00:00:00Z</updated>
      <id>https://jace.pro/blog/10-elements-of-a-great-landing-page/</id>
      <content type="html">
				&lt;p&gt;Rob Walling is someone I often enjoy listening to and reading content he’s a part of.&lt;/p&gt;&lt;p&gt;He spoke about this piece I keep coming back to about &lt;a href=&quot;https://www.startupsfortherestofus.com/episodes/episode-256-the-10-elements-of-highly-effective-saas-landing-pages&quot; rel=&quot;noopener&quot;&gt;10 elements of effective saas landing pages&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I think you could apply this to a lot of things and I do.&lt;/p&gt;&lt;p&gt;I however have trouble finding this so I’m going to share the quick list here.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Design the landing page for first time visitors. Give them One thing to do.&lt;/li&gt;&lt;li&gt;Have a great headline!&lt;ul&gt;&lt;li&gt;Make a promise in the headline.&lt;/li&gt;&lt;li&gt;Have an action word, like a verb.&lt;/li&gt;&lt;li&gt;Either directly state “you” or “imply you”. Meaning, you’re talkign to the person reading the headline. E.g. Guaranteed to increase your organic traffic&quot;. The promise is that it’s &lt;em&gt;guaranteed to increase traffic&lt;/em&gt;. The action, verb, is &lt;em&gt;increase&lt;/em&gt; and there’s a you. Here it’s implied.&lt;/li&gt;&lt;li&gt;You rarely should be talking about your app.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Have a visual element either an image or short vide to illustrate your product.&lt;/li&gt;&lt;li&gt;Highlight 3-9 benefits of your product&lt;/li&gt;&lt;li&gt;Social proof if you have it. Testimonials, press logos, vanity metrics.&lt;/li&gt;&lt;li&gt;Optional features. What features set your product apart?&lt;/li&gt;&lt;li&gt;Clear navigation. Four or fewer links in the navigation bar.&lt;/li&gt;&lt;li&gt;Every page needs to have a clear call to action (not scroll to the top of the page)&lt;/li&gt;&lt;li&gt;Limit links and buttons to reduce decisions visitors have to make.&lt;/li&gt;&lt;li&gt;Footer links are a great place to put extra links.&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Resume and Interviewing resources for ServiceNow</title>
      <link href="https://jace.pro/blog/resume-and-interviewing-resources-for-servicenow/" />
      <updated>2024-09-12T00:00:00Z</updated>
      <id>https://jace.pro/blog/resume-and-interviewing-resources-for-servicenow/</id>
      <content type="html">
				&lt;p&gt;Many times when folks connect with me on LinkedIn I’ll ask “How can I help?” Sometimes I can actually help.&lt;/p&gt;&lt;p&gt;It’s great.&lt;/p&gt;&lt;p&gt;Today I was asked by someone coming into this space … What advice can I give to help someone find a job.&lt;/p&gt;&lt;p&gt;As I was sharing things, I thought I’d share them here as well.&lt;/p&gt;&lt;p&gt;A long time ago I was a patient escort. I was bringing a man from xray back to his room. Part of the job was to make small talk. I wanted to work for IT in my bones back then. He said he was a developer or administrator. I asked him how can I get in to a role like that. I expected to hear, “Goto school, get a degree.” That was never said.&lt;/p&gt;&lt;p&gt;He said.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;It’s about who you know. Not necessarily what.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Ever since I’ve tried to do my best by knowing folks.&lt;/p&gt;&lt;p&gt;Go, extend your network. Goto the &lt;a href=&quot;https://www.meetup.com/pro/servicenowdevprogram/&quot; rel=&quot;noopener&quot;&gt;meetups&lt;/a&gt;, &lt;a href=&quot;https://www.servicenow.com/community/servicenow-user-groups-snugs/ct-p/servicenow-user-groups-snugs&quot; rel=&quot;noopener&quot;&gt;snugs&lt;/a&gt;, partner happy hours, ServiceNow industry events and if you can swing it the summits, and conferences.&lt;/p&gt;&lt;p&gt;Then make things to sharpen your blade. Build something to solve a problem using ServiceNow, then &lt;strong&gt;share it with others&lt;/strong&gt;. Keep applying.&lt;/p&gt;&lt;p&gt;I would entrust the advice of Robert Fedoruk over most. He’s been working with organizations to place candidates, has run a finishing school of sorts and is very well versed in the value you need to bring to get the offer. That being said he has number of things he’s said in the past. &lt;a href=&quot;https://linktr.ee/robertfedoruk&quot; rel=&quot;noopener&quot;&gt;Reach out to Robert&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Mark Scott, Chuck Tomasi and Carleen Carter have also some great input on this.&lt;/p&gt;&lt;p&gt;Below I link to all the things I found quickly on &lt;a href=&quot;https://news.jace.pro&quot; rel=&quot;noopener&quot;&gt;https://news.jace.pro&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Video 1&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=dVEoDmC1ntQ&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/H9G8NkmWft-480.webp 480w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/H9G8NkmWft-480.jpeg&quot; alt=&quot;Youtube: ServiceNow Resume Length: Get it Wrong and you get knocked out!&quot; width=&quot;480&quot; height=&quot;360&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Video 2&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=UtQ6Z0aQjYs&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/uOeHmE2gZf-480.webp 480w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/uOeHmE2gZf-480.jpeg&quot; alt=&quot;Youtube: Purge these words from your #ServiceNow resume IMMEDIATELY!&quot; width=&quot;480&quot; height=&quot;360&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Video 3&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xJCrmdrZs0w&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/GZAA-c6Etk-480.webp 480w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/GZAA-c6Etk-480.jpeg&quot; alt=&quot;Youtube: Career Conversation with Mark Scott Your Resume&quot; width=&quot;480&quot; height=&quot;360&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Video 4&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=oP6cokKsWlE&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/xEjXInURH1-480.webp 480w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/xEjXInURH1-480.jpeg&quot; alt=&quot;Youtube: The PhxDev Show - ServiceNow Resumes and Interviewing&quot; width=&quot;480&quot; height=&quot;360&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Blog 1&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-16-interview/&quot; rel=&quot;noopener&quot;&gt;Blog: Prepare for an interview - it’ll be fun&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Blog 2&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.kalzumeus.com/2012/01/23/salary-negotiation/&quot; rel=&quot;noopener&quot;&gt;Blog: Salary Negotiation: Make More Money, Be More Valued&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you have any resources you find really useful, &lt;a href=&quot;https://linkedin.com/in/jacebenson&quot; rel=&quot;noopener&quot;&gt;send me a message on LinkedIn&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Why is my field missing in ServiceNow?</title>
      <link href="https://jace.pro/blog/why-is-my-field-missing-in-servicenow/" />
      <updated>2024-08-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/why-is-my-field-missing-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;I really like and use the “why isn’t email working” post from forever ago so I decided to do it again but for why a field might not show up.&lt;/p&gt;&lt;h2 id=&quot;my-field-isnt-showing-up-but-should&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/why-is-my-field-missing-in-servicenow/#my-field-isnt-showing-up-but-should&quot; class=&quot;heading-anchor&quot;&gt;My field isn’t showing up but should&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Does the field exist on the table? &lt;code&gt;sys_dictionary_list.do&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Is the field on form layout?&lt;/li&gt;&lt;li&gt;Is there a data policy acting like a UI Policy controlling visibility to the field?&lt;/li&gt;&lt;li&gt;Is there a UI Policy controlling visibility to the field?&lt;/li&gt;&lt;li&gt;Is there a Client Script controlling visibility to the field?&lt;/li&gt;&lt;li&gt;Is there a UI Script doing some DOM-manipulation hiding it.&lt;/li&gt;&lt;li&gt;Is there some rogue code in a client side UI Action messing with it?&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;my-field-is-showing-up-but-shouldnt&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/why-is-my-field-missing-in-servicenow/#my-field-is-showing-up-but-shouldnt&quot; class=&quot;heading-anchor&quot;&gt;My field is showing up but shouldn’t&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Does the dictionary have the mandatory checkbox checked? If so you wont be able to hide it.&lt;/li&gt;&lt;li&gt;Does the field have UI Policy making it mandatory?&lt;/li&gt;&lt;li&gt;Is there a Client Script making it mandatory?&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;my-field-isnt-updating-when-i-save&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/why-is-my-field-missing-in-servicenow/#my-field-isnt-updating-when-i-save&quot; class=&quot;heading-anchor&quot;&gt;My field isn’t updating when I save&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;You have the field on the form multiple times&lt;/li&gt;&lt;li&gt;You have a business rule setting it’s value before save&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Using Remote Tables for Choices Saves Tables</title>
      <link href="https://jace.pro/blog/using-remote-tables-for-choices-saves-tables/" />
      <updated>2024-08-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/using-remote-tables-for-choices-saves-tables/</id>
      <content type="html">
				&lt;p&gt;A while ago someone shared with me a script to make choices available on their own table without consuming a table from your licensing.&lt;/p&gt;&lt;p&gt;Sounds interesting, right?&lt;/p&gt;&lt;p&gt;Let me share the bit of the &lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/legal/custom-table-guide-august24.pdf&quot; rel=&quot;noopener&quot;&gt;Table Guide&lt;/a&gt; that applies here.&lt;/p&gt;&lt;blockquote&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Exempt Tables&lt;br&gt;2.1. Table Extensions - Customer is entitled to extend each of the below ServiceNow provided tables up to one thousand times. Extending any of the below ServiceNow tables more than one thousand times requires a subscription to either an App Engine product or any ServiceNow product that includes the App Engine Starter entitlement.&lt;br&gt;2.2. Table Type - The following types of tables are exempted.&lt;br&gt;2.2.1 Many to Many Tables&lt;br&gt;2.2.2 &lt;strong&gt;Remote Tables&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;p&gt;Now Remote tables don’t extend tables so I don’t think it hits 2.1, and because it’s just remote tables I think that means unlimited here. Keep in mind Remote tables limit the rows to 1,000. If your data is more than 1,000 rows you’ll need some other solution.&lt;/p&gt;&lt;p&gt;Thank you, kind soul who shared this, with me.&lt;/p&gt;&lt;p&gt;To use this, follow these steps.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a Remote Table&lt;/li&gt;&lt;li&gt;Add a column of “Label” and system name of &lt;code&gt;u_label&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Update the Remote Table Definition for your table with this script after updating the 2nd line. e.g. table &lt;code&gt;sys_user&lt;/code&gt;, column &lt;code&gt;time_zone&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;Remote table and definition&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;executeQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;v_table&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v_query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $chl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; GlideScriptChoiceList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getChoiceList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;putYourTableHere&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;putYourTablesChoiceColumnHere&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    $chl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeNone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; $chl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $ch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $chl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getChoice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        v_table&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addRow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token string-property property&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; $ch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string-property property&quot;&gt;&#39;u_label&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; $ch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getLabel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v_table&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v_query&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Reporting to Platform Analytics</title>
      <link href="https://jace.pro/blog/reporting-to-platform-analytics/" />
      <updated>2024-08-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/reporting-to-platform-analytics/</id>
      <content type="html">
				&lt;p&gt;A few thoughts and resources.&lt;/p&gt;&lt;p&gt;What’s the motivation to move to &lt;strong&gt;Platform Analytics&lt;/strong&gt; from &lt;strong&gt;Reporting&lt;/strong&gt;?&lt;/p&gt;&lt;p&gt;Is it because, reporting, doesn’t work in Workspaces? Is that it?&lt;/p&gt;&lt;p&gt;Whatever the reason, &lt;strong&gt;ServiceNow customers have to move to Platform Analytics&lt;/strong&gt; soon cause with Xanadu it’s no longer what’s shipped.&lt;/p&gt;&lt;p&gt;With that in mind I went on to try out this new-fangled tool to see what it’s like and I have to say this. &lt;strong&gt;I’m not disappointed&lt;/strong&gt;. Now you might be like, “&lt;em&gt;Jace, are you already disappointed? Why?&lt;/em&gt;”&lt;/p&gt;&lt;p&gt;Let me tell you a story. It was 2007 and I was just a mere help desk agent. We had a defunct processes and weird use cases and I could just create a table, and add a few access controls and wow. A team had a place to work that didn’t have versions and other problems. I didn’t have to email a rep or ask the ServiceNow owning team “Can I please have a table?”&lt;/p&gt;&lt;p&gt;I could solve real problems quickly without a lot of fuss. It’s been more than 10 years and now that same problem is met with a litany of questions, is this the right place, who needs to audit this, should we buy a product to solve this problem, who will support it. I get it. It’s not the perfect tool for every job but it was a great place to start.&lt;/p&gt;&lt;p&gt;Now it’s much more complicated. Low-code with complicated bindings and odd click-development is the route we’re going. This isn’t the reason for this blog. This blog is about how to try out the &lt;strong&gt;new reporting&lt;/strong&gt; that, I repeat &lt;strong&gt;does not disappoint me&lt;/strong&gt;. Hip-hip-freaking-yay.&lt;/p&gt;&lt;p&gt;First things first. You already have this in your PDI and probably work instance. You can flip a property and it will disable the the other reports (you can undo this too).&lt;/p&gt;&lt;p&gt;Change the property &lt;code&gt;com.glide.par.unified_analytics.enabled&lt;/code&gt; to true and you’re off to the races.&lt;/p&gt;&lt;p&gt;Try creating a new report, it’s different.&lt;/p&gt;&lt;p&gt;Try creating a report from a list in Core UI, and Workspaces.&lt;/p&gt;&lt;p&gt;I was concerned this might break embedded forms, it doesn’t seem to and those reports still look like they use the &lt;code&gt;sys_report&lt;/code&gt; not the new ones.&lt;/p&gt;&lt;p&gt;This does break creating a report from an URL I’ve written about previously.&lt;/p&gt;&lt;p&gt;There’s loads of videos on this topic. Here’s a link to the &lt;a href=&quot;https://www.youtube.com/watch?v=n5mhzrHS_xo&amp;amp;list=PLkGSnjw5y2U6HotK0MQUbCrzVog_zBWat&amp;amp;index=3&quot; rel=&quot;noopener&quot;&gt;Performance Analytics Office Hours playlist&lt;/a&gt; and some &lt;a href=&quot;https://www.youtube.com/watch?v=ZlDvMhP_Tx8&amp;amp;list=PLkGSnjw5y2U4sdBCFzTHAos33zYCsB_Gj&quot; rel=&quot;noopener&quot;&gt;5 minute videos answering common Platform Analytics Experience questions&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Kevin Milligna was telling me about a thing I totally missed, Platform Analytics Migration Center. This &lt;a href=&quot;https://www.youtube.com/watch?v=buwL2rdigV4&amp;amp;t=1326s&quot; rel=&quot;noopener&quot;&gt;video should get you going on migrating from Reporting to Platform Analytics&lt;/a&gt; quickly (I’m sorry it’s an hour long but, this starts at the demo and you can 2x for 30 minutes)&lt;/p&gt;&lt;p&gt;Also, I wanted to note that ServiceNow is using new words to describe the same things. So here’s the list.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Reports become Data Visualizations&lt;/li&gt;&lt;li&gt;Dashboards are collections of reports and can include Performance Analytics data sources&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Let me know what you think on &lt;a href=&quot;https://www.linkedin.com/posts/jacebenson_xanadu-servicenow-reporting-activity-7230111327636140032-wbZ1?utm_source=share&amp;amp;utm_medium=member_desktop&quot; rel=&quot;noopener&quot;&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Deploying a RedwoodJS site using BareMetal</title>
      <link href="https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/" />
      <updated>2024-08-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/</id>
      <content type="html">
				&lt;h1 id=&quot;setting-up-a-baremetal-redwoodjs-site&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#setting-up-a-baremetal-redwoodjs-site&quot; class=&quot;heading-anchor&quot;&gt;Setting Up a BareMetal RedwoodJS Site&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I’m in the process of re-creating a site, &lt;a href=&quot;https://ai.ina.box&quot; rel=&quot;noopener&quot;&gt;ai.ina.box&lt;/a&gt;, using &lt;a href=&quot;https://redwoodjs.com&quot; rel=&quot;noopener&quot;&gt;RedwoodJS&lt;/a&gt;. My goal is to keep hosting costs low, so I’m deploying the site on a small Ubuntu server from &lt;a href=&quot;https://vultr.com&quot; rel=&quot;noopener&quot;&gt;Vultr&lt;/a&gt;. During setup, I encountered several steps worth documenting for future reference.&lt;/p&gt;&lt;p&gt;Update: This was augmented after seeing &lt;a href=&quot;https://community.redwoodjs.com/t/baremetal-deployment-cheatsheet/7380&quot; rel=&quot;noopener&quot;&gt;Esteban’s BareMetal deployment cheat sheet&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;set-up-dns&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#set-up-dns&quot; class=&quot;heading-anchor&quot;&gt;Set up DNS&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Yes, this will take the longest so let’s do this first, you’ll just need the IP address and domain name.&lt;/p&gt;&lt;p&gt;You will need to adapt this set up to your DNS host’s website. Ultimately you need a DNS Record like so.&lt;/p&gt;&lt;p&gt;Replace &lt;code&gt;example.com&lt;/code&gt; with your domain.&lt;br&gt;Replace &lt;code&gt;127.0.0.1&lt;/code&gt; with your server’s IP address&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Type: A
Name: example.com
Value: 127.0.0.1&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;project-setup-for-baremetal-deployment&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#project-setup-for-baremetal-deployment&quot; class=&quot;heading-anchor&quot;&gt;Project Setup for BareMetal Deployment&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Set up a Redwood Project (you probably have one already, but just in case)&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; create redwood-app blog
&lt;span class=&quot;token comment&quot;&gt;# git init, and yarn install as an option&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Run the setup command&lt;br&gt;This command creates two files: &lt;code&gt;deploy.toml&lt;/code&gt; and &lt;code&gt;ecosystem.toml&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; rw setup deploy baremetal&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Update your local &lt;code&gt;.env&lt;/code&gt; file&lt;br&gt;Next, you’ll need your server’s authentication details. Store the username, password, and IP address in your .env file:&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# local .env&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;SSH_AUTH_SOCK&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;pageant&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# I had to add this&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;DATABASE_URL&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;file:./dev.db &lt;span class=&quot;token comment&quot;&gt;# point this to your local db, on the server it&#39;ll be different&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;DEPLOY_HOST&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;131.214&lt;/span&gt;.523.124
&lt;span class=&quot;token assign-left variable&quot;&gt;DEPLOY_USERNAME&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;deploy
&lt;span class=&quot;token assign-left variable&quot;&gt;DEPLOY_PASSWORD&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;somepass

&lt;span class=&quot;token comment&quot;&gt;# DB Auth setting for local dev&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;SESSION_SECRET&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;thisIsAFakeSecretGenerateOneOnYourOwn&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Update your local &lt;code&gt;.env.defaults&lt;/code&gt; file&lt;br&gt;I’m not sure why, but I had to set up my local env.defaults as well to have at least my &lt;code&gt;DEPLOY_HOST&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;DOMAIN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;news.example.com
&lt;span class=&quot;token assign-left variable&quot;&gt;SESSION_SECRET&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;thisIsAFakeSecretGenerateOneOnYourOwn
&lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;SSH_AUTH_SOCK&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;pageant&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;PORT&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;8910&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# set this to the local path where you want to save your db&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;DATABASE_URL&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;file:/var/www/app/dev.db&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# set these to enable deployment&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;DEPLOY_HOST&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;news.example.com&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;3&quot;&gt;&lt;li&gt;Update the &lt;code&gt;deploy.toml&lt;/code&gt;&lt;br&gt;You’ll want to set up the host, username, password, and repo values. Add the &lt;code&gt;[after]&lt;/code&gt; section and update the &lt;code&gt;processNames&lt;/code&gt;].&lt;br&gt;We’ll come back to the commented &lt;code&gt;restart&lt;/code&gt; command after our first deploy.&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;production.servers&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Update the host, user, and password&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;host&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${DEPLOY_HOST}&lt;/span&gt;&quot;&lt;/span&gt;
username &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${DEPLOY_USERNAME}&lt;/span&gt;&quot;&lt;/span&gt;
password &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${DEPLOY_PASSWORD}&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# THIS LINE NEEDS TO BE ADDED DO NOT MISS THIS LINE&lt;/span&gt;
agentForward &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# THIS LINE NEEDS TO SET TO FALSE TO USE USER/PASS&lt;/span&gt;
sides &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;api&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;web&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
packageManagerCommand &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;yarn&quot;&lt;/span&gt;
monitorCommand &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pm2&quot;&lt;/span&gt;
path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/var/www/app&quot;&lt;/span&gt;
processNames &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;api&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Update the repo&lt;/span&gt;
repo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;git@github.com:org/project-name-goes-here.git&quot;&lt;/span&gt;
branch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;main&quot;&lt;/span&gt;
keepReleases &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;after&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;yarn rw prisma generate&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
build &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;yarn rw build web&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#restart = [&quot;pm2 restart job&quot;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;4&quot;&gt;&lt;li&gt;Let’s get this up on GitHub&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Go to the &lt;a href=&quot;https://github.com/new&quot; rel=&quot;noopener&quot;&gt;New Repository&lt;/a&gt; page and make it.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; remote &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; origin git@github.com:username/repo.git
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Inital Deploy Commit&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push --set-upstream origin main&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;sever-setup&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#sever-setup&quot; class=&quot;heading-anchor&quot;&gt;Sever Setup&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You’ll need to connect to the server here.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; root@host&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;preparing-your-server&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#preparing-your-server&quot; class=&quot;heading-anchor&quot;&gt;Preparing Your Server&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;You’re have an IP address and a root username and password. Great! Let’s prep the machine.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Update the server&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; upgrade &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Upgrade the server&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; full-upgrade &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;3&quot;&gt;&lt;li&gt;Remove the fluff&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--purge&lt;/span&gt; autoremove &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;4&quot;&gt;&lt;li&gt;Upgrade to the new release version&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; do-release-upgrade&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;create-a-new-sudo-user&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#create-a-new-sudo-user&quot; class=&quot;heading-anchor&quot;&gt;Create a new &lt;code&gt;sudo&lt;/code&gt; user&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The user I’ve picked here is &lt;code&gt;deploy&lt;/code&gt; but use another if you want.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create and grant privileges&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;adduser deploy &lt;span class=&quot;token parameter variable&quot;&gt;--gecos&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# creates the user and skips extra questions&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;usermod&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-aG&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; deploy &lt;span class=&quot;token comment&quot;&gt;# gives the user sudo privledges&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Give &lt;code&gt;sudoers&lt;/code&gt; access to &lt;a href=&quot;https://www.maketecheasier.com/edit-sudoers-file-linux/&quot; rel=&quot;noopener&quot;&gt;allow you to run as another&lt;/a&gt; Add the user to the &lt;code&gt;sudoers&lt;/code&gt; file by running &lt;code&gt;visudo&lt;/code&gt; and adding the following line below the root equivalent:&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;deploy &lt;span class=&quot;token assign-left variable&quot;&gt;ALL&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ALL:ALL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; ALL&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;log-in-as-deploy-user&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#log-in-as-deploy-user&quot; class=&quot;heading-anchor&quot;&gt;Log in as deploy user&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; deploy@host&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;set-up-ssh-for-deployments&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#set-up-ssh-for-deployments&quot; class=&quot;heading-anchor&quot;&gt;Set up SSH for deployments&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Generate an SSH key for the server&lt;/p&gt;&lt;p&gt;Note: Your email may be masked, go to &lt;a href=&quot;https://github.com/settings/emails&quot; rel=&quot;noopener&quot;&gt;Account &amp;gt; Emails&lt;/a&gt; and use the masked email if you do that.&lt;br&gt;Accept the defaults here, at least for &lt;em&gt;where&lt;/em&gt; to save it.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;ssh-keygen &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; ed25519 &lt;span class=&quot;token parameter variable&quot;&gt;-C&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;123456+examplename@users.noreply.github.com&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Add the SSH key to the &lt;code&gt;ssh-agent&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;eval&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;ssh-agent &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;4&quot;&gt;&lt;li&gt;Add the SSH key to GitHub by running&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then, paste the output into &lt;a href=&quot;https://github.com/settings/ssh/new&quot; rel=&quot;noopener&quot;&gt;new GitHub’s SSH key&lt;/a&gt; settings.&lt;br&gt;I name mine “domain’s deploy key”&lt;/p&gt;&lt;ol start=&quot;5&quot;&gt;&lt;li&gt;Add GitHub’s fingerprint by running&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-T&lt;/span&gt; git@github.com&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;install-nvm-node-yarn-nginx-sqlite&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#install-nvm-node-yarn-nginx-sqlite&quot; class=&quot;heading-anchor&quot;&gt;Install NVM, Node, Yarn, Nginx, sqlite&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Install Nginx and sqlite&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; nginx sqlite3 &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Install Node.js via &lt;code&gt;nvm&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;source&lt;/span&gt; ~/.bashrc
nvm &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; v20.16.0&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;3&quot;&gt;&lt;li&gt;Install Yarn&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;corepack &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; init &lt;span class=&quot;token parameter variable&quot;&gt;-2&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; deploy:deploy /home/deploy/.yarn/berry &lt;span class=&quot;token comment&quot;&gt;# I got errors and had to do this eventually&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt;&lt;li&gt;Install PM2:&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; pm2 &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;configure-nginx-for-your-site&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#configure-nginx-for-your-site&quot; class=&quot;heading-anchor&quot;&gt;Configure Nginx for Your Site&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Create the directory specified in &lt;code&gt;deploy.toml&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; /var/www/app
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; deploy:deploy /var/www/app
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-R&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;755&lt;/span&gt; /var/www/app&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Create the &lt;code&gt;.env&lt;/code&gt; file&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /var/www/app/.env
&lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; deploy:deploy /var/www/app/.env&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Add the following content&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;WEB_PORT=80
API_PORT=8911
SSH_AUTH_SOCK=&quot;pageant&quot;
PORT=&quot;8910&quot;

PRISMA_HIDE_UPDATE_MESSAGE=true
# LOG_LEVEL=debug

DOMAIN=news.example.com
SESSION_SECRET=SomeSecretGoesHereButICantShareIt
# set this to the local path where you want to save your db
DATABASE_URL=&quot;file:/var/www/app/dev.db&quot;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;3&quot;&gt;&lt;li&gt;Edit the NGINX configuration&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;code&gt;alt-k&lt;/code&gt; will set a mark, then you can use the arrows to highlight all and &lt;code&gt;ctrl-x&lt;/code&gt; to cut it.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/nginx/sites-available/default&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;4&quot;&gt;&lt;li&gt;Configure Nginx Replace the default content with the following config. Replace &lt;strong&gt;your_domain.com&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-nginx&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;upstream&lt;/span&gt; redwood_server&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;server&lt;/span&gt; 127.0.0.1:8911 fail_timeout=0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;server&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;listen&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt; ssl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;server_name&lt;/span&gt; news.example.com&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;root&lt;/span&gt; /var/www/app/current/web/dist&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;index&lt;/span&gt; index.html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;gzip&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;gzip_min_length&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;gzip_types&lt;/span&gt; application/json text/css application/javascript application/x-javascript&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;sendfile&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;keepalive_timeout&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;65&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;error_page&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;404&lt;/span&gt; /404.html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;error_page&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt; /500.html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;try_files&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$uri&lt;/span&gt; /200.html =404&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; ^~ /static/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;gzip_static&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;expires&lt;/span&gt; max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;add_header&lt;/span&gt; Cache-Control public&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; ~ /.redwood/functions(.*)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;rewrite&lt;/span&gt; ^/.redwood/functions(.*) &lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; X-Forwarded-For &lt;span class=&quot;token variable&quot;&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; http://redwood_server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;set-up-firewall&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#set-up-firewall&quot; class=&quot;heading-anchor&quot;&gt;Set up firewall&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Install UFW (uncomplicated Firewall)&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; ufw &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Allow SSH connections&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; ufw allow &lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;3&quot;&gt;&lt;li&gt;Allow incoming HTTP and HTTPS traffic&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; ufw allow &lt;span class=&quot;token string&quot;&gt;&#39;Nginx Full&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;4&quot;&gt;&lt;li&gt;Enable the firewall&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; ufw &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;5&quot;&gt;&lt;li&gt;Check firewall status&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; ufw status&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It should look something like this;&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;Status: active

To                         Action      From
--                         ------      ----
&lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;/tcp                     ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
&lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;/tcp &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v6&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                ALLOW       Anywhere &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v6&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
Nginx Full &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v6&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            ALLOW       Anywhere &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v6&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;add-lets-encrypt-for-https&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#add-lets-encrypt-for-https&quot; class=&quot;heading-anchor&quot;&gt;Add Let’s Encrypt for HTTPS&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Modify this block to use your domain name, if it’s a apex domain (e.g. &lt;a href=&quot;http://example.com&quot; rel=&quot;noopener&quot;&gt;example.com&lt;/a&gt;) keep the double &lt;code&gt;-d&lt;/code&gt; option.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; certbot python3-certbot-nginx &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; certbot &lt;span class=&quot;token parameter variable&quot;&gt;--nginx&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; example.com &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; www.example.com
&lt;span class=&quot;token comment&quot;&gt;#sudo certbot --nginx -d test.example.com&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl status certbot.timer
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; certbot renew --dry-run&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;updating-bashrc&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#updating-bashrc&quot; class=&quot;heading-anchor&quot;&gt;Updating &lt;code&gt;.bashrc&lt;/code&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Some distributions may have restrictions that interfere with non-interactive sessions. You may need to update&amp;nbsp;&lt;code&gt;.bashrc&lt;/code&gt;&amp;nbsp;to handle this.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Edit &lt;code&gt;~/.bashrc&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; ~/.bashrc&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;2&quot;&gt;&lt;li&gt;Comment this set of lines out, should be near the top&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# case $- in&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   *i*) ;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#     *) return;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# esac&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;deploying&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#deploying&quot; class=&quot;heading-anchor&quot;&gt;Deploying!&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You should be all set to do the first run deploy. So go back to your local machine and run this.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; rw deploy baremetal production --first-run&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now if you’re having trouble here it might because of authentication issues.&lt;br&gt;I had to update &lt;code&gt;deploy.toml&lt;/code&gt; settings and double check them.&lt;/p&gt;&lt;p&gt;&lt;code&gt;agentForward&lt;/code&gt; to false&lt;br&gt;&lt;code&gt;password&lt;/code&gt; to &lt;code&gt;&quot;${DEPLOY_PASSWORD}&quot;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Amazing one last thing.&lt;/p&gt;&lt;h2 id=&quot;setting-up-jobs&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#setting-up-jobs&quot; class=&quot;heading-anchor&quot;&gt;Setting up Jobs&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Update your &lt;code&gt;ecosystem.config.js&lt;/code&gt; to something like this.&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;apps&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;api&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;cwd&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;current&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;node_modules/.bin/rw&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;serve api&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;instances&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;max&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;exec_mode&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;cluster&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;wait_ready&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;listen_timeout&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;job&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;cwd&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;current&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;node_modules/.bin/rw-jobs-worker&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;--index=0 --id=0&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;instances&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Do a deploy &lt;code&gt;yarn rw deploy baremetal production&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Then, ssh on to the machine and run the following.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /var/www/app
pm2 stop all
pm2 start current/ecosystem.config.js
pm2 save
pm2 startup
&lt;span class=&quot;token comment&quot;&gt;# run the command it gives you&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To get this to restart the job now add this to your &lt;code&gt;deploy.toml&lt;/code&gt; file.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;after&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#...&lt;/span&gt;
restart &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;pm2 restart job&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Go ahead and commit, push and then run &lt;code&gt;yarn rw deploy baremetal production&lt;/code&gt;&lt;/p&gt;&lt;h2 id=&quot;troubleshooting&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#troubleshooting&quot; class=&quot;heading-anchor&quot;&gt;Troubleshooting&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Log in with the &lt;code&gt;deploy&lt;/code&gt; user to get access to yarn&lt;/p&gt;&lt;p&gt;If you get a database error, you may need to clean up your records before deploy, so include a script to do that or manually plan to purge those record individually or by dropping your database (after a backup of course)&lt;/p&gt;&lt;h3 id=&quot;background-jobs-are-not-running&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#background-jobs-are-not-running&quot; class=&quot;heading-anchor&quot;&gt;Background Jobs are not running&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Check if the &lt;code&gt;job&lt;/code&gt; process is running in &lt;code&gt;pm2&lt;/code&gt;. Running the following will show you what is running and it’s memory usage.&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;pm2 monit&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If &lt;code&gt;api&lt;/code&gt; isn’t listed, you need to start the &lt;code&gt;api&lt;/code&gt; process and save it&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;pm2 start &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; api &lt;span class=&quot;token string&quot;&gt;&quot;yarn rw serve api&quot;&lt;/span&gt;
pm2 save&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If &lt;code&gt;jobs&lt;/code&gt; isn’t listed, you need to start the jobs process and save it&lt;/p&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;pm2 start &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; job &lt;span class=&quot;token string&quot;&gt;&quot;yarn rw-jobs-worker --index=0 --id=0&quot;&lt;/span&gt;
pm2 save&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;running-out-of-space-was-an-issue&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/deploying-a-redwoodjs-site-using-baremetal/#running-out-of-space-was-an-issue&quot; class=&quot;heading-anchor&quot;&gt;Running out of space was an issue&lt;/a&gt;&lt;/h3&gt;
 			</content>
    </entry><entry>
      <title>Xanadu: Thoughts on the release</title>
      <link href="https://jace.pro/blog/xanadu-thoughts-on-the-release/" />
      <updated>2024-08-12T00:00:00Z</updated>
      <id>https://jace.pro/blog/xanadu-thoughts-on-the-release/</id>
      <content type="html">
				&lt;p&gt;The other day I was chatting about the Xanadu release and I thought I’d write up my thoughts about it.&lt;/p&gt;&lt;h2 id=&quot;whats-actually-in-xanadu&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/xanadu-thoughts-on-the-release/#whats-actually-in-xanadu&quot; class=&quot;heading-anchor&quot;&gt;What’s actually in Xanadu?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;It’s difficult to know or what’s in these release. What’s immediately available or coming soon, or not available what-so-ever. There’s loads more updates. I generally look at the following links line-by-line.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/xanadu-release-notes/page/release-notes/summary/rn-summary-new-features.html&quot; rel=&quot;noopener&quot;&gt;What’s new&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/xanadu-release-notes/page/release-notes/summary/rn-summary-changes.html&quot; rel=&quot;noopener&quot;&gt;What’s changed&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/xanadu-release-notes/page/release-notes/summary/rn-summary-removed-features.html&quot; rel=&quot;noopener&quot;&gt;What’s removed&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/xanadu-release-notes/page/release-notes/summary/rn-summary-deprecated-info.html&quot; rel=&quot;noopener&quot;&gt;What’s depreciated&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There’s lots of updates to existing products but I generally focus on the “applies to all” kinds of things.&lt;/p&gt;&lt;h3 id=&quot;servicenow-ide-and-fluent-language&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/xanadu-thoughts-on-the-release/#servicenow-ide-and-fluent-language&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow IDE &amp;amp; Fluent Language&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I was very excited for the &lt;a href=&quot;https://docs.servicenow.com/csh?topicname=exploring-servicenow-ide.html&amp;amp;version=latest&quot; rel=&quot;noopener&quot;&gt;ServiceNow IDE&lt;/a&gt;. This falls under the &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:ugcPost:7226939812396642305/?commentUrn=urn%3Ali%3Acomment%3A%28ugcPost%3A7226939812396642305%2C7226945924550344706%29&amp;amp;replyUrn=urn%3Ali%3Acomment%3A%28ugcPost%3A7226939812396642305%2C7226960316264239105%29&amp;amp;dashCommentUrn=urn%3Ali%3Afsd_comment%3A%287226945924550344706%2Curn%3Ali%3AugcPost%3A7226939812396642305%29&amp;amp;dashReplyUrn=urn%3Ali%3Afsd_comment%3A%287226960316264239105%2Curn%3Ali%3AugcPost%3A7226939812396642305%29&quot; rel=&quot;noopener&quot;&gt;“not available what-so-ever” on Personal Developer Instances&lt;/a&gt;. I’ll have to wait for General Availability like most. I estimate it at 6-12 months for most.&lt;/p&gt;&lt;p&gt;On that note, the IDE and the existing &lt;a href=&quot;https://docs.servicenow.com/csh?topicname=servicenow-fluent-api-reference.html&amp;amp;version=latest&quot; rel=&quot;noopener&quot;&gt;Command Line Interface SDK&lt;/a&gt; added this “&lt;a href=&quot;https://docs.servicenow.com/csh?topicname=servicenow-fluent-api-reference.html&amp;amp;version=latest&quot; rel=&quot;noopener&quot;&gt;Fluent&lt;/a&gt;” language. Note it’s missing Flow, Subflow, Action (for flows), Decision Tables, and Workflows. It does have these as of this initial release;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Access Controls&lt;/li&gt;&lt;li&gt;Application Menus&lt;/li&gt;&lt;li&gt;Automated Test Framework Tests&lt;/li&gt;&lt;li&gt;Business Rules&lt;/li&gt;&lt;li&gt;Client Scripts&lt;/li&gt;&lt;li&gt;Lists (sys_ui_list, not sys_ux_list)&lt;/li&gt;&lt;li&gt;Properties&lt;/li&gt;&lt;li&gt;Roles&lt;/li&gt;&lt;li&gt;Scripted REST APIs&lt;/li&gt;&lt;li&gt;Tables&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;deny-acls&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/xanadu-thoughts-on-the-release/#deny-acls&quot; class=&quot;heading-anchor&quot;&gt;Deny ACLS&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Deny-Unless ACLs are evaluated with a “deny-unless” approach. The ACL defines the users that will NOT be denied. Said another way, the user will be denied access unless the role, condition, and script requirements are met. - &lt;a href=&quot;https://docs.servicenow.com/csh?topicname=t_CreateAnACLRule.html&amp;amp;version=latest&quot; rel=&quot;noopener&quot;&gt;From the docs&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is exciting as it’s great to have more control over how and who can see records in ServiceNow. If you want to read more about Deny-Unless ACLs check out these other post.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nishacodeblogs.medium.com/deny-unless-acl-use-case-from-xanadu-release-e95aa4283e2a&quot; rel=&quot;noopener&quot;&gt;Nisha posted “Deny Unless Acl Use Case from Xanadu Release”&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/pulse/my-top-3-features-servicenow-xanadu-n-zi-yao-itil-servicenow-h6zie/&quot; rel=&quot;noopener&quot;&gt;Jean covered it on Linkedin&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;data-certification-becoming-deprecated&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/xanadu-thoughts-on-the-release/#data-certification-becoming-deprecated&quot; class=&quot;heading-anchor&quot;&gt;Data Certification becoming deprecated&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is a lesser used piece of functionality. The notes say;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/xanadu-release-notes/page/release-notes/summary/rn-summary-changes.html#:~:text=When%20reviewing%20Data%20Certification%20tasks%20in%20CMDB%20Workspace%2C%20use%20a%20single%20click%20to%20select%20all%20the%20records%20associated%20with%20a%20task%2C%20to%20certify%20or%20fail%20the%20certification%20in%20bulk.&quot; rel=&quot;noopener&quot;&gt;When reviewing Data Certification tasks in CMDB Workspace, use a single click to select all the records associated with a task, to certify or fail the certification in bulk.&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I’m not sure if they’ve made yet another task type in the scoped app or what. I do know that they also wrote it’s still supported but being prepped for deprecation.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Starting with the Xanadu release, the Data Certification plugin (com.snc.certification_v2) is being prepared for future deprecation. It will be hidden and no longer activated on new instances but will continue to be supported. The CMDB Workspace store app provides the latest experience for this functionality. For details, see the Deprecation Process [KB0867184] article in the Now Support knowledge base. &lt;a href=&quot;https://docs.servicenow.com/bundle/xanadu-release-notes/page/release-notes/summary/rn-summary-deprecated-info.html#:~:text=Starting%20with%20the%20Xanadu%20release%2C%20the%20Data,article%20in%20the%20Now%20Support%20knowledge%20base.&quot; rel=&quot;noopener&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://checklistpro.app&quot; rel=&quot;noopener&quot;&gt;Checklist Pro&lt;/a&gt; can fill feature gaps left out of data certification.&lt;/p&gt;&lt;h3 id=&quot;rip-reporting-enter-platform-analytics&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/xanadu-thoughts-on-the-release/#rip-reporting-enter-platform-analytics&quot; class=&quot;heading-anchor&quot;&gt;RIP Reporting, enter Platform Analytics&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Reporting is not available on new instances. Use Platform Analytics data visualizations with table data sources instead. Users with admin and &lt;code&gt;report_admin&lt;/code&gt; roles will still be able to use Reporting for Service Portal.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This will be a shift. These seem a little more confusing for me to set up but it may be my age on the platform.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.vividcharts.com/&quot; rel=&quot;noopener&quot;&gt;VividCharts&lt;/a&gt; can fill usability gaps left out of reporting.&lt;/p&gt;&lt;h3 id=&quot;system-performance-dashboard-is-depreciated&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/xanadu-thoughts-on-the-release/#system-performance-dashboard-is-depreciated&quot; class=&quot;heading-anchor&quot;&gt;System Performance Dashboard is depreciated&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;But, don’t worry, you can buy &lt;a href=&quot;https://docs.servicenow.com/bundle/xanadu-impact/page/product/impact/reference/impact-packages.html&quot; rel=&quot;noopener&quot;&gt;Impact Instance Observer&lt;/a&gt;! This is the kind of stuff that is nuts. Seems like this isn’t available too either.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Instance Observer is available for customers in Commercial and Government Community Cloud (GCC) environments. IO is not currently available in other regulated or on-premise environments. &lt;a href=&quot;https://docs.servicenow.com/bundle/xanadu-impact/page/product/impact/concept/io-overview.html&quot; rel=&quot;noopener&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;update-sets-can-now-install-applications&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/xanadu-thoughts-on-the-release/#update-sets-can-now-install-applications&quot; class=&quot;heading-anchor&quot;&gt;Update Sets can now install Applications!&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/csh?topicname=system-update-sets-rn.html&amp;amp;version=latest&quot; rel=&quot;noopener&quot;&gt;Enable app installation through update set.&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;That’s neat! Kieran, thanks for sharing. This is not what I would have expected. ServiceNow has been pushing Source Control and the App Repos. I would have expected no updates here. I’m glad I’m wrong.&lt;/p&gt;&lt;h2 id=&quot;shift-to-the-store-and-those-implications&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/xanadu-thoughts-on-the-release/#shift-to-the-store-and-those-implications&quot; class=&quot;heading-anchor&quot;&gt;Shift to the store and those implications&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Many of these updates shown are not actually part of the Family Release, but are just timed with it from the store releases. Which is really a way to let a larger marketing effort happen. It makes some sense, but just feels like, they are trying to have it both ways, “we have amazing fast updates” and “we have a huge release”. They can have it both ways when they time it like this, just feels like it should be more release updates as needed.&lt;/p&gt;&lt;h3 id=&quot;how-do-you-update-all-your-apps-at-once&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/xanadu-thoughts-on-the-release/#how-do-you-update-all-your-apps-at-once&quot; class=&quot;heading-anchor&quot;&gt;How do you update all your apps at once?&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;That being said with more and more store updates Derek Hodge was asking how do folks update all their apps!&lt;/p&gt;&lt;p&gt;Erim Riemer wrote a &lt;a href=&quot;https://snwizard.com/update-apps#the-code&quot; rel=&quot;noopener&quot;&gt;script sometime ago and has this posted on his site to do just that&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What are the Advanced CMDB Data Manager Policy options?</title>
      <link href="https://jace.pro/blog/what-are-the-advanced-cmdb-data-manager-policy-options/" />
      <updated>2024-07-30T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-are-the-advanced-cmdb-data-manager-policy-options/</id>
      <content type="html">
				&lt;p&gt;I’m digging more into the archive, and destroy rules of the archival processes. That is until I found the CMDB Data Manager and their policies.&lt;/p&gt;&lt;p&gt;I’m not sure if this is possible, but is there a way to have the retirement or archival step only execute when the CI is not referenced by a number of other tables? Specifically tasks, and kb tables.&lt;/p&gt;&lt;p&gt;I’m going to link what I found so far but nothing quiet does it this way yet.;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.servicenow.com/community/cmdb-forum/cmdb-data-manager-advanced-policy-rules-conditions/m-p/2603237&quot; rel=&quot;noopener&quot;&gt;CMDB Data Manager Advanced Policy Rules / Conditio… - ServiceNow Community&lt;/a&gt; talks about using the “Dependent CI - Retire” Policy to retire &lt;em&gt;child&lt;/em&gt; records to a CI, which is not quiet what I need.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.servicenow.com/community/developer-forum/over-your-storage-limit-archiving-may-not-be-your-friend/m-p/2624658&quot; rel=&quot;noopener&quot;&gt;Over your storage limit? Archiving may not be you… - ServiceNow Community&lt;/a&gt; talks about the nuances about archiving and deleting and storage concerns&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=1p74bg6ZK9E&quot; rel=&quot;noopener&quot;&gt;ServiceNow DEMO: CMDB Data Manager (youtube.com)&lt;/a&gt; shows how to use this thing in a Utah Instance which was very helpful.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I looked on nowlearning and everything i found was more about understanding the deduplication process &lt;a href=&quot;https://nowlearning.servicenow.com/lxp/en/pages/lxp-search?id=search&amp;amp;q=cmdb%20data%20manager&amp;amp;spa=1&quot; rel=&quot;noopener&quot;&gt;cmdb data manager LXP Search - Now Learning (servicenow.com)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The official docs &lt;a href=&quot;https://docs.servicenow.com/bundle/utah-servicenow-platform/page/product/configuration-management/concept/cmdb-data-management.html&quot; rel=&quot;noopener&quot;&gt;CMDB Data Manager (servicenow.com)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I can think of a few ways to handle this but this seems so close without having to customize things. A few options I can think of off the top of my head include, running some scheduled job/flow to set some value “Ready to retire” when the conditions are met then use the CMDB Data manager policies but, I’d love to hear if anyone has any other thoughts on this or if there’s another better way.&lt;/p&gt;&lt;p&gt;Thank you!&lt;/p&gt;&lt;p&gt;Community post &lt;a href=&quot;https://www.servicenow.com/community/cmdb-forum/advanced-cmdb-data-manager-policy-options/m-p/2768444#M8215&quot; rel=&quot;noopener&quot;&gt;https://www.servicenow.com/community/cmdb-forum/advanced-cmdb-data-manager-policy-options/m-p/2768444#M8215&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>AI Resources</title>
      <link href="https://jace.pro/blog/ai-resources/" />
      <updated>2024-07-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/ai-resources/</id>
      <content type="html">
				&lt;p&gt;This sentence has five words. Here are five more words. Five-word sentences are fine. But several together become monotonous. Listen to what is happening. The writing is getting boring. The sound of it drones. It’s like a stuck record. The ear demands some variety.&lt;/p&gt;&lt;p&gt;Now listen. I vary the sentence length, and I create music. Music. The writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short sentences. And I use sentences of medium length.&lt;/p&gt;&lt;p&gt;And sometimes, when I am certain the reader is rested, I will engage him with a sentence of considerable length, a sentence that burns with energy and builds with all the impetus of a crescendo, the roll of the drums, the crash of the cymbals–sounds that say listen to this, it is important. — Gary Provost&lt;/p&gt;&lt;h2 id=&quot;whats-a-no-shot-zero-shot-one-shot-and-few-shot&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-resources/#whats-a-no-shot-zero-shot-one-shot-and-few-shot&quot; class=&quot;heading-anchor&quot;&gt;What’s a no-shot (zero-shot), one-shot, and few-shot?&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;A no-shot is a query with no examples. E.g.&lt;br&gt;Classify this review: I loved this movie!&lt;br&gt;Sentiment:&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A one-shot, is where you’ve given one example. E.g.&lt;br&gt;Classify this review: I loved this movie!&lt;br&gt;Sentiment: Positive&lt;br&gt;Classify this review: I don’t like this chair&lt;br&gt;Sentiment:&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A few-shot, is, you guessed it, given a few examples. E.g.&lt;br&gt;Classify this review: I loved this movie!&lt;br&gt;Sentiment: Positive&lt;br&gt;Classify this review: I don’t like this chair&lt;br&gt;Sentiment: Negative&lt;br&gt;Who would use this product?&lt;br&gt;Sentiment:&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Source: &lt;a href=&quot;https://rahulrajpvr7d.medium.com/zero-shot-one-shot-and-few-shot-learning-with-examples-8a3efdcbb158&quot; rel=&quot;noopener&quot;&gt;Zero shot , One shot and Few shot learning with examples&lt;/a&gt;&lt;/p&gt;&lt;p&gt;What’s a vector database?&lt;/p&gt;&lt;p&gt;How do you deal with streaming and non-streaming responses?&lt;/p&gt;&lt;p&gt;What’s the RISEN framework for prompt engineering?&lt;/p&gt;&lt;p&gt;How does a LLM work?&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.servicenow.com/community/developer-advocate-blog/ai-academy-the-risen-framework/ba-p/2977866&quot; rel=&quot;noopener&quot;&gt;AI Academy: The RISEN Framework - ServiceNow Community&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://communityresources.service-now.com/ai&quot; rel=&quot;noopener&quot;&gt;ServiceNow Generative AI Prompt Library - ServiceNow Generative AI Prompt Library (service-now.com)&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Is your ServiceNow Navigator not working as expected?</title>
      <link href="https://jace.pro/blog/is-your-servicenow-navigator-not-working-as-expected/" />
      <updated>2024-07-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/is-your-servicenow-navigator-not-working-as-expected/</id>
      <content type="html">
				&lt;p&gt;When I was working with the Next UI it was taking forever to load, it would show up as an empty box. Turns out, the lookup still needs to happen break the user’s expectations.&lt;/p&gt;&lt;p&gt;Normally when a page is done loading, the page should be ready to work with. The Next UI is more complicated and loads some parts with lazy loading. The navigator now shows immediately, but if there’s nothing in your local cache it will be empty until loaded, (not clear it’s loading either). That just won’t stand.&lt;/p&gt;&lt;p&gt;Thankfully there’s a property to disable this lazy loading so it loads and works in a way more consistent with user’s expectations. `glide.ui.next_experience.menu_lazy_loading_enabled` can be set to false to disable this.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Configuring Workspace Lists are not hard when you know where to look</title>
      <link href="https://jace.pro/blog/configuring-workspace-lists-are-not-hard-when-you-know-where-to-look/" />
      <updated>2024-06-13T00:00:00Z</updated>
      <id>https://jace.pro/blog/configuring-workspace-lists-are-not-hard-when-you-know-where-to-look/</id>
      <content type="html">
				&lt;p&gt;Recently, I faced a challenge while trying to modify list items in the software asset workspace without having access to App Engine Studio. My goal was to update lists and all the resources pointed to using App Engine Studio for these changes.&lt;/p&gt;&lt;p&gt;I decided to explore UI Builder and ventured into the /operations/ path to create a variant. Despite my efforts, the list navigation (list_nav) configuration was set to @context.app.listConfigId, and I couldn’t pinpoint how this was being set up.&lt;/p&gt;&lt;p&gt;Luckily, Brad Tilton provided a crucial tip: “It all happens outside UIB. Check out this &lt;a href=&quot;https://www.servicenow.com/community/next-experience-articles/configuring-lists-in-configurable-workspace/ta-p/2331983&quot; rel=&quot;noopener&quot;&gt;article&lt;/a&gt;.”&lt;/p&gt;&lt;p&gt;Note this section of the article;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;UX Lists (sys_ux_list): Lists defined for each category. A list must have a category and you can configure the conditions for the list data, columns, grouping, and other parameters you can set. You’ll notice that you cannot configure the component properties for a List component when the page is read only, but many of those properties are exposed in the UX List record for configuration, so you do not need to duplicate the page to set List properties.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Following Brad’s advice, I created a UX List item, which worked seamlessly. Once I knew where to look, the process was straightforward.&lt;/p&gt;&lt;p&gt;If you’re in a similar situation, check out the ServiceNow documentation on configuring lists in configurable workspaces. It could save you a lot of time and effort!&lt;/p&gt;&lt;p&gt;P.S.&lt;br&gt;I found all the documentation saying you can &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:7207069631772069888?commentUrn=urn%3Ali%3Acomment%3A%28activity%3A7207069631772069888%2C7207107885061816320%29&amp;amp;dashCommentUrn=urn%3Ali%3Afsd_comment%3A%287207107885061816320%2Curn%3Ali%3Aactivity%3A7207069631772069888%29&quot; rel=&quot;noopener&quot;&gt;use App Engine Studio for this&lt;/a&gt;. First one must be entitled to App Engine Studio. Also something about App Engine Studio is I guess it cannot or is not how one changes UX list for Out of the box (OOTB) workspaces. Thanks for that interaction Marc Mouries.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>AI, data ownership, privacy and ethics</title>
      <link href="https://jace.pro/blog/ai-data-ownership-privacy-and-ethics/" />
      <updated>2023-12-23T00:00:00Z</updated>
      <id>https://jace.pro/blog/ai-data-ownership-privacy-and-ethics/</id>
      <content type="html">
				&lt;h1 id=&quot;ai-data-ownership-privacy-and-databases-a-heartland-perspective&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-data-ownership-privacy-and-ethics/#ai-data-ownership-privacy-and-databases-a-heartland-perspective&quot; class=&quot;heading-anchor&quot;&gt;AI, Data Ownership, Privacy and Databases: A Heartland Perspective&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Artificial intelligence (AI) is here. It’s reshaping things whether we like it or not. But today let’s dive into a head-scratcher - who actually owns the data that fuels AI?&lt;/p&gt;&lt;h2 id=&quot;funneling-text-suggestions-from-an-unlikely-place&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-data-ownership-privacy-and-ethics/#funneling-text-suggestions-from-an-unlikely-place&quot; class=&quot;heading-anchor&quot;&gt;Funneling Text Suggestions from An Unlikely Place&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You might’ve typed something on Google or LinkedIn and been grateful for those handy text suggestions. Ever wondered where they come from? They originated from the Enron Corpus. A database of old emails publicly available for scrutiny while investigating the Enron scandal.&lt;/p&gt;&lt;p&gt;Interesting right? Now how does this relate to AI and ethics? Let me explain.&lt;/p&gt;&lt;h2 id=&quot;who-owns-the-data-anyway&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-data-ownership-privacy-and-ethics/#who-owns-the-data-anyway&quot; class=&quot;heading-anchor&quot;&gt;Who Owns The Data Anyway?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;When you’re building an artificial language model, determining data ownership can be as clear as mud. You’d think whoever created the model owns it, right? That idea takes a knock when you start considering where that data came from—the ethical parameters around its sourcing—was it expressedly given up by users or simply scraped off websites by developers?&lt;/p&gt;&lt;p&gt;These are just some thoughts inspired by Luis Villa guest appearance on the &lt;a href=&quot;https://changelog.com/podcast/458&quot; rel=&quot;noopener&quot;&gt;ChangeLog&lt;/a&gt;. He’s a programmer made lawyer.&lt;/p&gt;&lt;h2 id=&quot;getting-our-feet-wet-in-ethics&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-data-ownership-privacy-and-ethics/#getting-our-feet-wet-in-ethics&quot; class=&quot;heading-anchor&quot;&gt;Getting Our Feet Wet in Ethics&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;case-study-1-hollywood-meets-ai-with-william-shatner-and-storyfile&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-data-ownership-privacy-and-ethics/#case-study-1-hollywood-meets-ai-with-william-shatner-and-storyfile&quot; class=&quot;heading-anchor&quot;&gt;Case Study 1: Hollywood Meets AI with William Shatner &amp;amp; StoryFile&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Let’s chat about William Shatner jumping onto the recording hot-seat with &lt;a href=&quot;https://storyfile.com/gallery/william-shatner/&quot; rel=&quot;noopener&quot;&gt;StoryFile&lt;/a&gt;. Users shoot questions at this video interface; meanwhile Shatner’s authentic responses hold down the fort—no fabricated information used here pal! This has to be in my opinion, the best way to be respectful to the individual’s desires, and keeps the response true to it’s context.&lt;/p&gt;&lt;h3 id=&quot;case-study-2-more-than-meets-the-eye-with-james-vlahos&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-data-ownership-privacy-and-ethics/#case-study-2-more-than-meets-the-eye-with-james-vlahos&quot; class=&quot;heading-anchor&quot;&gt;Case Study 2: More than Meets The Eye with James Vlahos&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;On flip side things get dicey when James Vlahos uses AI to chat with digital representation of his deceased father. Though Vlahos’s ‘dad’ seems pretty real, remember we’re dealing with a high-tech marionette here that mimics the source, rather than embodying it—just one of the many ethical puddles you might step into in this tech field!&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.thedailybeast.com/chatbots-by-james-vlahos-and-hereafter-ai-are-letting-you-talk-to-the-dead&quot; rel=&quot;noopener&quot;&gt;https://www.thedailybeast.com/chatbots-by-james-vlahos-and-hereafter-ai-are-letting-you-talk-to-the-dead&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;figuring-out-ai-more-than-1s-and-0s&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-data-ownership-privacy-and-ethics/#figuring-out-ai-more-than-1s-and-0s&quot; class=&quot;heading-anchor&quot;&gt;Figuring Out AI: More Than 1’s and 0’s&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;According to Gary V, new tech should be about cutting out drudgery and making more room for electrifying stuff—the sort of thrill-of-the-chase excitement that got us into this high-speed industry. And yes, I’m nodding right along! His quick burst &lt;a href=&quot;https://www.linkedin.com/posts/garyvaynerchuk_chatgpt-ai-activity-7017203136528277504-w9Ol&quot; rel=&quot;noopener&quot;&gt;video clip&lt;/a&gt; nails it better than I ever could.&lt;/p&gt;&lt;p&gt;Folks fretted about job cuts even back in my ServiceNow days circa 2007 when John H voiced his concerns when I was automating some work. This feels like more of the same. This lets our brain focus on what really matters.&lt;/p&gt;&lt;h2 id=&quot;bottom-line&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ai-data-ownership-privacy-and-ethics/#bottom-line&quot; class=&quot;heading-anchor&quot;&gt;Bottom Line&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Only use data you’ve made or have explicit permission to use when involving AI. With Scribe.monster I wrote every code example by hand it uses to suggest code. With the AI bot on my blog it is only using the content I’ve written.&lt;/p&gt;&lt;p&gt;Quick question though—you got any thoughts on this?&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The ideal customer for ServiceNow has changed, hint, it is not you, probably</title>
      <link href="https://jace.pro/blog/the-ideal-customer-for-servicenow-has-changed-hint-it-is-not-you-probably/" />
      <updated>2023-10-26T00:00:00Z</updated>
      <id>https://jace.pro/blog/the-ideal-customer-for-servicenow-has-changed-hint-it-is-not-you-probably/</id>
      <content type="html">
				&lt;p&gt;Lately I’ve been thinking a lot about the value tools add for the price they cost.&lt;/p&gt;&lt;h2 id=&quot;value-props-everywhere&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/the-ideal-customer-for-servicenow-has-changed-hint-it-is-not-you-probably/#value-props-everywhere&quot; class=&quot;heading-anchor&quot;&gt;Value props everywhere&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We’ve all seen fantastic products in our day. Look at Netflix back when they started. Now look how they gave folks who wanted alternatives to Cable. Netflix’s value prop was simple pricing for a clear outcome, movies every month by DVD. Next, let’s consider one more, Amazon. They have always been selling books. They made it the easiest to buy from them. Let’s turn that perspective to ServiceNow.&lt;/p&gt;&lt;h2 id=&quot;servicenow-a-game-changer&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/the-ideal-customer-for-servicenow-has-changed-hint-it-is-not-you-probably/#servicenow-a-game-changer&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow: A Game-Changer&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;When ServiceNow burst onto the scene, it was a total game-changer for the realm of IT services. Back then, other tools like HP Service Desk and TouchPaper were a headache. Upgrades ate up a lot of your time and budget. But ServiceNow did things differently. It handled updates automatically, whether you asked for them or not.&lt;/p&gt;&lt;p&gt;ServiceNow stood out because it was easy to use and flexible. Unlike other tools that had trouble making changes and getting data, ServiceNow made everything simple. You could customize how lists and forms looked, automate tasks, and generate reports. This simplicity was the heart of ServiceNow’s value.&lt;/p&gt;&lt;h3 id=&quot;what-made-it-so-great&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/the-ideal-customer-for-servicenow-has-changed-hint-it-is-not-you-probably/#what-made-it-so-great&quot; class=&quot;heading-anchor&quot;&gt;What made it so great?&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Back then, ServiceNow was a no-frills tool. It had some core components like the event queue, scripts, processors, and forms. It’s expanded now, but it’s important to remember what made it shine in its early days.&lt;/p&gt;&lt;p&gt;It was a lot simpler back then. The basics included:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Event queue&lt;/li&gt;&lt;li&gt;Script actions&lt;/li&gt;&lt;li&gt;Processors&lt;/li&gt;&lt;li&gt;UI Pages&lt;/li&gt;&lt;li&gt;UI Macros&lt;/li&gt;&lt;li&gt;Business Rules&lt;/li&gt;&lt;li&gt;UI Actions&lt;/li&gt;&lt;li&gt;Client Scripts&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These building blocks formed the essence of ServiceNow. While it’s grown since then, let’s not forget its humble beginnings.&lt;/p&gt;&lt;h3 id=&quot;the-value-prop-for-the-business&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/the-ideal-customer-for-servicenow-has-changed-hint-it-is-not-you-probably/#the-value-prop-for-the-business&quot; class=&quot;heading-anchor&quot;&gt;The value prop for the business&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;From a business’s perspective, automation is huge. Many times I’ve thought over the years how much I’d love to have my own always on person instance. Pie in the sky thinking there. In the beginning you’d pay a fixed price for “itil” users a month like you might a cell phone and that was it. You built value by utilizing ServiceNow’s basic features, such as ITSM.&lt;/p&gt;&lt;h3 id=&quot;the-value-prop-for-the-developers&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/the-ideal-customer-for-servicenow-has-changed-hint-it-is-not-you-probably/#the-value-prop-for-the-developers&quot; class=&quot;heading-anchor&quot;&gt;The value prop for the developers&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;For us developers, ServiceNow was a dream come true (at least for me). I’d never managed a production server upgrade before. Shuffling code between different environments was a whole new adventure. Remember, this was before the era of Git version control.&lt;/p&gt;&lt;p&gt;As time passed, ServiceNow kept up with the times and evolved. Before it hit the stock market, things were more straightforward. I was working at a partner company when this transition happened. We had training sessions to wrap our heads around the licensing changes. It was critical to prevent unexpected surprises on our customers’ bills. This was when they introduced the Approval entitlement, which added an extra cost.&lt;/p&gt;&lt;p&gt;Now, it’s time to explore other tools and see which ones carry the same spirit as this giant. I’ve got a list here, no specific order. If you’ve had hands-on experience with any of these, I’d love to hear your thoughts.&lt;/p&gt;&lt;p&gt;Here are the qualities I’m considering: forms, automation, who’s in charge of the database, and pricing.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Platform-like tools&lt;ul&gt;&lt;li&gt;Amazon Honeycode&lt;/li&gt;&lt;li&gt;Airtable&lt;/li&gt;&lt;li&gt;ServiceNow&lt;/li&gt;&lt;li&gt;ToolJet&lt;/li&gt;&lt;li&gt;Budibase&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Industry specific tools&lt;ul&gt;&lt;li&gt;Jira Service Desk&lt;/li&gt;&lt;li&gt;Freshservices&lt;/li&gt;&lt;li&gt;Zendesk&lt;/li&gt;&lt;li&gt;BMC Helix ITSM&lt;/li&gt;&lt;li&gt;Ivanti Service Manager&lt;/li&gt;&lt;li&gt;SysAid&lt;/li&gt;&lt;li&gt;Zoho&lt;/li&gt;&lt;li&gt;ManageEngine ServiceDesk Plus&lt;/li&gt;&lt;li&gt;SolarWinds ServiceDesk&lt;/li&gt;&lt;li&gt;Spiceworks Help Desk&lt;/li&gt;&lt;li&gt;Cherwell&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These notes are a bit dated but let me drop this table;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tool&lt;/th&gt;&lt;th&gt;Form&lt;/th&gt;&lt;th&gt;Automation&lt;/th&gt;&lt;th&gt;Whose DB&lt;/th&gt;&lt;th&gt;Pricing&lt;/th&gt;&lt;th&gt;Difference&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://retool.com/self-hosted/&quot; rel=&quot;noopener&quot;&gt;Retool&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://docs.retool.com/docs/creating-forms&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://docs.retool.com/docs/scripting-retool&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://retool.com/pricing/&quot; rel=&quot;noopener&quot;&gt;Theirs&lt;/a&gt; &lt;a href=&quot;https://retool.com/self-hosted/&quot; rel=&quot;noopener&quot;&gt;Yours&lt;/a&gt;&lt;/td&gt;&lt;td&gt;0,10,?&lt;/td&gt;&lt;td&gt;Granular Access Controls only for Enterprise clients&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.honeycode.aws/pricing&quot; rel=&quot;noopener&quot;&gt;Amazon Honeycode&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;0,20,30&lt;/td&gt;&lt;td&gt;Limited to 2500/10000/100000rows/table&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://airtable.com/pricing&quot; rel=&quot;noopener&quot;&gt;Airtable&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://support.airtable.com/hc/en-us/articles/360050974153-Automations-Overview&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Same except, you control ownership of data&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ServiceNow&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ToolJet&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yours&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BudiBase&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Theirs or Yours&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Jira Service Desk&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.atlassian.com/software/jira/features/automation&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;$20/user/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Freshservices&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://freshdesk.com/automations&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;$29/user/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Zendesk&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.zendesk.com/api-reference/ticketing/business-rules/automations/&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BMC Helix ITSM&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.bmc.com/it-solutions/bmc-helix-itsm-capabilities.html&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;Quote only&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ivanti Service Manager&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.ivanti.com/solutions/service-management/workflow-automation&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Quote only&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SysAid&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.sysaid.com/service-automation&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Quote only&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Zoho&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zoho.com/creator/workflow-automation.html&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ManageEngine ServiceDesk Plus&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.manageengine.com/products/service-desk/help-desk-features.html&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Quote only&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SolarWinds ServiceDesk&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://documentation.solarwinds.com/en/success_center/swsd/content/completeguidetoswsd/automations.htm&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$20/user/mo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Spiceworks Help Desk&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Selfhosted&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cherwell&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://ca.cherwell.com/products/cherwell-core/workflow-automation/&quot; rel=&quot;noopener&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Theirs&lt;/td&gt;&lt;td&gt;Quote only&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>N2SN: Variables, data types, and operators</title>
      <link href="https://jace.pro/blog/n2sn-variables-data-types-and-operators/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-variables-data-types-and-operators/</id>
      <content type="html">
				&lt;p&gt;In ServiceNow, variables are like building blocks. You can use them to store and manipulate data, perform calculations, and make your applications more dynamic.&lt;/p&gt;&lt;h2 id=&quot;variables&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-variables-data-types-and-operators/#variables&quot; class=&quot;heading-anchor&quot;&gt;Variables&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Variables store a value to use programmatically. Let’s look at an example below.&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; myName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Jace&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There’s 4 things happening on that little line.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;`var` is a keyword that declares the next text is named variable.&lt;/li&gt;&lt;li&gt;`myName` is the text the variable is named.&lt;/li&gt;&lt;li&gt;`=` is the operator.&lt;/li&gt;&lt;li&gt;`‘Jace’` is the value stored.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;There’s a lot of opinions folks have about variables, here’s mine.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Be consistent (weather that’s by yourself or with your team).&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Variable naming. Don’t try to remember if you do camelCase or snake_case or hungarian notation. Just pick one and run with it. Personally I use camelCase, but sometimes to be consistent you match the existing code.&lt;/li&gt;&lt;li&gt;Values, I try to match the code here, using single quotes `&#39;`, but sometimes, your value needs a single quote in it, then you have a choice, flip the quotes from single to double `&quot;` or escape the single quote.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Don’t make variables for variables sake. What do I mean by that? Let’s consider this code.&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;var herName = &#39;Jane&#39;;
var herLastName = &#39;Doe&#39;;
var herFullName = &#39;Jane Doe&#39;;
console.log(herFullName);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That code has three variables but only one is being used. Don’t make variables you’re not going to use.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Variables should be easy to understand what they are without having to read all the code. Sometimes you’ll see code online like `var a = ‘Jace’;` but was does `a` mean in the context of it’s code? The variable name `a` should be more descriptive, something like `var firstName = ‘Jace’;`&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now that my opinions are out of the way, lets talk about what other types of data you can store in a variable and how you use that data.&lt;/p&gt;&lt;h2 id=&quot;data-types&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-variables-data-types-and-operators/#data-types&quot; class=&quot;heading-anchor&quot;&gt;Data Types&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Javascript variables can only store certain kinds of data. In the past section, we’ve been just storing text, technically folks would call these *strings*. Let’t talk about each common data type.&lt;/p&gt;&lt;h3 id=&quot;string&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-variables-data-types-and-operators/#string&quot; class=&quot;heading-anchor&quot;&gt;String&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Strings are text, when storing them you’ll want to use quotes around them.&lt;/p&gt;&lt;h3 id=&quot;number&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-variables-data-types-and-operators/#number&quot; class=&quot;heading-anchor&quot;&gt;Number&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Numbers the 0 through 9 values. Javascript doesn’t differentiate whole numbers from decimals so you can store any like &lt;code&gt;var age = 25;&lt;/code&gt; or &lt;code&gt;var changeInPocket = 0.23;&lt;/code&gt;&lt;/p&gt;&lt;h3 id=&quot;boolean&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-variables-data-types-and-operators/#boolean&quot; class=&quot;heading-anchor&quot;&gt;Boolean&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Boolean’s are just another way to say &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;&lt;h3 id=&quot;undefined&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-variables-data-types-and-operators/#undefined&quot; class=&quot;heading-anchor&quot;&gt;Undefined&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Undefined is a special type. When something has a type of &lt;code&gt;undefined&lt;/code&gt; that means, the variable has not been defined to use.&lt;/p&gt;&lt;h3 id=&quot;null&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-variables-data-types-and-operators/#null&quot; class=&quot;heading-anchor&quot;&gt;Null&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Null is the absence of value. Technically you can just declare a variable like &lt;code&gt;var name;&lt;/code&gt; without saying what it is. In this case &lt;code&gt;name&lt;/code&gt; would be &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;&lt;h3 id=&quot;objects&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-variables-data-types-and-operators/#objects&quot; class=&quot;heading-anchor&quot;&gt;Objects&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Objects are a complicated subject, but I like to think of objects like I think about a person. A person is a collection of properties. I think a code example may help.&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;var jace = {
  name: &#39;Jace&#39;,
  age: 25,
  createsContent: true
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This looks very different from the other data, let’s consider how this is different.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The value is wrapped with curly brackets &lt;code&gt;{}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;The properties don’t have the &lt;code&gt;var&lt;/code&gt; keyword declaration&lt;/li&gt;&lt;li&gt;They are using &lt;code&gt;:&lt;/code&gt; instead of &lt;code&gt;=&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Many lines are ended with a comma &lt;code&gt;,&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Yep. Objects are different. This is one way to set up an object. This is by far what I see most the time when making objects.&lt;/p&gt;&lt;p&gt;Once you have a object there’s a few ways to both add and set data in it.&lt;/p&gt;&lt;p&gt;Most the time you’ll see code using &lt;em&gt;dot notation&lt;/em&gt;. Sometimes you’ll see &lt;em&gt;bracket notation&lt;/em&gt;.&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Lets get that age value&lt;/span&gt;
jace&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;// dot notation&lt;/span&gt;
jace&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;age&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;// bracket notation&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can also change those values like you could assign them.&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;jace&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;age &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;27&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The reason you may need to use bracket notation over dot notation is when the property name may conflict with a inherited function, keyword, or if it starts with a non-alphabetic character. I find that sometimes I need to name a property dynamically, in those cases bracket notation is the way to go.&lt;/p&gt;&lt;h3 id=&quot;arrays&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-variables-data-types-and-operators/#arrays&quot; class=&quot;heading-anchor&quot;&gt;Arrays&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Arrays are technically objects. But they work a little different.&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
ages&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//this is the 1st element in the array&lt;/span&gt;
ages&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//this is the 2nd&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There’s a lot of ways to loop over this data, we’ll get to that later. I just want to cover adding data to an array since that’s the most useful thing.&lt;br&gt;&lt;code&gt;ages.push(30);&lt;/code&gt; is how you would add 30 as the last element of the array.&lt;/p&gt;&lt;h2 id=&quot;operators&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-variables-data-types-and-operators/#operators&quot; class=&quot;heading-anchor&quot;&gt;Operators&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;What are operators? Operators let you set values, check a value matches another, and that kind of stuff. Most the time you’ll probably be using &lt;code&gt;=&lt;/code&gt; to set a value. However you will need to check values and to do that you’ll use &lt;code&gt;==&lt;/code&gt;. Out of ServiceNow most the time folks use &lt;code&gt;===&lt;/code&gt;. The difference between &lt;code&gt;==&lt;/code&gt; and &lt;code&gt;===&lt;/code&gt; is double equals coerces the value on both sides so they are the same type, and triple equals checks type first, if they match types, then checks values. Depending on if it’s a match or not you’ll get the boolean, &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;There are some shortcuts to assigning values.&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; workingTitle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Don&#92;&#39;t Panic&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
workingTitle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; workingTitle &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; - A quote&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// This ^ is the same as the next line&lt;/span&gt;
workingTitle &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; - A quote&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>N2SN: UI policies and UI actions in ServiceNow</title>
      <link href="https://jace.pro/blog/n2sn-ui-policies-and-ui-actions-in-servicenow/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-ui-policies-and-ui-actions-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;UI policies and UI actions are like the power tools of your applications. By using these tools, you can create more interactive and user-friendly interfaces that make your users happy.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: Script Includes and Global Business Rules</title>
      <link href="https://jace.pro/blog/n2sn-script-includes-and-global-business-rules/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-script-includes-and-global-business-rules/</id>
      <content type="html">
				&lt;p&gt;Script Includes and Global Business Rules are like the wizards behind the scenes. By using these tools, you can create more powerful and flexible applications that can handle complex business logic and workflows.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: Promises and asynchronous programming</title>
      <link href="https://jace.pro/blog/n2sn-promises-and-asynchronous-programming/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-promises-and-asynchronous-programming/</id>
      <content type="html">
				&lt;p&gt;Asynchronous programming is like multitasking for your applications. By using promises, you can create more responsive and efficient applications that can handle multiple tasks at once.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: Objects and object-oriented programming</title>
      <link href="https://jace.pro/blog/n2sn-objects-and-object-oriented-programming/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-objects-and-object-oriented-programming/</id>
      <content type="html">
				&lt;p&gt;Objects are the building blocks of ServiceNow applications. By using object-oriented programming, you can create more complex and flexible applications that are easier to maintain and extend.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: JSON (JavaScript Object Notation)</title>
      <link href="https://jace.pro/blog/n2sn-json-javascript-object-notation/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-json-javascript-object-notation/</id>
      <content type="html">
				&lt;p&gt;JSON is like a common language that lets different parts of your applications talk to each other. By using JSON, you can easily share data between different systems and create more integrated applications.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: Functions and function parameters</title>
      <link href="https://jace.pro/blog/n2sn-functions-and-function-parameters/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-functions-and-function-parameters/</id>
      <content type="html">
				&lt;p&gt;Functions are like little machines that do specific tasks. By using function parameters, you can customize what these machines do and create more powerful and versatile applications.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN(ES21): Template literals</title>
      <link href="https://jace.pro/blog/n2snes21-template-literals/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2snes21-template-literals/</id>
      <content type="html">
				&lt;p&gt;Template literals are like a shortcut for creating strings. By using them, you can create more dynamic and readable code that saves time and makes your code more expressive.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN(ES21): Spread operator</title>
      <link href="https://jace.pro/blog/n2snes21-spread-operator/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2snes21-spread-operator/</id>
      <content type="html">
				&lt;p&gt;The spread operator is like a swiss army knife for working with arrays. By using it, you can quickly and easily manipulate arrays and create more expressive and concise code.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN(ES21): Destructuring</title>
      <link href="https://jace.pro/blog/n2snes21-destructuring/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2snes21-destructuring/</id>
      <content type="html">
				&lt;p&gt;Destructuring is like a new way to extract data from arrays and objects. By using it, you can quickly and easily extract the data you need and create more readable and expressive code.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: DOM manipulation and event handling</title>
      <link href="https://jace.pro/blog/n2sn-dom-manipulation-and-event-handling/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-dom-manipulation-and-event-handling/</id>
      <content type="html">
				&lt;p&gt;The DOM is like a canvas for your applications. By using DOM manipulation and event handling, you can create dynamic and interactive applications that respond to user input and make your users happy.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: Debugging and error handling</title>
      <link href="https://jace.pro/blog/n2sn-debugging-and-error-handling/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-debugging-and-error-handling/</id>
      <content type="html">
				&lt;p&gt;Debugging and error handling are like a safety net for your applications. By using these tools, you can catch errors and fix bugs before they cause bigger problems.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: Control structures (if-else statements, loops)</title>
      <link href="https://jace.pro/blog/n2sn-control-structures-if-else-statements-loops/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-control-structures-if-else-statements-loops/</id>
      <content type="html">
				&lt;p&gt;Control structures give you the power to make your applications do what you want. With if-else statements, loops, and other control structures, you can make your applications more flexible and responsive.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: Common ServiceNow APIs (e.g. GlideRecord, GlideAggregate, GlideSystem)</title>
      <link href="https://jace.pro/blog/n2sn-common-servicenow-apis-eg-gliderecord-glideaggregate-glidesystem/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-common-servicenow-apis-eg-gliderecord-glideaggregate-glidesystem/</id>
      <content type="html">
				&lt;p&gt;ServiceNow APIs are like the tools in your toolbox. By using common APIs like GlideRecord, GlideAggregate, and GlideSystem, you can access data and functionality in ServiceNow and create more powerful applications.&lt;/p&gt;&lt;h2 id=&quot;gliderecord&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-common-servicenow-apis-eg-gliderecord-glideaggregate-glidesystem/#gliderecord&quot; class=&quot;heading-anchor&quot;&gt;GlideRecord&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The most common API that people know about is GlideRecord.&lt;br&gt;What is &lt;code&gt;GlideRecord&lt;/code&gt;? &lt;code&gt;GlideRecord&lt;/code&gt; is a class, that’s a technical term. &lt;code&gt;GlideRecord&lt;/code&gt; is a way that you can ask the database for data about a record or a set of records. It also lets you update those records, create new records, or delete existing records. &lt;code&gt;GlideRecord&lt;/code&gt; gives you back these things called &lt;code&gt;GlideElements&lt;/code&gt;, so they’re not exactly text, but they can appear to be that way. So you want to make sure you convert those values to text, with either &lt;code&gt;getValue&lt;/code&gt; or &lt;code&gt;toString&lt;/code&gt;. There’s a lot of ways to query data in a &lt;code&gt;GlideRecord&lt;/code&gt;. I prefer to just use &lt;code&gt;addEncodedQuery&lt;/code&gt;. You can generate the encoded query when you go to a list, and you right-click on the breadcrumb of your query, and you can say Copy Query, and that will be your encoded query. There are operators like &lt;code&gt;addJoinQuery&lt;/code&gt;, &lt;code&gt;addNotNullQuery&lt;/code&gt;, &lt;code&gt;addNullQuery&lt;/code&gt;, &lt;code&gt;addOrCondition&lt;/code&gt;, &lt;code&gt;addActiveQuery&lt;/code&gt;. They don’t work everywhere, and in my opinion, they’re just noise. There’s no reason to use them. There is a shortcut method, once you have a &lt;code&gt;GlideRecord&lt;/code&gt;, called .get, and that’ll grab the first record that matches the query you give it in get, whether that’s a &lt;code&gt;sys_id&lt;/code&gt; or if you give it two parameters, it’ll look for the first record where the field you give it matches the value you give it. When writing with a &lt;code&gt;GlideRecord&lt;/code&gt;, there’s a few things you should be aware of. Whenever you write with a &lt;code&gt;GlideRecord&lt;/code&gt;, it will set all the sys fields to &lt;code&gt;sys_created_on&lt;/code&gt; and &lt;code&gt;sys_created_by&lt;/code&gt; and &lt;code&gt;sys_updated_on&lt;/code&gt; and &lt;code&gt;sys_updated_by&lt;/code&gt;. Those are set automatically, unless you set &lt;code&gt;autoSysFields&lt;/code&gt; as false. Additionally, there’s another similar method called &lt;code&gt;setWorkflow&lt;/code&gt;, which confusingly doesn’t stop flows from executing. It stops other business rules from executing. There’s a less known &lt;code&gt;setEngines&lt;/code&gt;, which you can disable some of the engines and other processes in ServiceNow. That rarely gets used, but it’s nice to know what tools you can use to work with things. There is one type of &lt;code&gt;GlideRecord&lt;/code&gt; call that you need to be aware of, which is &lt;code&gt;GlideRecordSecure&lt;/code&gt;. That’s the way people should be using &lt;code&gt;GlideRecord&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&quot;gliderecordsecure&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-common-servicenow-apis-eg-gliderecord-glideaggregate-glidesystem/#gliderecordsecure&quot; class=&quot;heading-anchor&quot;&gt;GlideRecordSecure&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GlideRecordSecure&lt;/code&gt; conforms to the access controls. If someone was able to somehow access a server-side request, if they use &lt;code&gt;GlideRecord&lt;/code&gt;, access controls aren’t invoked. Imagine if you’re the HR data and you said, show me all employees and their salaries. If an access control omitted salaries from the response, &lt;code&gt;GlideRecordSecure&lt;/code&gt; would properly return either the rows or the columns with the data omitted, depending on your access controls. Using &lt;code&gt;GlideRecordSecure&lt;/code&gt; is really important when exposing stuff.&lt;/p&gt;&lt;h2 id=&quot;glideaggregate&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-common-servicenow-apis-eg-gliderecord-glideaggregate-glidesystem/#glideaggregate&quot; class=&quot;heading-anchor&quot;&gt;GlideAggregate&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Another class we’re really familiar with is &lt;code&gt;GlideAggregate&lt;/code&gt;. &lt;code&gt;GlideRecord&lt;/code&gt; can read the details on a record or a list of records, but one thing &lt;code&gt;GlideRecord&lt;/code&gt; isn’t, &lt;code&gt;GlideRecord&lt;/code&gt; isn’t as fast as it could be. When you’re working with hundreds of thousands of records, you’ll likely want to make sure or work with &lt;code&gt;GlideAggregate&lt;/code&gt; before you work with &lt;code&gt;GlideRecord&lt;/code&gt; to ensure you’re not querying too many records or you’re, in fact, deleting the right quantity of records. Anytime that you’re going to be doing a count of some sort or average, any type of math on the results that you’re getting, you’ll definitely want to be using &lt;code&gt;GlideAggregate&lt;/code&gt;. Something really nice about &lt;code&gt;GlideAggregate&lt;/code&gt; is almost all the functions in &lt;code&gt;GlideRecord&lt;/code&gt; work on it. There is just the added &lt;code&gt;addAggregate&lt;/code&gt; and &lt;code&gt;getAggregate&lt;/code&gt;, and then I think you can also do a group by &lt;code&gt;GlideAggregate&lt;/code&gt;. &lt;code&gt;orderByAggregate&lt;/code&gt; is what I’m thinking of, so you can say order the aggregate by the category, and then it’ll order by A to Z for the category count.&lt;/p&gt;&lt;h2 id=&quot;glidesystem&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-common-servicenow-apis-eg-gliderecord-glideaggregate-glidesystem/#glidesystem&quot; class=&quot;heading-anchor&quot;&gt;GlideSystem&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The next class I think you really should be familiar with in ServiceNow would be GlideSystem, which is really a hodgepodge of a bunch of classes. There are so many methods that exist with GlideSystem, but for the most part, what I use the GlideSystem call, the way you call it is just do gs. and then the method you want to call. But for the most part, folks just do logs with GlideSystem. Make sure you do &lt;a href=&quot;http://gs.info&quot; rel=&quot;noopener&quot;&gt;gs.info&lt;/a&gt; or gs.warn or gs.debug or gs. You’ll also use GlideSystem to get the current logged in user ID and their roles.&lt;/p&gt;&lt;h2 id=&quot;glideajax&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/n2sn-common-servicenow-apis-eg-gliderecord-glideaggregate-glidesystem/#glideajax&quot; class=&quot;heading-anchor&quot;&gt;GlideAjax&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The last class I think you should be familiar with is &lt;code&gt;GlideAjax&lt;/code&gt;. &lt;code&gt;GlideAjax&lt;/code&gt; is a client-side call you can make to the server to ask for data within a client script. All the other ones I discussed are all server-to-server. So you’re in a server-side script field telling it to run server-side. In a client script, it actually executes on the browser. Where that’s useful is if you want to set something dynamically on the form as the user is setting something. Maybe you don’t want them to order a phone when they already have a phone that’s been ordered and in process. In that case, you should probably use a &lt;code&gt;GlideAggregate&lt;/code&gt; to do a lookup on the server side to check the status of that request and then come back to them and say, hey, look, you already have a phone on order. There’s a link to check it out. Make your changes there or contact when we’re about it.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: Client-side vs. server-side scripting in ServiceNow</title>
      <link href="https://jace.pro/blog/n2sn-client-side-vs-server-side-scripting-in-servicenow/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-client-side-vs-server-side-scripting-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;Client-side and server-side scripting are like the two sides of a coin. By using both, you can create more efficient and responsive applications that take advantage of the strengths of both sides.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: Best practices and coding standards in ServiceNow</title>
      <link href="https://jace.pro/blog/n2sn-best-practices-and-coding-standards-in-servicenow/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-best-practices-and-coding-standards-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;Best practices and coding standards are like guidelines for creating great applications. By following these standards, you can create more consistent and maintainable code that is easier to work with and extend.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>N2SN: Arrays and array methods</title>
      <link href="https://jace.pro/blog/n2sn-arrays-and-array-methods/" />
      <updated>2023-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/n2sn-arrays-and-array-methods/</id>
      <content type="html">
				&lt;p&gt;Arrays are like a toolbox for storing and manipulating data. By using array methods, you can quickly sort, filter, and transform data in your applications.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Ready to Get Out of Your Comfort Zone? Heres How</title>
      <link href="https://jace.pro/blog/ready-to-get-out-of-your-comfort-zone-heres-how/" />
      <updated>2023-01-04T00:00:00Z</updated>
      <id>https://jace.pro/blog/ready-to-get-out-of-your-comfort-zone-heres-how/</id>
      <content type="html">
				&lt;p&gt;Are you ready to learn a new skill and get out of your comfort zone? We all need to challenge ourselves and push our boundaries to grow, but it can be intimidating to take the plunge. That’s why I’m here to encourage and motivate you to explore the unknown and discover the power of resilience and perseverance.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/dgl-N073yC-650.webp 650w, https://jace.pro/img/dgl-N073yC-960.webp 960w, https://jace.pro/img/dgl-N073yC-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/dgl-N073yC-650.jpeg&quot; alt=&quot;A bike chain forming the number six next to the word Reasons. Credit padrinan on pixabay&quot; title=&quot;A bike chain forming the number six next to the word Reasons. Credit padrinan on pixabay&quot; width=&quot;1400&quot; height=&quot;931&quot; srcset=&quot;https://jace.pro/img/dgl-N073yC-650.jpeg 650w, https://jace.pro/img/dgl-N073yC-960.jpeg 960w, https://jace.pro/img/dgl-N073yC-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;A bike chain forming the number six next to the word Reasons. Credit padrinan on pixabay&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Here’s 6 Reasons You Should Step Out of Your Comfort Zone:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;You’ll learn more about yourself and what you’re comfortable with.&lt;/li&gt;&lt;li&gt;You’ll become more resilient and adaptable.&lt;/li&gt;&lt;li&gt;You’ll gain new skills and experiences.&lt;/li&gt;&lt;li&gt;You’ll expand your network.&lt;/li&gt;&lt;li&gt;You’ll become more open to new ideas.&lt;/li&gt;&lt;li&gt;You’ll become more confident and motivated.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/oFE8IA3KGc-650.webp 650w, https://jace.pro/img/oFE8IA3KGc-960.webp 960w, https://jace.pro/img/oFE8IA3KGc-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/oFE8IA3KGc-650.jpeg&quot; alt=&quot;The number 7 next to the word Ways. 7 has a mountain and tree in it.&quot; title=&quot;The number 7 next to the word Ways&quot; width=&quot;1400&quot; height=&quot;787&quot; srcset=&quot;https://jace.pro/img/oFE8IA3KGc-650.jpeg 650w, https://jace.pro/img/oFE8IA3KGc-960.jpeg 960w, https://jace.pro/img/oFE8IA3KGc-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;The number 7 next to the word Ways&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Ready to take the leap? Here’s 7 Ways to Get Out of Your Comfort Zone:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Make a goal and work to achieve it.&lt;/li&gt;&lt;li&gt;Take a class in something you’re unfamiliar with.&lt;/li&gt;&lt;li&gt;Try a new sport or hobby.&lt;/li&gt;&lt;li&gt;Challenge yourself to do something you’ve never done before.&lt;/li&gt;&lt;li&gt;Volunteer for a cause outside your normal interests.&lt;/li&gt;&lt;li&gt;Take a risk and do something that scares you.&lt;/li&gt;&lt;li&gt;Step out of your usual routine and do something different.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Here are a few lessons I’ve learned the hard way that can help you on your journey.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Organizing meetups. I ran the Minneapolis ServiceNow Developer Meetup for three years. There I learned a &lt;strong&gt;consistent schedule&lt;/strong&gt; and &lt;strong&gt;great content&lt;/strong&gt; are essential to success. Don’t fear reaching out to others for support. By doing that people provided space, and content. It wasn’t always that way I had to make my fair share of labs.&lt;/li&gt;&lt;li&gt;Making videos. I made videos to discuss the happenings in the ServiceNow space. Although I’ve been on hiatus for a hot minute, I’m coming back in January! I learned that &lt;strong&gt;content is key&lt;/strong&gt;, and that you need to know how to &lt;strong&gt;capture your viewers’ attention&lt;/strong&gt;. I’m no expert, but I’ve come a long way since I started recording, editing, and posting videos.&lt;/li&gt;&lt;li&gt;Blogging: This blog has been part of my life for years now, but when I first started it was a place for me to keep notes. Through content creation, I’ve learned (and am still learning!) &lt;strong&gt;what success looks like&lt;/strong&gt;. Writing is a skill that improves the more you use it, so don’t be afraid to write down your notes. Not everyone wants to make them public, and that’s ok - make sure you write them down!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ready to give it a go? Take the plunge and break out of your comfort zone. Share your experiences and tag me - I’d love to see it!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Alternatives to OpenAI, AI21, CoHere, Azure, AWS Sagemaker, Google Colab,</title>
      <link href="https://jace.pro/blog/alternatives-to-openai-ai21-cohere-azure-aws-sagemaker-google-colab/" />
      <updated>2022-12-31T00:00:00Z</updated>
      <id>https://jace.pro/blog/alternatives-to-openai-ai21-cohere-azure-aws-sagemaker-google-colab/</id>
      <content type="html">
				&lt;p&gt;I’m trying to understand the pricing to all of this AI / ML tech for my uses with &lt;a href=&quot;https://scribe.monster&quot; rel=&quot;noopener&quot;&gt;ScribeMonster&lt;/a&gt;. This is a work in progress so far I’m categorizing the different solutions as Token, Other, or Compute.&lt;/p&gt;&lt;p&gt;If you find an error, reach out to me on twitter @jacebenson.&lt;/p&gt;&lt;h2 id=&quot;token-solutions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/alternatives-to-openai-ai21-cohere-azure-aws-sagemaker-google-colab/#token-solutions&quot; class=&quot;heading-anchor&quot;&gt;Token Solutions&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;/th&gt;&lt;th&gt;Hosting/hour&lt;/th&gt;&lt;th&gt;Prompt Price&lt;/th&gt;&lt;th&gt;Completion Price&lt;/th&gt;&lt;th&gt;Cost per Request&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;OpenAI - Ada&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.0004/1k&lt;/td&gt;&lt;td&gt;$0.0004/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenAI - Ada Trained&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.0016/1k&lt;/td&gt;&lt;td&gt;$0.0016/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenAI - Babbage&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.0005/1k&lt;/td&gt;&lt;td&gt;$0.0005/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenAI - Babbage Trained&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.0024/1k&lt;/td&gt;&lt;td&gt;$0.0024/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenAI - Curie&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.0020/1k&lt;/td&gt;&lt;td&gt;$0.0020/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenAI - Curie Trained&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.0120/1k&lt;/td&gt;&lt;td&gt;$0.0120/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenAI - Davinci&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.0200/1k&lt;/td&gt;&lt;td&gt;$0.0200/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenAI - Davinci Trained&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.1200/1k&lt;/td&gt;&lt;td&gt;$0.1200/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AI21 - J-1 Large&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.0300/1k token&lt;/td&gt;&lt;td&gt;$0.0003&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AI21 - J-1 Large Trained&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.0300/1k token&lt;/td&gt;&lt;td&gt;$0.0003&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AI21 - J-1 Grande&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.0800/1k token&lt;/td&gt;&lt;td&gt;$0.0008&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AI21 - J-1 Grande Trained&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.0800/1k token&lt;/td&gt;&lt;td&gt;$0.0008&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AI21 - J-1 Jumbo&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.2500/1k token&lt;/td&gt;&lt;td&gt;$0.0050&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AI21 - J-1 Jumbo Trained&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.2500/1k token&lt;/td&gt;&lt;td&gt;$0.0050&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CoHere Generate Default&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.0025&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CoHere Generate Custom&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.0050&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CoHere Classify Default&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.0020&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CoHere Classify Custom&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.0020&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CoHere Embed Default&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.0010&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CoHere Embed Custom&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;td&gt;$0.0020&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Azure - Ada&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.0004/1k&lt;/td&gt;&lt;td&gt;$0.0004/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Azure - Ada Trained&lt;/td&gt;&lt;td&gt;$00.05&lt;/td&gt;&lt;td&gt;$0.0004/1k&lt;/td&gt;&lt;td&gt;$0.0004/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Azure - Babbage&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.0005/1k&lt;/td&gt;&lt;td&gt;$0.0005/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Azure - Babbage Trained&lt;/td&gt;&lt;td&gt;$00.08&lt;/td&gt;&lt;td&gt;$0.0005/1k&lt;/td&gt;&lt;td&gt;$0.0005/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Azure - Curie&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.0020/1k&lt;/td&gt;&lt;td&gt;$0.0020/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Azure - Curie Trained&lt;/td&gt;&lt;td&gt;$00.24&lt;/td&gt;&lt;td&gt;$0.0020/1k&lt;/td&gt;&lt;td&gt;$0.0020/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Azure - Davinci&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$0.0200/1k&lt;/td&gt;&lt;td&gt;$0.0200/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Azure - Davinci Trained&lt;/td&gt;&lt;td&gt;$34.00&lt;/td&gt;&lt;td&gt;$0.0200/1k&lt;/td&gt;&lt;td&gt;$0.0200/1k token&lt;/td&gt;&lt;td&gt;Free&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://openai.com/api/pricing/&quot; rel=&quot;noopener&quot;&gt;https://openai.com/api/pricing/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://studio.ai21.com/pricing&quot; rel=&quot;noopener&quot;&gt;https://studio.ai21.com/pricing&lt;/a&gt; ($29/mo after 3 month trial + tokens)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://cohere.ai/pricing&quot; rel=&quot;noopener&quot;&gt;https://cohere.ai/pricing&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/&quot; rel=&quot;noopener&quot;&gt;https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;other-solutions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/alternatives-to-openai-ai21-cohere-azure-aws-sagemaker-google-colab/#other-solutions&quot; class=&quot;heading-anchor&quot;&gt;Other Solutions&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Host&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Google Colab&lt;/td&gt;&lt;td&gt;Priced per “Compute Unit” and that’s tied to your config&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AWS Sagemaker&lt;/td&gt;&lt;td&gt;Different pricing for different tasks&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://colab.research.google.com/signup/pricing&quot; rel=&quot;noopener&quot;&gt;https://colab.research.google.com/signup/pricing&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/sagemaker/pricing/&quot; rel=&quot;noopener&quot;&gt;https://aws.amazon.com/sagemaker/pricing/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;compute-solutions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/alternatives-to-openai-ai21-cohere-azure-aws-sagemaker-google-colab/#compute-solutions&quot; class=&quot;heading-anchor&quot;&gt;Compute Solutions&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Host&lt;/th&gt;&lt;th&gt;Monthly Price&lt;/th&gt;&lt;th&gt;Price&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Pipeline&lt;/td&gt;&lt;td&gt;$12.99&lt;/td&gt;&lt;td&gt;$0.00055 / second [1.98/hour]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Google Cloud&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$3.22 / hour&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AWS EC2 P3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;$3.06 / hour&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Azure ML&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.pipeline.ai/pricing&quot; rel=&quot;noopener&quot;&gt;https://www.pipeline.ai/pricing&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://cloud.google.com/tpu/pricing#how-pricing-works&quot; rel=&quot;noopener&quot;&gt;https://cloud.google.com/tpu/pricing#how-pricing-works&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/ec2/instance-types/p3/&quot; rel=&quot;noopener&quot;&gt;https://aws.amazon.com/ec2/instance-types/p3/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://azure.microsoft.com/en-in/pricing/details/machine-learning/#pricing&quot; rel=&quot;noopener&quot;&gt;https://azure.microsoft.com/en-in/pricing/details/machine-learning/#pricing&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;other-resources&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/alternatives-to-openai-ai21-cohere-azure-aws-sagemaker-google-colab/#other-resources&quot; class=&quot;heading-anchor&quot;&gt;Other Resources&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;GPT Products &lt;a href=&quot;https://www.gpt-list.com/gpt-products?ref=jace.pro&quot; rel=&quot;noopener&quot;&gt;https://www.gpt-list.com/gpt-products?ref=jace.pro&lt;/a&gt;&lt;/li&gt;&lt;li&gt;FutureTools &lt;a href=&quot;https://www.futuretools.io/?ref=jace.pro&quot; rel=&quot;noopener&quot;&gt;https://www.futuretools.io/?ref=jace.pro&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>What is ServiceNow Store (google search trend)</title>
      <link href="https://jace.pro/blog/what-is-servicenow-store-google-search-trend/" />
      <updated>2022-12-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-servicenow-store-google-search-trend/</id>
      <content type="html">
				&lt;p&gt;This sentence has five words. Here are five more words. Five-word sentences are fine. But several together become monotonous. Listen to what is happening. The writing is getting boring. The sound of it drones. It’s like a stuck record. The ear demands some variety.&lt;/p&gt;&lt;p&gt;Now listen. I vary the sentence length, and I create music. Music. The writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short sentences. And I use sentences of medium length.&lt;/p&gt;&lt;p&gt;And sometimes, when I am certain the reader is rested, I will engage him with a sentence of considerable length, a sentence that burns with energy and builds with all the impetus of a crescendo, the roll of the drums, the crash of the cymbals–sounds that say listen to this, it is important. — Gary Provost&lt;/p&gt;&lt;p&gt;ServiceNow Store Apps are applications that have been developed and made available for sale through the ServiceNow Store. These apps are designed to enhance and extend the features and capabilities of the ServiceNow platform and can range from automation and integration tools to custom user interfaces, data analysis, and more.&lt;/p&gt;&lt;p&gt;Back in 2015 ServiceNow started using this “store” to release at a quicker cadence. I have tried a few times to wrap my brain around how this all works and this is my rough notes.&lt;/p&gt;&lt;p&gt;Let’s first address “Why” the store is a thing.&lt;/p&gt;&lt;h3 id=&quot;why&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-servicenow-store-google-search-trend/#why&quot; class=&quot;heading-anchor&quot;&gt;Why&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;You can build your solutions with your Intellectual Property without concerns because of the protection policy functionality where you can hide your work in a private way.&lt;/li&gt;&lt;li&gt;Protect your global scope from these 3rd party applications because you need to explicitly add allowable access for them.&lt;/li&gt;&lt;li&gt;Source control in addition to a customer application repo to add another way to deploy your work.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;current-state-2023&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-servicenow-store-google-search-trend/#current-state-2023&quot; class=&quot;heading-anchor&quot;&gt;Current state (2023)&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Today there’s ~2200 applications on the store and 600+ of them are from ServiceNow proper. The reason I believe ServiceNow uses the store to release some of these applications’ vs using a family release lets them push things out more frequently.&lt;/p&gt;&lt;p&gt;From what I’ve gathered the store apps need to sell for at least ~$1000/mo unless it’s “free”. Most apps however do not list their pricing and payments via the store are something I’ve only heard complaints about, however my sample size is small and biased, if you’d had great experiences as a customer paying for services via the store or a vendor and receiving payment via the store, I want to hear from you. Reach out to me!.&lt;/p&gt;&lt;p&gt;These store releases are not “tied” to family releases anymore. They might be dependent on them. ServiceNow uses family releases as a marketing event. I think there was 1-2 things in the Vancouver release NOT in the store. I suspect the Family releases will continue to get smaller and smaller.&lt;/p&gt;&lt;h3 id=&quot;notable-things-to-watch&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-servicenow-store-google-search-trend/#notable-things-to-watch&quot; class=&quot;heading-anchor&quot;&gt;Notable things to watch&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;There is no “curated” feed to subscribe to get updates on the store. You can follow &lt;a href=&quot;https://justins.house&quot; rel=&quot;noopener&quot;&gt;Justin Meadows&lt;/a&gt; to get weekly updates on store updates but in my opinion it just is too much to track individually.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What is ServiceNow Reports (google search trend)</title>
      <link href="https://jace.pro/blog/what-is-servicenow-reports-google-search-trend/" />
      <updated>2022-12-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-servicenow-reports-google-search-trend/</id>
      <content type="html">
				&lt;p&gt;This sentence has five words. Here are five more words. Five-word sentences are fine. But several together become monotonous. Listen to what is happening. The writing is getting boring. The sound of it drones. It’s like a stuck record. The ear demands some variety.&lt;/p&gt;&lt;p&gt;Now listen. I vary the sentence length, and I create music. Music. The writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short sentences. And I use sentences of medium length.&lt;/p&gt;&lt;p&gt;And sometimes, when I am certain the reader is rested, I will engage him with a sentence of considerable length, a sentence that burns with energy and builds with all the impetus of a crescendo, the roll of the drums, the crash of the cymbals–sounds that say listen to this, it is important. — Gary Provost&lt;/p&gt;&lt;p&gt;ServiceNow Reports are a feature within the ServiceNow platform that allow users to create and customize reports that are based on the data stored within the ServiceNow platform. Reports provide users with the ability to better understand their data and make decisions based on the data. Reports can include visualizations such as bar graphs, pie charts, and tables, as well as the ability to export data to Excel or PDF.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What is ServiceNow Discovery (google search trend)</title>
      <link href="https://jace.pro/blog/what-is-servicenow-discovery-google-search-trend/" />
      <updated>2022-12-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-servicenow-discovery-google-search-trend/</id>
      <content type="html">
				&lt;p&gt;This sentence has five words. Here are five more words. Five-word sentences are fine. But several together become monotonous. Listen to what is happening. The writing is getting boring. The sound of it drones. It’s like a stuck record. The ear demands some variety.&lt;/p&gt;&lt;p&gt;Now listen. I vary the sentence length, and I create music. Music. The writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short sentences. And I use sentences of medium length.&lt;/p&gt;&lt;p&gt;And sometimes, when I am certain the reader is rested, I will engage him with a sentence of considerable length, a sentence that burns with energy and builds with all the impetus of a crescendo, the roll of the drums, the crash of the cymbals–sounds that say listen to this, it is important. — Gary Provost&lt;/p&gt;&lt;p&gt;ServiceNow Discovery is a cloud-based IT service discovery and inventory management solution designed to help organizations identify, monitor, and manage their IT assets. It uses an automated process to detect, identify, and collect inventory data from a wide range of sources, including SNMP, ICMP, and Windows WMI, to provide comprehensive visibility into an organization’s IT infrastructure. This data can then be used to create and manage an inventory that can be used to track changes, identify trends, and proactively plan for future IT needs.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What is Script Include (google search trend)</title>
      <link href="https://jace.pro/blog/what-is-script-include-google-search-trend/" />
      <updated>2022-12-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-script-include-google-search-trend/</id>
      <content type="html">
				&lt;p&gt;This sentence has five words. Here are five more words. Five-word sentences are fine. But several together become monotonous. Listen to what is happening. The writing is getting boring. The sound of it drones. It’s like a stuck record. The ear demands some variety.&lt;/p&gt;&lt;p&gt;Now listen. I vary the sentence length, and I create music. Music. The writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short sentences. And I use sentences of medium length.&lt;/p&gt;&lt;p&gt;And sometimes, when I am certain the reader is rested, I will engage him with a sentence of considerable length, a sentence that burns with energy and builds with all the impetus of a crescendo, the roll of the drums, the crash of the cymbals–sounds that say listen to this, it is important. — Gary Provost&lt;/p&gt;&lt;p&gt;Script Include is a type of ServiceNow object that can be used to store server-side JavaScript code that can be shared across multiple scripts and business rules. Script Includes are useful for encapsulating common functions and data that may be used in multiple places.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What is Service Portal (google search trend)</title>
      <link href="https://jace.pro/blog/what-is-service-portal-google-search-trend/" />
      <updated>2022-12-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-service-portal-google-search-trend/</id>
      <content type="html">
				&lt;p&gt;This sentence has five words. Here are five more words. Five-word sentences are fine. But several together become monotonous. Listen to what is happening. The writing is getting boring. The sound of it drones. It’s like a stuck record. The ear demands some variety.&lt;/p&gt;&lt;p&gt;Now listen. I vary the sentence length, and I create music. Music. The writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short sentences. And I use sentences of medium length.&lt;/p&gt;&lt;p&gt;And sometimes, when I am certain the reader is rested, I will engage him with a sentence of considerable length, a sentence that burns with energy and builds with all the impetus of a crescendo, the roll of the drums, the crash of the cymbals–sounds that say listen to this, it is important. — Gary Provost&lt;/p&gt;&lt;p&gt;Service Portal is a feature of ServiceNow that enables businesses to create a self-service customer experience. It is a feature-rich and easy-to-use platform that allows businesses to quickly and easily create an engaging customer experience. It features a suite of tools and widgets that can be used to create a fully customized, branded customer experience. This includes a powerful search engine, a drag-and-drop page builder, and a variety of widgets and resources to create a unique customer experience. It also offers integration with other ServiceNow products, such as CMDB, Discovery, and Orchestration.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What is GlideRecord (google search trend)</title>
      <link href="https://jace.pro/blog/what-is-gliderecord-google-search-trend/" />
      <updated>2022-12-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-gliderecord-google-search-trend/</id>
      <content type="html">
				&lt;p&gt;This sentence has five words. Here are five more words. Five-word sentences are fine. But several together become monotonous. Listen to what is happening. The writing is getting boring. The sound of it drones. It’s like a stuck record. The ear demands some variety.&lt;/p&gt;&lt;p&gt;Now listen. I vary the sentence length, and I create music. Music. The writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short sentences. And I use sentences of medium length.&lt;/p&gt;&lt;p&gt;And sometimes, when I am certain the reader is rested, I will engage him with a sentence of considerable length, a sentence that burns with energy and builds with all the impetus of a crescendo, the roll of the drums, the crash of the cymbals–sounds that say listen to this, it is important. — Gary Provost&lt;/p&gt;&lt;p&gt;ServiceNow GlideRecord is an API available in the ServiceNow platform to query, insert, update, and delete records in any ServiceNow table. It is a server-side JavaScript API used to access and manipulate data in ServiceNow. GlideRecord enables you to query, update, and delete records in ServiceNow without having to write a single line of code.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What is Employee Center (google search trend)</title>
      <link href="https://jace.pro/blog/what-is-employee-center-google-search-trend/" />
      <updated>2022-12-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-employee-center-google-search-trend/</id>
      <content type="html">
				&lt;p&gt;This sentence has five words. Here are five more words. Five-word sentences are fine. But several together become monotonous. Listen to what is happening. The writing is getting boring. The sound of it drones. It’s like a stuck record. The ear demands some variety.&lt;/p&gt;&lt;p&gt;Now listen. I vary the sentence length, and I create music. Music. The writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short sentences. And I use sentences of medium length.&lt;/p&gt;&lt;p&gt;And sometimes, when I am certain the reader is rested, I will engage him with a sentence of considerable length, a sentence that burns with energy and builds with all the impetus of a crescendo, the roll of the drums, the crash of the cymbals–sounds that say listen to this, it is important. — Gary Provost&lt;/p&gt;&lt;p&gt;ServiceNow Employee Center is an employee-focused platform that provides self-service tools and resources to help employees work more efficiently and effectively. It includes access to tools such as employee profiles, company news, employee resources and development opportunities, and more. It is designed to help employees stay connected to the organization, engage with their peers, and take advantage of the resources available to them.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What is Business Rules (google search trend)</title>
      <link href="https://jace.pro/blog/what-is-business-rules-google-search-trend/" />
      <updated>2022-12-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-business-rules-google-search-trend/</id>
      <content type="html">
				&lt;p&gt;This sentence has five words. Here are five more words. Five-word sentences are fine. But several together become monotonous. Listen to what is happening. The writing is getting boring. The sound of it drones. It’s like a stuck record. The ear demands some variety.&lt;/p&gt;&lt;p&gt;Now listen. I vary the sentence length, and I create music. Music. The writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short sentences. And I use sentences of medium length.&lt;/p&gt;&lt;p&gt;And sometimes, when I am certain the reader is rested, I will engage him with a sentence of considerable length, a sentence that burns with energy and builds with all the impetus of a crescendo, the roll of the drums, the crash of the cymbals–sounds that say listen to this, it is important. — Gary Provost&lt;/p&gt;&lt;p&gt;ServiceNow Business Rules are a powerful feature that allow administrators to automate certain tasks and apply custom logic to any data stored within the ServiceNow platform. Business Rules can be used to set field values, run scripts, create notifications, and more. They are used to ensure data integrity, enforce business logic, and automate workflows.&lt;/p&gt;&lt;p&gt;Business rules are one of the few CORE components of ServiceNow. If you can master these you can solve most problems with them. I plan to write about the other CORE components of ServiceNow, so look forward to my introduction to Script Includes, Events and Script Actions.&lt;/p&gt;&lt;p&gt;Most problems can be solved with a business rule. It may not be the “best” way to solve it now but knowing how you can solve some common reqeusts may drive you to the best way to solve your problem.&lt;/p&gt;&lt;p&gt;Request: Don’t let bad data in this field!&lt;br&gt;Answer: Create a business rule before insert or update that checks the content and does a abort action if the data is “bad”.&lt;/p&gt;&lt;p&gt;Request: Make the server value of the correlation id available to client script for Ajax requests on the page.&lt;br&gt;Answer: Enter Display Business rule and the use of the scratchpad. Set a property of &lt;code&gt;g_scratchpad.correlation_id = current.getValue(&#39;correlation_id&#39;);&lt;/code&gt; Now that’ will be available to client scripts, and client side UI actions.&lt;/p&gt;&lt;p&gt;Request: Show a message on the list of records saying this data syncs every day at 5pm CST.&lt;br&gt;Answer: Make a Before Query Business rule with &lt;code&gt;gs.addInfoMessage(&quot;YOUR MESSAGE HERE&quot;);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Request: When someone sets their email address on their profile, send them an email.&lt;br&gt;Answer: Trigger an event (gs.eventQueue) and pass in the email they set as a parameter.&lt;/p&gt;&lt;p&gt;Request: Don’t allow folks to clear “valid to” on kb articles if they didn’t change the status.&lt;br&gt;Answer: Before Insert/Update and set abort action if valid_to changes and status.changes() == false.&lt;/p&gt;&lt;p&gt;Some of these would be better as a straight notification, some would be better as a data policy.&lt;/p&gt;&lt;p&gt;I hope this helps.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>4 steps to succeed in landing a SErviceNow Job</title>
      <link href="https://jace.pro/blog/4-steps-to-succeed-in-landing-a-servicenow-job/" />
      <updated>2022-12-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/4-steps-to-succeed-in-landing-a-servicenow-job/</id>
      <content type="html">
				&lt;p&gt;This sentence has five words. Here are five more words. Five-word sentences are fine. But several together become monotonous. Listen to what is happening. The writing is getting boring. The sound of it drones. It’s like a stuck record. The ear demands some variety.&lt;/p&gt;&lt;p&gt;Now listen. I vary the sentence length, and I create music. Music. The writing sings. It has a pleasant rhythm, a lilt, a harmony. I use short sentences. And I use sentences of medium length.&lt;/p&gt;&lt;p&gt;And sometimes, when I am certain the reader is rested, I will engage him with a sentence of considerable length, a sentence that burns with energy and builds with all the impetus of a crescendo, the roll of the drums, the crash of the cymbals–sounds that say listen to this, it is important. — Gary Provost&lt;/p&gt;&lt;p&gt;4 steps to succeed in landing a SErviceNow Job?&lt;br&gt;1.&lt;br&gt;Become familiar with the ServiceNow platform and its features: It is important to have a comprehensive understanding of the platform’s features and capabilities. It is also important to be able to demonstrate your knowledge of the platform in an interview.&lt;br&gt;&lt;br&gt;2. Gain experience with ServiceNow projects: It is important to have hands-on experience with ServiceNow projects. This can include either working on a project directly or working with a team that is utilizing the platform.&lt;br&gt;&lt;br&gt;3. Build your network: It is important to network with people in the ServiceNow community. This can include attending conferences and events, joining online forums, or connecting with other ServiceNow professionals on social media.&lt;br&gt;&lt;br&gt;4. Develop your skills: It is important to have a strong understanding of the platform’s capabilities and be able to demonstrate your technical knowledge. It is also important to be able to work well with clients and other team members. Additionally, it is important to stay up to date with the latest trends and technologies in the ServiceNow space.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Show Them What You Got: 5 Values Every ServiceNow Developer Should Have</title>
      <link href="https://jace.pro/blog/show-them-what-you-got-5-values-every-servicenow-developer-should-have/" />
      <updated>2022-12-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/show-them-what-you-got-5-values-every-servicenow-developer-should-have/</id>
      <content type="html">
				&lt;p&gt;What 5 things do I value in any ServiceNow Developer.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Eager to learn&lt;/li&gt;&lt;li&gt;Great communication&lt;/li&gt;&lt;li&gt;Documentation!&lt;/li&gt;&lt;li&gt;Community - Are you part of one&lt;/li&gt;&lt;li&gt;Portfolio.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;eager-to-learn&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/show-them-what-you-got-5-values-every-servicenow-developer-should-have/#eager-to-learn&quot; class=&quot;heading-anchor&quot;&gt;Eager to learn&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is something I think is hard to teach someone. &lt;a href=&quot;http://indeed.com&quot; rel=&quot;noopener&quot;&gt;indeed.com&lt;/a&gt; has a blog about the &lt;a href=&quot;https://www.indeed.com/career-advice/interviewing/willingness-to-learn&quot; rel=&quot;noopener&quot;&gt;willingness to learn&lt;/a&gt;. I’ll sum that up here.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Keeping your skills up to date, being a motivated and quick learner, and being a good long-term investment are all important qualities employers look for in employees, as they demonstrate dedication to staying on top of industry trends, show drive and determination to learn new job responsibilities, and make it easier for managers to promote them to higher positions.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;how-to-show-this&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/show-them-what-you-got-5-values-every-servicenow-developer-should-have/#how-to-show-this&quot; class=&quot;heading-anchor&quot;&gt;How to show this&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;I find that sharing what I’ve learned over time is the best way to share this.&lt;/li&gt;&lt;li&gt;Just say it and talk about the kinds learning you’ve done and &lt;strong&gt;how you’ve used it&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;great-communication&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/show-them-what-you-got-5-values-every-servicenow-developer-should-have/#great-communication&quot; class=&quot;heading-anchor&quot;&gt;Great Communication&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;When I started working on a helpdesk I was not good a communication. I ended up buying two books in 2011 to help me learn to be a better communicator. This was after I learned LOADS of things from my friend and boss Lynnisha.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Keep your emails to. the. point. Unnecessary words are just that, unnecessary.&lt;/li&gt;&lt;li&gt;Smiling believe it or not, makes a difference in how you communicate, so in the words of Buff, “Talk less, Smile more” is something I’ve really taken to heart.&lt;/li&gt;&lt;li&gt;A big part of communicating is listening. Being present and actively listening cannot be understated. There’s this great &lt;a href=&quot;https://www.ted.com/talks/celeste_headlee_10_ways_to_have_a_better_conversation#t-136370&quot; rel=&quot;noopener&quot;&gt;TED talk by Celeste Headlee&lt;/a&gt; on the topic.&lt;blockquote&gt;&lt;p&gt;There is no reason to learn how to show you’re paying attention if you are in fact paying attention.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;documentation&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/show-them-what-you-got-5-values-every-servicenow-developer-should-have/#documentation&quot; class=&quot;heading-anchor&quot;&gt;Documentation&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Documentation is amazing when it’s clear, but many folks don’t contribute to documentation or create their own but if you have you’re standing out from your peers! &lt;a href=&quot;https://youtu.be/wvUPn6c-Hj8&quot; rel=&quot;noopener&quot;&gt;Fedoruk has some opinions on this too&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;community&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/show-them-what-you-got-5-values-every-servicenow-developer-should-have/#community&quot; class=&quot;heading-anchor&quot;&gt;Community&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;There’s a strong community around ServiceNow, but I’d argue any software you work on should have a community of some sort. The more you’re involved in that community means the more you’ve invested in it. That’s telling. I’d be lying if I said it didn’t come up for me. Without the community there’s many people I wouldn’t be connected to. The thing is, you have to invest the time to make this happen.&lt;/p&gt;&lt;h2 id=&quot;portfolio&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/show-them-what-you-got-5-values-every-servicenow-developer-should-have/#portfolio&quot; class=&quot;heading-anchor&quot;&gt;Portfolio&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;If you have made anything that you can share that stuff is a fantastic prop to point to when speaking about how you’ve created a thing, or designed it or documented it. I have loads of examples of my own stuff but this week Christopher Carver shared this &lt;a href=&quot;https://github.com/ChristopherCarver/BreakGlass/blob/main/Break_Glass_Role_Management_Guide.md&quot; rel=&quot;noopener&quot;&gt;“BreakGlass” project he made&lt;/a&gt;. This project would be a fantastic item in anyone’s portfolio to show how they communicate via issues, and their documentation. Not to mention you’ll get a peek into how they made this by looking at the code.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Why does ServiceNow use Zoomin instead of Knowledge?</title>
      <link href="https://jace.pro/blog/why-does-servicenow-use-zoomin-instead-of-knowledge/" />
      <updated>2022-12-24T00:00:00Z</updated>
      <id>https://jace.pro/blog/why-does-servicenow-use-zoomin-instead-of-knowledge/</id>
      <content type="html">
				&lt;p&gt;Have you ever wondered why ServiceNow doesn’t use their Knowledge management for their docs? I mean you could argue they do, but we know those are only for folks with access to support.&lt;/p&gt;&lt;p&gt;Before the docs site and developer site became what it is today they used MediaWiki. (RIP Wiki).&lt;/p&gt;&lt;p&gt;Now they use &lt;a href=&quot;http://zoominsoftware.com/&quot; rel=&quot;noopener&quot;&gt;Zoomin&lt;/a&gt; for &lt;a href=&quot;http://docs.servicenow.com&quot; rel=&quot;noopener&quot;&gt;docs.servicenow.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I have often wondered why ServiceNow wants to know who you are when you’re looking at the docs. They can get traffic data with something like Google Analtyics.&lt;/p&gt;&lt;p&gt;I think this comes back to something ServiceNow is embracing more and more. Picking the right solution for the job. ServiceNow doesn’t have a great api and release management suite. At least not a public one. So they’ve used Zoomin.&lt;/p&gt;&lt;p&gt;As much as I’d like them to use a static site generator for this that’s not their perogitive.&lt;/p&gt;&lt;p&gt;I’ve &lt;a href=&quot;https://sn.jace.pro&quot; rel=&quot;noopener&quot;&gt;my own version&lt;/a&gt; as I’ve been bitten by their docs going down when I needed the most. Maybe we should collectively create one. I know there’s times I wish their docs had things they don’t. You can leave feedback (if the site is up).&lt;/p&gt;&lt;p&gt;The other thing I can’t stand about their implementation of Zoomin is they drop off the old versions of ServiceNow. So you can’t look back when something was introduced. I do have another &lt;a href=&quot;https://sndocs.jace.pro&quot; rel=&quot;noopener&quot;&gt;site I maintain with that data&lt;/a&gt; but I’m not consistent about it.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What is SUBQUERY and how does it give me superpowers in ServiceNow?</title>
      <link href="https://jace.pro/blog/what-is-subquery-and-how-does-it-give-me-superpowers-in-servicenow/" />
      <updated>2022-12-24T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-subquery-and-how-does-it-give-me-superpowers-in-servicenow/</id>
      <content type="html">
				&lt;h2 id=&quot;what-is-subquery&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-subquery-and-how-does-it-give-me-superpowers-in-servicenow/#what-is-subquery&quot; class=&quot;heading-anchor&quot;&gt;What is SUBQUERY&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;SUBQUERY is an undocumented close relative of RLQUERY - an encoded query keyword that lets one do joins in… encoded queries.&lt;/p&gt;&lt;p&gt;I’m sure you have read about RLQUERY in docs page Encoded query strings. RLQUERY is the related list conditions query to find records where it’s related records meet the given conditions. (I just posted about it).&lt;/p&gt;&lt;p&gt;An example of SUBQUERY can be found in Relationship Related Tasks of Interaction[interaction].&lt;/p&gt;&lt;p&gt;RLQUERY is powerful&lt;br&gt;I use reports UI just to access it in a gui&lt;br&gt;I feel like a demo is needed as … joins is something I just keep poking at until I get it working&lt;/p&gt;&lt;p&gt;A subquery is effectively a database join. I’ll update this later but I want to get this out there and Thank Pok for sharing this months ago.&lt;/p&gt;&lt;p&gt;All in all, the encoded query for a glide_list field pointing to sys_user would like like this:&lt;br&gt;&lt;code&gt;javascript: &#39;SUBQUERYsys_id,user,sys_user_grmember^groupIN&#39; + [array of group sys_ids] + &#39;^EQ^ENDSUBQUERY^active=true^EQ&#39;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;SUBQUERYsys_id,user,sys_user_grmember&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Means INNER JOIN sys_user_grmember M ON M.user = &amp;lt;sys_user&amp;gt;.sys_id&lt;/p&gt;&lt;p&gt;&lt;code&gt;groupIN&#39; + [array of group sys_ids] + &#39;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Means WHERE M.group IN (…)&lt;/p&gt;&lt;p&gt;&lt;code&gt;active=true&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Means &amp;lt;sys_user&amp;gt;.active = true&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Superpowers with Related Record Conditions</title>
      <link href="https://jace.pro/blog/superpowers-with-related-record-conditions/" />
      <updated>2022-12-24T00:00:00Z</updated>
      <id>https://jace.pro/blog/superpowers-with-related-record-conditions/</id>
      <content type="html">
				&lt;blockquote&gt;&lt;p&gt;Steve: Jace, I want an alert whenever we don’t get an message from this server every hour.&lt;br&gt;Jace: So you want me to watch for the lack of something, and if there’s nothing do the thing?&lt;br&gt;Steve: Yes.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Before Related Record Conditions on reports this was a really tough ask.&lt;br&gt;I remember asking coworkers to jump into a room so we could flesh this out. It wasn’t easy. There was 24 events this way. So we had 24 different scripted solutions watching for the lack of a check in.&lt;/p&gt;&lt;p&gt;In retrospect I wonder why I didn’t just have a scripted end point update the server or something. However that’s not why I’m writing this.&lt;/p&gt;&lt;p&gt;Did you know you can easily get a list of records where theres no related records. No? Neither did I.&lt;/p&gt;&lt;p&gt;Here’s a few great use cases for this.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Find me groups with no members (Can they be removed?)&lt;/li&gt;&lt;li&gt;Find me catalog items with no related requests (Is this item being used?)&lt;/li&gt;&lt;li&gt;Find me users with no related (If they are licensed can we remove them from those groups?)&lt;/li&gt;&lt;li&gt;Find me notifications, with no email logs (Is this notification being triggered?)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;To make report like this all you need to do is the following.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Built your filter on the list your curious about. (e.g. Users)&lt;/li&gt;&lt;li&gt;Right click on a column that has “Bar Chart”, press that.&lt;/li&gt;&lt;li&gt;In your filter, click “Related List Conditions”, and pick the related records you want to query. Say you want to find users where they are not a member of any group. (Or maybe users where they are a member of more then 3 groups)&lt;/li&gt;&lt;li&gt;Click the “Greater then or Equal to 1” to change the related list condition.&lt;/li&gt;&lt;li&gt;Pick the Related List Condition table. (sticking with group memberships, you’d pick Groups)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/tq7fI0wtvs-650.webp 650w, https://jace.pro/img/tq7fI0wtvs-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/tq7fI0wtvs-650.jpeg&quot; alt=&quot;Related list condition in ServiceNow&quot; width=&quot;960&quot; height=&quot;408&quot; srcset=&quot;https://jace.pro/img/tq7fI0wtvs-650.jpeg 650w, https://jace.pro/img/tq7fI0wtvs-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;One really cool thing about this is if you click on the report you can see how the related condition is built in the URL condition which means you can also use these in encoded queries. Maybe you want to notify folks when they have 5 or more incidents needing their attention.&lt;/p&gt;&lt;p&gt;Related Videos:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://youtu.be/gkzKzSXbwk0&quot; rel=&quot;noopener&quot;&gt;RFedoruk’s video&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=IVBmm5XAfHE&amp;amp;hd=1&quot; rel=&quot;noopener&quot;&gt;My rough video&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Understanding AI and ML: From ServiceNow to OpenAI</title>
      <link href="https://jace.pro/blog/understanding-ai-and-ml-from-servicenow-to-openai/" />
      <updated>2022-12-23T00:00:00Z</updated>
      <id>https://jace.pro/blog/understanding-ai-and-ml-from-servicenow-to-openai/</id>
      <content type="html">
				&lt;h2 id=&quot;introduction-to-ai/ml&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/understanding-ai-and-ml-from-servicenow-to-openai/#introduction-to-ai/ml&quot; class=&quot;heading-anchor&quot;&gt;Introduction to AI/ML&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow’s Artificial Intelligence (aka Predictive Intelligence) is complex and . and difficult to set up, and other people weren’t impressed with it.&lt;/p&gt;&lt;p&gt;I have this worm in my ear and I need to get it somewhere.&lt;/p&gt;&lt;p&gt;Embrace it or be left behind.&lt;/p&gt;&lt;p&gt;We fear what we don’t understand, I hope my journey will help add some understanding. If it does, please let me know where you can find me.&lt;/p&gt;&lt;p&gt;In 2016 I read about Predictive Intelligence in ServiceNow. This wa my first real look at anything like this. I remember thinking this Artificial Intelligence (AI) or Machine Learning (ML) stuff looked awesome. It sounded very complicated and difficult to set up. Back then, you needed around 10,000 incidents to train it to assign tickets to the right group. That seemed painful. To keep it up to date, you had to re-train the cortex. I tell you this to emphasize that I walked away; it was too much.&lt;/p&gt;&lt;p&gt;A while later MoveWorks demo’d their chatbot solution to me. It was also great. You’d message it something and it would ask you simple questions to either answer your question or submit a catalog request for you. I remember how it knows what catalog item or article to surface. They mentioned they train the bot based on the customers instance and weight the items. I didn’t understand. I never got to use their product but I didn’t understand they were using AI.&lt;/p&gt;&lt;h2 id=&quot;understanding-ai/ml&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/understanding-ai-and-ml-from-servicenow-to-openai/#understanding-ai/ml&quot; class=&quot;heading-anchor&quot;&gt;Understanding AI/ML&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I saw a &lt;a href=&quot;https://youtu.be/GVsUOuSjvcg?t=217&quot; rel=&quot;noopener&quot;&gt;video&lt;/a&gt; by Veratisum on March 4th, 2022 about analog computers and it made sense. He showed how in the 60s they were assigning weights to 20x20 pixel images of dogs to have the Perceptron identify if an image was a dog or not.&lt;/p&gt;&lt;p&gt;It took a while but this video is what made it click for me. I understood the concept. Assign weight things and ask questions so the AI could respond. This had been in my head for months. Then I came across Stable Diffusion and decided to try it out on November 6th. It amazed me, making images of everything. I was paying attention to &lt;a href=&quot;http://swyx.io&quot; rel=&quot;noopener&quot;&gt;swyx.io&lt;/a&gt; and he had a timeline of how &lt;a href=&quot;https://lspace.swyx.io/p/open-source-ai&quot; rel=&quot;noopener&quot;&gt;Open Source is eating AI&lt;/a&gt;. To put this into perspective, Stable Diffusion became a thing on September 7th. I looked into Text to Text AI generation, but all I found was Kobold AI which I set up, but it was beyond me. Everything else was too computationally expensive.&lt;/p&gt;&lt;p&gt;Then ChatGPT came out. I was like many, impressed. I wanted to understand more and get Text to Text AI stuff running locally to try things. I hadn’t read into OpenAI but I did later that day. One way I learn best is to try to make something. So I did that. I made a little button in ServiceNow to generate code for me. It was neat but I didn’t think it would be useful to many. So I took inspiration from SN Utils’ extension and started working on an extension. This was December 1st.&lt;/p&gt;&lt;h2 id=&quot;developing-an-scribemonster&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/understanding-ai-and-ml-from-servicenow-to-openai/#developing-an-scribemonster&quot; class=&quot;heading-anchor&quot;&gt;Developing an Scribe.Monster&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I released my extension four days after making my OpenAI account. My first commit to &lt;a href=&quot;https://scribe.monster&quot; rel=&quot;noopener&quot;&gt;https://scribe.monster&lt;/a&gt; was on December 5th.&lt;/p&gt;&lt;p&gt;Since then, I’ve been consuming so much AI educational content.&lt;/p&gt;&lt;p&gt;Fine-tuning, Prompt engineering, one-shot, few-shot, and no-shot prompts. It’s been a ride if you’ve been following along you likely have seen how the extension has changed.&lt;/p&gt;&lt;p&gt;I don’t know where this will take me, but AI that was inaccessible before is now accessible everywhere. People are using it in crazy novel ways; some of them are dangerous while others are profound. At the end of the day it is a tool, a very complicated autocomplete.&lt;/p&gt;&lt;p&gt;I’d like to think this anti AI and pro AI stuff is like calculators. Back in the day, calculators weren’t allowed for math work, &lt;a href=&quot;https://www.quora.com/When-did-calculators-become-commonplace-in-high-school-classrooms&quot; rel=&quot;noopener&quot;&gt;but then they were&lt;/a&gt;, and things changed. People who grew up memorizing how to do math &lt;a href=&quot;https://youtu.be/GYnRCb3ppAg?t=109&quot; rel=&quot;noopener&quot;&gt;can still do it amazingly&lt;/a&gt;, but those with calculators now needed one to do math as fast. Like calculators, AI will be a tool, except AI isn’t something one can do in their head. You can create a prompt and it will give you an answer, for better or worse.&lt;/p&gt;&lt;h2 id=&quot;the-genie-is-out-and-i-dont-see-it-being-put-back&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/understanding-ai-and-ml-from-servicenow-to-openai/#the-genie-is-out-and-i-dont-see-it-being-put-back&quot; class=&quot;heading-anchor&quot;&gt;The genie is out, and I don’t see it being put back&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Here we are, at the end of this post. I hope it has helped you understand how I came to understand this stuff. For those who think AI is a fad and will go away, I disagree. I’m not in that group. It will stick around. &lt;a href=&quot;https://www.linkedin.com/posts/rfedoruk_chatgpt-out-for-days-and-has-more-popular-activity-7007550799002173440-dkEL?utm_source=share&amp;amp;utm_medium=member_desktop&quot; rel=&quot;noopener&quot;&gt;Robert Fedoruk posted this on Linkedin&lt;/a&gt;;&lt;/p&gt;&lt;p&gt;“ChatGPT is out for days and has more popular appeal and use cases than BLOCKCHAIN. Edit: Full disclosure, just a good natured ribbing to my blockchain friends. I know there’s some important stuff being worked on. Just showcasing how fast simple use cases scale.”&lt;/p&gt;&lt;p&gt;That may have been posted in jest, but he’s not wrong. Look at the applications folks are coming out with.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://Canva.com&quot; rel=&quot;noopener&quot;&gt;Canva.com&lt;/a&gt; will create content, and create you an image&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://Notion.so&quot; rel=&quot;noopener&quot;&gt;Notion.so&lt;/a&gt; will create content for you&lt;/li&gt;&lt;li&gt;Jasper will help you create content and identify AI-generated content&lt;/li&gt;&lt;li&gt;CopyAI will do copywriting.&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Call User via Teams</title>
      <link href="https://jace.pro/blog/call-user-via-teams/" />
      <updated>2022-11-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/call-user-via-teams/</id>
      <content type="html">
				&lt;p&gt;Ajay Chavan wrote up a post about Adding&lt;br&gt;a Teams link to the user form and I thought&lt;br&gt;it was great. So I’m sharing it here with&lt;br&gt;my spin on it… Here’s &lt;a href=&quot;https://www.servicenow.com/community/it-service-management-articles/service-now-microsoft-teams-integration/ta-p/2301655&quot; rel=&quot;noopener&quot;&gt;his post about it though&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;ui16/next-experience&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/call-user-via-teams/#ui16/next-experience&quot; class=&quot;heading-anchor&quot;&gt;UI16/Next Experience&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Download a teams icon, I got mine &lt;a href=&quot;https://statics.teams.cdn.live.net/hashed/favicon/prod/favicon-32x32-4102f07.png&quot; rel=&quot;noopener&quot;&gt;here&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Upload the image to System UI &amp;gt; Images with a name of “teams.png”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Create a UI Macro called &lt;code&gt;incident_caller_teams_button&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jelly:core&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;glide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;evaluate&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jvar_guid&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;gs.generateGUID(this);&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;set&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jvar_n&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;show_incidents_${jvar_guid}:${ref}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ref-button btn btn-default btn-ref&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;${jvar_n}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;onclick&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value javascript language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;invokeChat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;${ref}&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;teams.png&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;30&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Popup Teams&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;${gs.getMessage(&#39;Click to open Teams chat&#39;)}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;invokeChat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;reference&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tableAndField &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; reference&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tableAndField&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; field &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tableAndField&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; userSysId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; email&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sysUser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sysUser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userSysId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    email &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sysUser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;email&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; teamsLink &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://teams.microsoft.com/l/chat/0/0?users=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; email&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; w &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getTopWindow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;teamsLink&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;3&quot;&gt;&lt;li&gt;&lt;p&gt;From the list view of the macro set the Media Type[&lt;code&gt;media_type&lt;/code&gt;] to &lt;code&gt;doctype&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Update the Caller ID’s attributes to include the macros name as a ref_contribution like so;&lt;code&gt;ref_contributions=user_show_incidents;incident_caller_teams_button&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Upload an attachment called teams.png with the teams logo.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Why would you ever extend the syslog table?</title>
      <link href="https://jace.pro/blog/why-would-you-ever-extend-the-syslog-table/" />
      <updated>2022-11-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/why-would-you-ever-extend-the-syslog-table/</id>
      <content type="html">
				&lt;p&gt;Table Guide: &lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/legal/custom-table-guide.pdf&quot; rel=&quot;noopener&quot;&gt;https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/legal/custom-table-guide.pdf&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Past Post on the Table guide: ?&lt;/p&gt;&lt;p&gt;Post on extending syslog: &lt;a href=&quot;https://www.servicenow.com/community/developer-forum/anyone-with-experience-extending-the-quot-syslog-quot-table/m-p/1969471&quot; rel=&quot;noopener&quot;&gt;https://www.servicenow.com/community/developer-forum/anyone-with-experience-extending-the-quot-syslog-quot-table/m-p/1969471&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Support KB item on the syslog table: &lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0721331&quot; rel=&quot;noopener&quot;&gt;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0721331&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Support KB item on logging in scoped apps and their destinations (but not to extended tables): &lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0714743&quot; rel=&quot;noopener&quot;&gt;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0714743&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Maik’s Log Utility: &lt;a href=&quot;https://www.servicenow.com/community/developer-articles/just-another-log-helper/ta-p/2315453&quot; rel=&quot;noopener&quot;&gt;https://www.servicenow.com/community/developer-articles/just-another-log-helper/ta-p/2315453&lt;/a&gt;&lt;/p&gt;&lt;p&gt;John Anderson’s decade old post on Custom Logging: &lt;a href=&quot;http://www.john-james-andersen.com/blog/service-now/custom-logging-with-servicenow.html&quot; rel=&quot;noopener&quot;&gt;http://www.john-james-andersen.com/blog/service-now/custom-logging-with-servicenow.html&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Side hustles and interesting things folks in the ServiceNow space do</title>
      <link href="https://jace.pro/blog/side-hustles-and-interesting-things-folks-in-the-servicenow-space-do/" />
      <updated>2022-11-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/side-hustles-and-interesting-things-folks-in-the-servicenow-space-do/</id>
      <content type="html">
				&lt;p&gt;I wanted to make a list of things folks in this space make outside of ServiceNow.&lt;/p&gt;&lt;h2 id=&quot;music&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/side-hustles-and-interesting-things-folks-in-the-servicenow-space-do/#music&quot; class=&quot;heading-anchor&quot;&gt;Music&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Jeff Pierce is a musician, checkout his album &lt;a href=&quot;https://songwhip.com/thenothingleft/everything-right&quot; rel=&quot;noopener&quot;&gt;The Nothing Left&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Thomas Burnell is putting out the beats &lt;a href=&quot;https://songwhip.com/arden2&quot; rel=&quot;noopener&quot;&gt;all over&lt;/a&gt; and has a &lt;a href=&quot;https://www.youtube.com/watch?v=RUzoI1_Vg4E&quot; rel=&quot;noopener&quot;&gt;Youtube&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;textile&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/side-hustles-and-interesting-things-folks-in-the-servicenow-space-do/#textile&quot; class=&quot;heading-anchor&quot;&gt;Textile&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Tim Woodruff has an amazing Don’t Panic cloth’s that is described as “Grippy Textured Non-Slip Microfiber Cleaning Cloth Wipes”. Here’s a &lt;a href=&quot;https://www.linkedin.com/posts/sn-timw_grippy-textured-non-slip-microfiber-cleaning-activity-6970788918757654528-zF0h?utm_source=share&amp;amp;utm_medium=member_desktop&quot; rel=&quot;noopener&quot;&gt;LinkedIn post about them&lt;/a&gt;. Here’s the &lt;a href=&quot;https://www.amazon.com/dp/B09SH3PJNV?&amp;amp;linkCode=ll1&amp;amp;tag=snprotips-20&amp;amp;linkId=5db868602eb19f0733d5ac70f71cf965&amp;amp;language=en_US&amp;amp;ref_=as_li_ss_tl/&quot; rel=&quot;noopener&quot;&gt;Amazon link to buy &#39;em.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Thomas Burnell also is the guy behind &lt;a href=&quot;https://mod570.com/pages/our-story&quot; rel=&quot;noopener&quot;&gt;mod570&lt;/a&gt; an activewear/comfort-wear clothing brand representing you, the modern day creator.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;craft&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/side-hustles-and-interesting-things-folks-in-the-servicenow-space-do/#craft&quot; class=&quot;heading-anchor&quot;&gt;Craft&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Robert Fedoruk is a man of many talents, I don’t see a shop but he creates and sells soaps and leather goods. Get in touch on LinkedIn. Here’s a link to &lt;a href=&quot;https://www.linkedin.com/posts/rfedoruk_tired-of-boring-swag-that-ends-up-in-landfills-activity-6914582136645713920-rPAD?utm_source=share&amp;amp;utm_medium=member_desktop&quot; rel=&quot;noopener&quot;&gt;his post from earlier this year&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;(I forgot your name!!!), but this gal I worked with in the past is making very craft tumblers. Here’s her &lt;a href=&quot;https://www.etsy.com/shop/FancyCupCreations&quot; rel=&quot;noopener&quot;&gt;Etsy store FancyCupCreations&lt;/a&gt;. Also if you want to hear her day-to-day on this she has a &lt;a href=&quot;https://www.tiktok.com/@fancycupcreations&quot; rel=&quot;noopener&quot;&gt;TikTok&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Phylicia Rashad from the MTBF cohorts has a &lt;a href=&quot;https://mytribe-essentials.com/&quot; rel=&quot;noopener&quot;&gt;candle shop&lt;/a&gt; found on &lt;a href=&quot;https://twitter.com/LittleMs_MAC/status/1590344500635131906?s=20&amp;amp;t=WyDfMpydLUREg6LR1ZNtdQ&quot; rel=&quot;noopener&quot;&gt;Twitter&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Martin Ivanov was telling me about his woodworking and he has this &lt;a href=&quot;https://www.linkedin.com/posts/martin-ivanov-01_servicenow-handmande-project-activity-6933724815069478912-RCp9?utm_source=share&amp;amp;utm_medium=member_desktop&quot; rel=&quot;noopener&quot;&gt;fierce looking lighting fixture&lt;/a&gt;. He’s working on a catalog of items but until then DM him if you have a custom request.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;art&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/side-hustles-and-interesting-things-folks-in-the-servicenow-space-do/#art&quot; class=&quot;heading-anchor&quot;&gt;Art&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Ryan C Gillespie’s wife has opened a original hand painted watercolor paintings Etsy shop &lt;a href=&quot;https://www.etsy.com/shop/GigiGilleArt&quot; rel=&quot;noopener&quot;&gt;GigiGilleArt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Andrew Albury-Dor has a sticker shop that’s had some… interesting items on but have since been removed. It’s still up and if you’re a fan of Bluey and other fun things you might find something you love. Here’s the link to his &lt;a href=&quot;https://www.redbubble.com/people/dorsy99/shop&quot; rel=&quot;noopener&quot;&gt;Redbubble shop&lt;/a&gt;. Here’s a secret item here for those &lt;a href=&quot;https://www.redbubble.com/i/pin/Fladvocate-Flag-by-dorsy99/106895069.NP9QY&quot; rel=&quot;noopener&quot;&gt;#fladvocates&lt;/a&gt; you know.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;books&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/side-hustles-and-interesting-things-folks-in-the-servicenow-space-do/#books&quot; class=&quot;heading-anchor&quot;&gt;Books&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Stephanie Morillo has two books she sells about creating content and book publishing. Here’s a &lt;a href=&quot;https://www.stephaniemorillo.co/about&quot; rel=&quot;noopener&quot;&gt;link to her about me page with more details&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Chuck Tomasi wrote the book on podcasting! &lt;a href=&quot;https://www.amazon.com/Podcasting-Dummies-Tee-Morris/dp/1119711819&quot; rel=&quot;noopener&quot;&gt;Amazon&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Tim Woodruff has a few books on the topic of &lt;a href=&quot;https://books.snc.guru/&quot; rel=&quot;noopener&quot;&gt;ServiceNow&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Anders has a book on ServiceNow - &lt;a href=&quot;https://www.amazon.com/Master-ServiceNow-10-000-Painful-Steps/dp/8269300713&quot; rel=&quot;noopener&quot;&gt;How to Master ServiceNow in 10.000 Hard and Painful Steps&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Goran has a book on ServiceNow - &lt;a href=&quot;https://www.amazon.com/Witch-Doctors-Guide-ServiceNow-Knowledge/dp/179462631X&quot; rel=&quot;noopener&quot;&gt;The Witch Doctor’s Guide To ServiceNow&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;courses&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/side-hustles-and-interesting-things-folks-in-the-servicenow-space-do/#courses&quot; class=&quot;heading-anchor&quot;&gt;Courses&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Toulson’s &lt;a href=&quot;https://codecreative.thinkific.com/courses/service-portal-crash-course&quot; rel=&quot;noopener&quot;&gt;Service Portal Crash Course&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Laurence Tindell has two course, &lt;a href=&quot;https://www.udemy.com/course/hardware-asset-management-in-servicenow/&quot; rel=&quot;noopener&quot;&gt;Hardware Asset Management in ServiceNow&lt;/a&gt; and another for &lt;a href=&quot;https://www.udemy.com/course/it-asset-management/&quot; rel=&quot;noopener&quot;&gt;IT Asset Management&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;#﻿# E-commerce&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Juan Villalta messaged me about his &lt;a href=&quot;https://www.pricinglabels.ca/cjbase/&quot; rel=&quot;noopener&quot;&gt;pricing label’s site&lt;/a&gt; he runs with a friend.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;tell-me-about-yours&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/side-hustles-and-interesting-things-folks-in-the-servicenow-space-do/#tell-me-about-yours&quot; class=&quot;heading-anchor&quot;&gt;Tell me about yours&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;If you have a side hustle or something you pitch I’d love to include it so shoot me a message wherever you can find me!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Form annotations let you add html to workspaces and other UIs</title>
      <link href="https://jace.pro/blog/form-annotations-let-you-add-html-to-workspaces-and-other-uis/" />
      <updated>2022-11-12T00:00:00Z</updated>
      <id>https://jace.pro/blog/form-annotations-let-you-add-html-to-workspaces-and-other-uis/</id>
      <content type="html">
				&lt;p&gt;A﻿ long time ago Casey on Slack said you can make custom annotations. I was looking at them and wonder WHY would I ever use them. I know now when and why I might use this.&lt;/p&gt;&lt;p&gt;Have you ever been asked to add a link on a form to some other site or maybe some helpful text for a field but you needed better control. This lets you take control of the page without UI Macros and Formatters!&lt;/p&gt;&lt;p&gt;This works on UI16/Next Experiences&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/K1t0zkT4vQ-650.webp 650w, https://jace.pro/img/K1t0zkT4vQ-829.webp 829w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/K1t0zkT4vQ-650.jpeg&quot; alt width=&quot;829&quot; height=&quot;282&quot; srcset=&quot;https://jace.pro/img/K1t0zkT4vQ-650.jpeg 650w, https://jace.pro/img/K1t0zkT4vQ-829.jpeg 829w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;This works on workspaces&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/ZPYhFahNHZ-650.webp 650w, https://jace.pro/img/ZPYhFahNHZ-851.webp 851w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/ZPYhFahNHZ-650.jpeg&quot; alt width=&quot;851&quot; height=&quot;595&quot; srcset=&quot;https://jace.pro/img/ZPYhFahNHZ-650.jpeg 650w, https://jace.pro/img/ZPYhFahNHZ-851.jpeg 851w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;I﻿ wanted my annotation to look nice so I figured out how to make this look nice. So Here’s my steps.&lt;/p&gt;&lt;p&gt;F﻿irst you need to create a custom annotation to let you’re annotations look good. Otherwise they get styled in a wide way that just looks bad to me.&lt;/p&gt;&lt;p&gt;I﻿ tried to set the style to simplify the HTML but nothing seemed to work and I left that empty.&lt;/p&gt;&lt;p&gt;N﻿ext you just add the annotation to your form. You need to use Form Layout, not Form Design and this is because you cannot access the HTML value for the annotation from Form Design.&lt;/p&gt;&lt;p&gt;T﻿hen just paste this in your html and put your code starting at the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tag below.&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&amp;lt;label dir=&quot;ltr&quot;
  class=&quot; col-xs-12 col-md-3 col-lg-4 control-label&quot;&amp;gt;
&amp;lt;/label&amp;gt;
&amp;lt;div class=&quot;col-xs-10 col-sm-9 col-md-6 col-lg-5 form-field input_controls&quot;&amp;gt;
  &amp;lt;div class=&quot;fieldmsg-container&quot; aria-live=&quot;polite&quot;&amp;gt;
    &amp;lt;div class=&quot;fieldmsg notification notification-info&quot;&amp;gt;
      &amp;lt;a href=&quot;https://jace.pro&quot;&amp;gt;Jace&#39;s link&amp;lt;/a&amp;gt;
      🙌
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;P﻿S. You can add onclick attributes and access g_form directly. So you could do some targeted setting of fields or special buttons for consistency without taking the space of UI Actions.&lt;/p&gt;&lt;p&gt;P﻿PS. You can also wrap your put ${current.getValue(‘caller_id’)} as well and that works on UI16/Next See Chuck Tomasi talks about it on &lt;a href=&quot;https://youtu.be/Jzpv9IdI8aY?t=2784&quot; rel=&quot;noopener&quot;&gt;Youtube&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Converting dates and times to readable fuzzy versions</title>
      <link href="https://jace.pro/blog/converting-dates-and-times-to-readable-fuzzy-versions/" />
      <updated>2022-11-12T00:00:00Z</updated>
      <id>https://jace.pro/blog/converting-dates-and-times-to-readable-fuzzy-versions/</id>
      <content type="html">
				&lt;p&gt;I﻿ am not sure where I got this but I thought it could be useful. You know how some sites show “3d ago” instead of the YYYY-MM-DD hh:mm:ss version. Here’s a small function that does that for you.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//debug lines&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; yourUpdated &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;2021-08-13T16:54:00Z&#39;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getFuzzyDate&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;dateTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; past &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dateTime&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//ms since epoch&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; now &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//now&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; differenceInSeconds &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;now &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; past&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//get seconds&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; thresholds &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;threshold&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;                       &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;divideBy&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;                 &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;fuzzyUnit&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;s&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;threshold&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;                  &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;divideBy&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;                 &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;fuzzyUnit&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;m&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;threshold&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;             &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;divideBy&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;            &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;fuzzyUnit&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;h&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;threshold&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;        &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;divideBy&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;       &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;fuzzyUnit&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;d&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;threshold&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;       &lt;span class=&quot;token number&quot;&gt;365&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;divideBy&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;fuzzyUnit&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;mo&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;threshold&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;365&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;divideBy&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;365&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;fuzzyUnit&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;y&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; filtered &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; thresholds&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;grouping&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; differenceInSeconds &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; grouping&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;threshold
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;differenceInSeconds &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; filtered&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;divideBy&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; filtered&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fuzzyUnit &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; ago&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFuzzyDate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;yourUpdated&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Simple automation that your users can do!</title>
      <link href="https://jace.pro/blog/simple-automation-that-your-users-can-do/" />
      <updated>2022-11-10T00:00:00Z</updated>
      <id>https://jace.pro/blog/simple-automation-that-your-users-can-do/</id>
      <content type="html">
				&lt;p&gt;Account Locked out. That was the error message I got. So working backwards I was troubleshooting this production issue. A service account I used to create a Certificate was failing because it’s account was locked out. The only folks with access was me and my team. I’ve never met anyone who enjoys working with them and generally I took the lead. So I tried authenticating on the web to the Certificate Authorities website. Sure enough it asked me to change my password. At this point I knew one of two things needed happen.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Automate the password change&lt;/li&gt;&lt;li&gt;Automate a reminder to change the password&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I looked and looked at the APIs available to the service account but there was none to change the password. I asked the administrator if there was a way to exclude an account or some other automatic way to change the password and they shrugged and said no.&lt;/p&gt;&lt;p&gt;Defeated I knew I at least had a great tool to remind myself and team to change the password frequently enough to avoid this again.&lt;/p&gt;&lt;h1 id=&quot;scheduled-templates&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/simple-automation-that-your-users-can-do/#scheduled-templates&quot; class=&quot;heading-anchor&quot;&gt;Scheduled Templates&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Haven’t heard of them? They are OLD. Like pre-legacy workflow old.&lt;/p&gt;&lt;h2 id=&quot;what-youll-need&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/simple-automation-that-your-users-can-do/#what-youll-need&quot; class=&quot;heading-anchor&quot;&gt;What you’ll need&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;To use them you need three things.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;A template&lt;/li&gt;&lt;li&gt;A user with rights (role: &lt;code&gt;template_scheduler&lt;/code&gt;) to make a scheduled template&lt;/li&gt;&lt;li&gt;A schedule template&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;how-to-make-one&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/simple-automation-that-your-users-can-do/#how-to-make-one&quot; class=&quot;heading-anchor&quot;&gt;How to make one&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;When I do this I go and manually enter the data I want in the template on the record type I need.&lt;/li&gt;&lt;li&gt;Turn on the template bar, create a new template.&lt;/li&gt;&lt;li&gt;Now once you create the template you have to go to the template record (unfortunate, but out of box they hide the ui action from the form.) For now, we’ll manually just go to the right place. In the filter of your navigation type &lt;strong&gt;sys_template.list&lt;/strong&gt;. Open your template and you will see a schedule button, if you don’t verify you have that &lt;code&gt;template_scheduler&lt;/code&gt; role.&lt;/li&gt;&lt;li&gt;Assuming you are on the schedule entity generation record, fill out the frequency you want this created.&lt;/li&gt;&lt;li&gt;That’s it.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;making-it-available-to-more-users&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/simple-automation-that-your-users-can-do/#making-it-available-to-more-users&quot; class=&quot;heading-anchor&quot;&gt;Making it available to more users&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A few weeks after I did this I was asked by someone at security how can they create a repeating task. So I gave &#39;em access to the scheduled template, made links to templates (&lt;code&gt;sys_template&lt;/code&gt;) and scheduled templates (&lt;code&gt;sysauto_template&lt;/code&gt;) if they have the &lt;code&gt;template_scheduler&lt;/code&gt; role. Now anyone can solve this problem with a little help from our team.&lt;/p&gt;&lt;h2 id=&quot;how-do-they-work&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/simple-automation-that-your-users-can-do/#how-do-they-work&quot; class=&quot;heading-anchor&quot;&gt;How do they work?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;When you create a Scheduled Template, Servicenow creates a “Schedule” (sys_trigger) which is the same thing used for scheduled jobs, async business rules, inactivity monitors, sla calculations, metric events, upgrades and much more. It’s not clear **how** it works under the hood but &lt;a href=&quot;https://docs.servicenow.com/csh?version=latest&amp;amp;topicname=c_ScheduledJobs&quot; rel=&quot;noopener&quot;&gt;ServiceNow’s doc’s don’t say much more&lt;/a&gt;. &lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=c60153e9dbdcdbc01dcaf3231f9619b0&quot; rel=&quot;noopener&quot;&gt;Dirk wrote about some of this&lt;/a&gt; but it’s not well documented to I’d just be guessing.&lt;/p&gt;&lt;h2 id=&quot;what-about-checklist-templates&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/simple-automation-that-your-users-can-do/#what-about-checklist-templates&quot; class=&quot;heading-anchor&quot;&gt;What about checklist templates?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I had a note to talk about using checklists too but that’s a bit much here. If you’re curious about that follow &lt;a href=&quot;https://bibingokuldas.wordpress.com/2020/12/17/now-platform-templates-n-checklists/&quot; rel=&quot;noopener&quot;&gt;Bibin Gokuldas’s blog about it&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Setting up a custom theme cliff notes by Ty</title>
      <link href="https://jace.pro/blog/setting-up-a-custom-theme-cliff-notes-by-ty/" />
      <updated>2022-10-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/setting-up-a-custom-theme-cliff-notes-by-ty/</id>
      <content type="html">
				&lt;p&gt;ty.roach&lt;br&gt;1 day ago&lt;br&gt;@ashley&lt;br&gt;&#39;s link has it all and the video I posted has it too (so does the one that&lt;br&gt;@eric&lt;br&gt;posted) but here’s my cliff notes for anyone interested&lt;br&gt;Step 1. Create a style.&lt;br&gt;Open a tab in your browser to bring up ServiceNow’s Theme Generator: &lt;a href=&quot;https://theme.deoprototypes.com/color-generator-p/&quot; rel=&quot;noopener&quot;&gt;https://theme.deoprototypes.com/color-generator-p/&lt;/a&gt;&lt;br&gt;Click the Auto Generate button at the top&lt;br&gt;Select values for the Brand Neutral, Brand Primary and Brand Secondary then click the Generate button&lt;br&gt;Click the “Copy Jason” button at the top (to copy the style to the clipboard)&lt;br&gt;Step 2. Associate your style with a theme.&lt;br&gt;Open your ServiceNow instance and navigate to Now Experience Framework &amp;gt; Theme Management &amp;gt; Themes&lt;br&gt;Create a new theme (give it a unique name)&lt;br&gt;Create a new “Style” entry in the Compositional: App Theme section (UX Theme Styles embedded list) by clicking “Insert a new row…” then tabbing over to the Style and click “New”&lt;br&gt;In the “Style” field type: { “properties”:&lt;insert-copied-clipboard-here&gt;} then paste your copied style from step 1 into here.&lt;br&gt;Step 3. Activate your custom theme&lt;br&gt;Create a new system property (or update the existing one if it already exists): glide.ui.polaris.theme.custom&lt;br&gt;Paste that theme’s sys_id in the value (maybe put the Theme Name in the property description…my two cents)&lt;br&gt;Refresh your browser to see the new custom theme&lt;/insert-copied-clipboard-here&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zuITYAOBlUU&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=zuITYAOBlUU&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0XKjy2GaOHE&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=0XKjy2GaOHE&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>ServiceNow database Views weird and expose details unless your careful</title>
      <link href="https://jace.pro/blog/servicenow-database-views-weird-and-expose-details-unless-your-careful/" />
      <updated>2022-10-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenow-database-views-weird-and-expose-details-unless-your-careful/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://sndevs.slack.com/archives/C0E2G2681/p1666907158792759&quot; rel=&quot;noopener&quot;&gt;20h&lt;/a&gt;&lt;/p&gt;&lt;p&gt;joeyday&lt;/p&gt;&lt;p&gt;Can anybody help me fully grok how ACLs work on Database Views? I’ve created a View that mashes up three tables. A user I’m impersonating should have access to all three tables, but she can only see some fields on the Database View. If I define new ACLs at the level of the Database View, then she can suddenly view the fields she couldn’t view before, but now she can no longer view the fields she could see before. Madness.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sndevs.slack.com/archives/C0E2G2681/p1666909250103549?thread_ts=1666907158.792759&amp;amp;cid=C0E2G2681&quot; rel=&quot;noopener&quot;&gt;20h&lt;/a&gt;&lt;/p&gt;&lt;p&gt;jace&lt;/p&gt;&lt;p&gt;I was looking into this.&amp;nbsp;It’s&amp;nbsp;a nightmare&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sndevs.slack.com/archives/C0E2G2681/p1666909309149539?thread_ts=1666907158.792759&amp;amp;cid=C0E2G2681&quot; rel=&quot;noopener&quot;&gt;20h&lt;/a&gt;&lt;/p&gt;&lt;p&gt;jace&lt;/p&gt;&lt;p&gt;If you restrict access to the base tables those restrictions&amp;nbsp;didn’t&amp;nbsp;in my testing seem to hold against the view using them.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sndevs.slack.com/archives/C0E2G2681/p1666909926684049?thread_ts=1666907158.792759&amp;amp;cid=C0E2G2681&quot; rel=&quot;noopener&quot;&gt;19h&lt;/a&gt;&lt;/p&gt;&lt;p&gt;joeyday&lt;/p&gt;&lt;p&gt;Yeah, it’s wild.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sndevs.slack.com/archives/C0E2G2681/p1666977477125749?thread_ts=1666907158.792759&amp;amp;cid=C0E2G2681&quot; rel=&quot;noopener&quot;&gt;36m&lt;/a&gt;&lt;/p&gt;&lt;p&gt;joeyday&lt;/p&gt;&lt;p&gt;Okay I solved this, but it was&amp;nbsp;&lt;em&gt;weird&lt;/em&gt;. The problem is I have a script in one of the ACLs that uses the&amp;nbsp;&lt;code&gt;current&lt;/code&gt;&amp;nbsp;object. That’s fine and evaluates properly when I’m just looking at records in that table, but when I look at a database view that mashes that table up with other tables,&amp;nbsp;&lt;code&gt;current&lt;/code&gt;&amp;nbsp;turns out to be a completely different record, and that’s why this was breaking. The&amp;nbsp;&lt;code&gt;current&lt;/code&gt;&amp;nbsp;object turns out to be one of the&amp;nbsp;&lt;em&gt;other&lt;/em&gt;&amp;nbsp;records in the mashup (wild!). So I just added a conditional in the ACL script that checks&amp;nbsp;&lt;code&gt;current.tableName()&lt;/code&gt;&amp;nbsp;and does the right evaluation depending on whether I’m in the context of the table itself or the database view.&amp;nbsp;(edited)&lt;/p&gt;&lt;hr&gt;&lt;p&gt;New&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sndevs.slack.com/archives/C0E2G2681/p1666979473215389?thread_ts=1666907158.792759&amp;amp;cid=C0E2G2681&quot; rel=&quot;noopener&quot;&gt;2m&lt;/a&gt;&lt;/p&gt;&lt;p&gt;joeyday&lt;/p&gt;&lt;p&gt;Here’s my script, which of course is just an example. I almost never recommend copying something like this directly into your instance, but it gives you an idea the hoops I had to jump through.&lt;/p&gt;&lt;p&gt;answer = (function () {&lt;br&gt;var currentTable = current.getTableName();&lt;br&gt;var isMetricTable = (currentTable === ‘metric_instance’);&lt;/p&gt;&lt;p&gt;if (!isMetricTable &amp;amp;&amp;amp; currentTable === ‘vtb_lane’) {&lt;br&gt;// This is wild, but if &lt;code&gt;current&lt;/code&gt; is a vtb_lane record that&lt;br&gt;// means we’re evaluating in the context of the u_vtb_card_metric&lt;br&gt;// database view, not the metric_instance table. In this case,&lt;br&gt;// we’re safe to assume this is a vtb_card metric and check&lt;br&gt;// if the user has access to the board related to the lane.&lt;br&gt;var lane_board = current.board.getRefRecord();&lt;br&gt;return new VTBBoardSecurity().canAccess(lane_board);&lt;br&gt;} else if (isMetricTable &amp;amp;&amp;amp; current.getValue(‘table’) === ‘vtb_card’) {&lt;br&gt;// This means we’re definitely evaluating in the normal context&lt;br&gt;// of a metric_instance record and it’s a vtb_card metric, so we&lt;br&gt;// should check if the user has access to the board related&lt;br&gt;// to the card.&lt;br&gt;var card = new GlideRecord(‘vtb_card’);&lt;br&gt;card.get(&lt;a href=&quot;http://current.id&quot; rel=&quot;noopener&quot;&gt;current.id&lt;/a&gt;);&lt;br&gt;var card_board = card.board.getRefRecord();&lt;br&gt;return new VTBBoardSecurity().canAccess(card_board);&lt;br&gt;}&lt;/p&gt;&lt;p&gt;// If we made it here it’s not related to a vtb_card.&lt;br&gt;return false;&lt;br&gt;})();&lt;br&gt;joeyday&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Integrate Gsuite and ServiceNow  Using a Google Service Account and JWT</title>
      <link href="https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/" />
      <updated>2022-10-12T00:00:00Z</updated>
      <id>https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/</id>
      <content type="html">
				&lt;p&gt;Today on Slack, mdev asked about a post that seems to be archived. mdev found it and shared the cache link. I am not sure who will need this but I think it’s worth keeping.&lt;/p&gt;&lt;p&gt;After being stuck at a client for months, i decided to try whatever it took to get our integration running. After i got it working, i decided to note all my steps for my client (and future consultants). This post is derived from that support document.&lt;/p&gt;&lt;p&gt;See also my post on the community:&lt;br&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=2a88e632db6c8850f7fca851ca96&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=2a88e632db6c8850f7fca851ca96&lt;/a&gt;…&lt;/p&gt;&lt;h2 id=&quot;1-google-set-up&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#1-google-set-up&quot; class=&quot;heading-anchor&quot;&gt;1 Google set up&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In Gsuite, a service account with domain wide delegation needs to be registered. It should receive all scopes (roles) which are going to be used in the integration. Gsuite will provide you with a JSON containing the authentication information. This JSON should look like this: (broken image not copied)&lt;/p&gt;&lt;h2 id=&quot;2-generate-authentication-jsk&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#2-generate-authentication-jsk&quot; class=&quot;heading-anchor&quot;&gt;2 Generate authentication JSK&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;From the authentication information:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Unescape the private key and store it locally&lt;/li&gt;&lt;li&gt;Unescape the client key which you retrieve when entering the value of “client_x509_cert_url” in your browser, and store it locally&lt;br&gt;Navigate to the folder and run this command (Ubuntu)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;code&gt;openssl pkcs12 -export -in [path to certificate] -inkey [path to private key] -certfile [path to certificate] -out [p12_file_name].p12&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Enter a password twice. Run the following command&lt;/p&gt;&lt;p&gt;&lt;code&gt;keytool -importkeystore -srckeystore [p12_file_name].p12 -srcstoretype pkcs12 -destkeystore [jks_file_name].jks -deststoretype JKS&lt;/code&gt;&lt;/p&gt;&lt;p&gt;for every prompt, use the same password as in the previous step. Now you have a .jks file with your credentials.&lt;/p&gt;&lt;p&gt;Delete the locally stored keys as soon as you have the JSK.&lt;/p&gt;&lt;h2 id=&quot;3-register-oauth-in-servicenow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#3-register-oauth-in-servicenow&quot; class=&quot;heading-anchor&quot;&gt;3 Register oauth in ServiceNow&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;31-certificate&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#31-certificate&quot; class=&quot;heading-anchor&quot;&gt;3.1 Certificate&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Register a new x509 Certificate (sys_certificate)&lt;/p&gt;&lt;p&gt;Type: Java Key Store&lt;br&gt;Key store password: the password entered in (2)&lt;br&gt;Attachment: attach the generated .jks file&lt;br&gt;Delete the local .jks file&lt;/p&gt;&lt;h3 id=&quot;32-jwt-key&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#32-jwt-key&quot; class=&quot;heading-anchor&quot;&gt;3.2 JWT key&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Register a JWT key (jwt_keystore_aliases)&lt;/p&gt;&lt;p&gt;Signing Keystore: the certificate just registered&lt;br&gt;Signing Algorithm: RSA 256&lt;br&gt;Signing Key password: same as entered in (2)&lt;br&gt;Key Id: leave blank&lt;br&gt;Active: true&lt;/p&gt;&lt;h3 id=&quot;33-jwt-provider&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#33-jwt-provider&quot; class=&quot;heading-anchor&quot;&gt;3.3 JWT Provider&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Register a JWT provider (jwt_provider)&lt;/p&gt;&lt;p&gt;Signing Configuration: record registered under (3.2)&lt;br&gt;Related list: standard claims&lt;br&gt;aud: &lt;a href=&quot;https://oauth2.googleapis.com/token&quot; rel=&quot;noopener&quot;&gt;https://oauth2.googleapis.com/token&lt;/a&gt;&lt;br&gt;iss: client_email from the Gsuite JSON&lt;br&gt;sub: Email of an admin account&lt;br&gt;Related list: Custom Claims&lt;br&gt;scope Space separated domains you need to access,&lt;br&gt;eg: &lt;a href=&quot;https://www.googleapis.com/auth/admin.directory.group.readonly&quot; rel=&quot;noopener&quot;&gt;https://www.googleapis.com/auth/admin.directory.group.readonly&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;34-application-registry&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#34-application-registry&quot; class=&quot;heading-anchor&quot;&gt;3.4 Application Registry&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Register an Application Registry (oauth_entity)&lt;/p&gt;&lt;p&gt;Client ID: If the field is mandatory, use script to make blank after saving (if the field is filled, the integration fails because the basic auth is used instead of the JSK attachment)&lt;br&gt;Client Secret: If the field is mandatory, use script to make blank after saving&lt;br&gt;Default Grant Type: JWT bearer&lt;br&gt;Refresh Token Lifespan: 60&lt;br&gt;Authorizaiton URL: &lt;a href=&quot;https://accounts.google.com/o/oauth2/auth&quot; rel=&quot;noopener&quot;&gt;https://accounts.google.com/o/oauth2/auth&lt;/a&gt;&lt;br&gt;Token URL: &lt;a href=&quot;https://oauth2.googleapis.com/token&quot; rel=&quot;noopener&quot;&gt;https://oauth2.googleapis.com/token&lt;/a&gt;&lt;br&gt;Token Revocation URL: &lt;a href=&quot;https://accounts.google.com/o/oauth2/revoke&quot; rel=&quot;noopener&quot;&gt;https://accounts.google.com/o/oauth2/revoke&lt;/a&gt;&lt;br&gt;Redirect URL: https://&lt;your-instance&gt;.service-now.com/oauth_redirect.do&lt;/your-instance&gt;&lt;/p&gt;&lt;h4 id=&quot;341-oauth-entity-profiles&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#341-oauth-entity-profiles&quot; class=&quot;heading-anchor&quot;&gt;3.4.1 OAuth entity profiles&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Oauth Provider: Application registery of (3.4)&lt;br&gt;Grant type: JWT Bearer&lt;br&gt;JWT Provider: JWT provider of (3.3)&lt;br&gt;OAuth Entity Profile Scopes (related list): Leave Empty&lt;/p&gt;&lt;h4 id=&quot;342-oauth-entity-scopes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#342-oauth-entity-scopes&quot; class=&quot;heading-anchor&quot;&gt;3.4.2 Oauth entity scopes&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;OAuth provider: Application registry of (3.4)&lt;br&gt;OAuth scope: The scope you need access to&lt;/p&gt;&lt;h3 id=&quot;35-rest-message&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#35-rest-message&quot; class=&quot;heading-anchor&quot;&gt;3.5 Rest message&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Register a Rest message (sys_rest_message)&lt;/p&gt;&lt;p&gt;Endpoint: &lt;a href=&quot;https://www.googleapis.com/oauth2/v3/token&quot; rel=&quot;noopener&quot;&gt;https://www.googleapis.com/oauth2/v3/token&lt;/a&gt;&lt;br&gt;Authentication type: Oauth 2.0&lt;br&gt;Oauth Profile: Application registry of (2.4)&lt;/p&gt;&lt;h3 id=&quot;36-http-method&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#36-http-method&quot; class=&quot;heading-anchor&quot;&gt;3.6 HTTP Method&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Register a HTTP Method (sys_rest_message)&lt;/p&gt;&lt;p&gt;Endpoint Endpoint from google docs&lt;br&gt;Correct scopes for the endpoint have to be declared (both on the Oauth entity scope (3.4.2) AND the “sub” claim (3.3)&lt;br&gt;e.g. &lt;a href=&quot;https://www.googleapis.com/admin/directory/v1/groups&quot; rel=&quot;noopener&quot;&gt;https://www.googleapis.com/admin/directory/v1/groups&lt;/a&gt; requires &lt;a href=&quot;https://www.googleapis.com/auth/admin.directory.group.readonly&quot; rel=&quot;noopener&quot;&gt;https://www.googleapis.com/auth/admin.directory.group.readonly&lt;/a&gt;&lt;br&gt;Authentication type: Inherent from parent&lt;/p&gt;&lt;h2 id=&quot;4-scopes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#4-scopes&quot; class=&quot;heading-anchor&quot;&gt;4 Scopes&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The service account as defined in Google has certain access rights. To invoke these rights, the API call must declare them as scopes. This has to be done at 2 locations&lt;/p&gt;&lt;p&gt;The JWT Profile definition (space separated) (3.3)&lt;br&gt;The OAuth Entity Scopes related list of the Application registry (3.4.2)&lt;br&gt;The definitions at these two locations must match.&lt;/p&gt;&lt;p&gt;The Endpoint access (3.6) has right restrictions. The correct scopes have to be invoked in order to have the endpoint expose its data.&lt;/p&gt;&lt;p&gt;For endpoints with their required scopes, check:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developers.google.com/admin-sdk/directory/v1/reference&quot; rel=&quot;noopener&quot;&gt;https://developers.google.com/admin-sdk/directory/v1/reference&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Scope overview:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developers.google.com/admin-sdk/directory/v1/guides/authorizing.html&quot; rel=&quot;noopener&quot;&gt;https://developers.google.com/admin-sdk/directory/v1/guides/authorizing.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;OAuth authentication (click “HTTP/REST”).&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developers.google.com/identity/protocols/OAuth2ServiceAccount&quot; rel=&quot;noopener&quot;&gt;https://developers.google.com/identity/protocols/OAuth2ServiceAccount&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developers.google.com/identity/protocols/OAuth2ServiceAccount#formingclaimset&quot; rel=&quot;noopener&quot;&gt;https://developers.google.com/identity/protocols/OAuth2ServiceAccount#formingclaimset&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;5-debugging&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integrate-gsuite-and-servicenow-using-a-google-service-account-and-jwt/#5-debugging&quot; class=&quot;heading-anchor&quot;&gt;5 Debugging&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Error message when retrieving OAuth token:&lt;/p&gt;&lt;p style=&quot;color:red&quot;&gt;OAuth flow failed. Verify the configurations and try again. Error detail:invalid_scope, Invalid downscoping, scopes should not be specified as a request parameter.&lt;/p&gt;&lt;p&gt;Make sure the related list “OAuth Entity Profile Scopes” on your OAuth entinty profile is empty&lt;/p&gt;&lt;p style=&quot;color:red&quot;&gt;OAuth flow failed. Verify the configurations and try again. Error detail:invalid_scope, Empty or missing scope not allowed.&lt;/p&gt;&lt;p&gt;Check the scope entered under the claim “scope” (3.4.1)&lt;/p&gt;&lt;p&gt;You receive an access token, but the request is “403: forbidden”&lt;/p&gt;&lt;p&gt;Check you are impersonating the correct user (3.4.1, the email address entered as claim “sub”)&lt;/p&gt;&lt;p&gt;S﻿ource: &lt;a href=&quot;https://www.servicenow.com/community/contentarchivals/contentarchivedpage/message-uid/2325489&quot; rel=&quot;noopener&quot;&gt;https://www.servicenow.com/community/contentarchivals/contentarchivedpage/message-uid/2325489&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>News 08-01</title>
      <link href="https://jace.pro/blog/news-08-01/" />
      <updated>2022-07-30T00:00:00Z</updated>
      <id>https://jace.pro/blog/news-08-01/</id>
      <content type="html">
				&lt;p&gt;Tokyo walkthrough registration: &lt;a href=&quot;https://info.servicenow.com/WBR-CS-ALLBU-Tokyo-09AUG22-AMS_LP.html&quot; rel=&quot;noopener&quot;&gt;https://info.servicenow.com/WBR-CS-ALLBU-Tokyo-09AUG22-AMS_LP.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;BuildWithAES Challenge: &lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=8ea8e43f1bb81d10b09633f2cd4bcb8f&amp;amp;view_source=featuredList&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=8ea8e43f1bb81d10b09633f2cd4bcb8f&amp;amp;view_source=featuredList&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Phil’s video: &lt;a href=&quot;https://www.youtube.com/watch?v=G9IbN_KTJlc&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=G9IbN_KTJlc&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ishaan Shoor on Breakpoint: &lt;a href=&quot;https://www.youtube.com/watch?v=PQf_taaNEbU&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=PQf_taaNEbU&lt;/a&gt;&lt;br&gt;Ishaan Shoor on Laten We Praten: &lt;a href=&quot;https://www.buzzsprout.com/1729384/11019507-dev-mvp-special-ishaan-shoor&quot; rel=&quot;noopener&quot;&gt;https://www.buzzsprout.com/1729384/11019507-dev-mvp-special-ishaan-shoor&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Allen Andreas on Client Scripts: &lt;a href=&quot;https://www.youtube.com/watch?v=KqYjx5hITKo&amp;amp;t=45s&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=KqYjx5hITKo&amp;amp;t=45s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Now with Troy relaunch: &lt;a href=&quot;https://www.youtube.com/watch?v=COszrdbT574&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=COszrdbT574&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Chuck Tomasi - List Filter Shortcuts: &lt;a href=&quot;https://www.youtube.com/watch?v=F7CoszrSnw8&amp;amp;t=3s&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=F7CoszrSnw8&amp;amp;t=3s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;TehcZavier Free ServiceNow Certificate: &lt;a href=&quot;https://www.youtube.com/watch?v=rPKmunwQHEg&amp;amp;t=46s&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=rPKmunwQHEg&amp;amp;t=46s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Justin Meadows: (Posts on youtube but also on &lt;a href=&quot;https://justin.house&quot; rel=&quot;noopener&quot;&gt;https://justin.house&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;Sec. of Simplifcation: Create Loops in Flow designer: &lt;a href=&quot;https://www.youtube.com/watch?v=hRqJU2cZ74c&amp;amp;t=4s&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=hRqJU2cZ74c&amp;amp;t=4s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Amazing events for folks (aimed at early career but really for anyone) &lt;a href=&quot;https://servicenow.yello.co/external/events_central&quot; rel=&quot;noopener&quot;&gt;https://servicenow.yello.co/external/events_central&lt;/a&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;Didnt make the recording but should have:&lt;br&gt;Saving $$,$$$ using Checklist Pro - &lt;a href=&quot;https://www.tygrconsulting.com/post/saving-using-checklist-pro&quot; rel=&quot;noopener&quot;&gt;https://www.tygrconsulting.com/post/saving-using-checklist-pro&lt;/a&gt;&lt;br&gt;CJ and the Duke on Content and Self Marketing: &lt;a href=&quot;https://share.transistor.fm/s/6c64b342&quot; rel=&quot;noopener&quot;&gt;https://share.transistor.fm/s/6c64b342&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>News 07-25</title>
      <link href="https://jace.pro/blog/news-07-25/" />
      <updated>2022-07-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/news-07-25/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=lTDa8nFRvmU&quot; rel=&quot;noopener&quot;&gt;Brad Tilton released a video&lt;/a&gt; showing the nuances of how to add a Button to the list component on the experiences. Running time is ~15 minutes. Brad mentioned &lt;a href=&quot;https://www.youtube.com/watch?v=C8KDDHUvNO8&quot; rel=&quot;noopener&quot;&gt;Arnoud Kooi made a video about this&lt;/a&gt;, that runs for 11 minutes. There’s a lot going on here.&lt;/p&gt;&lt;p&gt;Dhruv Gupta, Pranav, Earl and Chuck ran another &lt;a href=&quot;https://www.youtube.com/watch?v=GAxx2gQ56vE&quot; rel=&quot;noopener&quot;&gt;Let’s Code Happy Hour&lt;/a&gt;. This episode they are working on a Algo stock trading app.&lt;/p&gt;&lt;p&gt;Aug 4th Tokyo Early Access Day&lt;/p&gt;&lt;p&gt;Aug 5th Tokyo Let’s Code Happy Hour &lt;a href=&quot;http://devlink.sn/tokyo&quot; rel=&quot;noopener&quot;&gt;devlink.sn/tokyo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The developer advocate’s made their list and I checked it twice, here are the features they are highlighting;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Automation Center&lt;/li&gt;&lt;li&gt;Automation Engine Pre-Built Solutions&lt;/li&gt;&lt;li&gt;IntegrationHub improvements&lt;/li&gt;&lt;li&gt;Next Experience&lt;/li&gt;&lt;li&gt;Internationalization (i18n) of notifications&lt;/li&gt;&lt;li&gt;The formula builder&lt;/li&gt;&lt;li&gt;ECMAScript 2021&lt;/li&gt;&lt;li&gt;Now Mobile improvements&lt;/li&gt;&lt;li&gt;Data Filtration&lt;/li&gt;&lt;li&gt;OAuth support for end-user non-admins&lt;/li&gt;&lt;li&gt;Upgrade Plans&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I made a list too and there is some overlap but here’s the missing bits from my list;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Service Catalog - New demo data,&lt;/li&gt;&lt;li&gt;Service Catalog - Catalog Builder improvements&lt;/li&gt;&lt;li&gt;Homepages are deprecated for real&lt;/li&gt;&lt;li&gt;Sub-prods can be anonymized now&lt;/li&gt;&lt;li&gt;Bulk update/delete feature&lt;/li&gt;&lt;li&gt;IP Address field type&lt;/li&gt;&lt;li&gt;Service Portal i18n improvement&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/video/event/urn:li:ugcPost:6956791716175650817/&quot; rel=&quot;noopener&quot;&gt;Benjamin Forrest is coming in weekly&lt;/a&gt; (this week Tuesday July 26 6pm CST) after training folks on ServiceNow to answer questions in office hours. A great show with smart people&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/posts/portalguru_heat-wave-activity-6955567768922460162-pi98?utm_source=linkedin_share&amp;amp;utm_medium=member_desktop_web&quot; rel=&quot;noopener&quot;&gt;Who knew a Fix Script was behind the summer heat!?&lt;/a&gt; Jeff, 😄&lt;/p&gt;&lt;p&gt;ServiceNow Impact? What is it, why.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/posts/adam-mansfield_servicenow-impact-negotiations-key-contract-activity-6955228494238785538-OHeU?utm_source=linkedin_share&amp;amp;utm_medium=member_desktop_web&quot; rel=&quot;noopener&quot;&gt;Impact Product Negations by UpperEdge&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://podcasts.apple.com/gb/podcast/an-introduction-to-impact/id1593700332&quot; rel=&quot;noopener&quot;&gt;Interview with Aaron Fulkerson about what “ServiceNow Impact” is and what you get for it&lt;/a&gt; @3:30. Ultimately I think this is driven from&lt;/p&gt;&lt;ul&gt;&lt;li&gt;New Premium Support Offering&lt;/li&gt;&lt;li&gt;New Business Process and Technology experts that support the account and achieving their desired outcomes&lt;/li&gt;&lt;li&gt;Including training based on the value blueprint&lt;/li&gt;&lt;li&gt;New tools and technologies to manage customers in the ServiceNow environment&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I asked about it on Slack, and it seems it’s like a extra tiered layer of support to get value from the investment made. &lt;a href=&quot;https://www.servicenow.com/impact.html&quot; rel=&quot;noopener&quot;&gt;https://www.servicenow.com/impact.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/posts/pranav-he-him-604802148_servicenow-servicenowdeveloper-activity-6956982468939849728-VHfL?utm_source=linkedin_share&amp;amp;utm_medium=member_desktop_web&quot; rel=&quot;noopener&quot;&gt;Pranav ports a cool login to the Service Portal from CodePen&lt;/a&gt;&lt;/p&gt;&lt;p&gt;CommitStrip made a comment about how no-code platforms can’t perform some functions not called out when originally scoped. It feels very appropriate on ServiceNow. &lt;a href=&quot;https://www.linkedin.com/posts/sn-timw_servicenow-developer-nocode-activity-6956972939963490304-DL-q?utm_source=linkedin_share&amp;amp;utm_medium=member_desktop_web&quot; rel=&quot;noopener&quot;&gt;Thanks Tim for sharing&lt;/a&gt;. &lt;a href=&quot;https://www.commitstrip.com/en/2020/10/07/the-no-code-dream/?&quot; rel=&quot;noopener&quot;&gt;Original Source&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.indiehackers.com/post/is-no-code-really-an-option-e48f0d1f2d&quot; rel=&quot;noopener&quot;&gt;Further Reading on No Code&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=EvuL3NZBRwA&quot; rel=&quot;noopener&quot;&gt;Lui Iacobellis shows how to set up a delegate in ServiceNow in under 5 minutes!&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=XDX6gpXZo2g&quot; rel=&quot;noopener&quot;&gt;Ryan Gillespie aka “TheManMythLegend” goes over what is App Engine Studio in under 5 minutes!&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>News 07-18</title>
      <link href="https://jace.pro/blog/news-07-18/" />
      <updated>2022-07-18T00:00:00Z</updated>
      <id>https://jace.pro/blog/news-07-18/</id>
      <content type="html">
				&lt;p&gt;ServiceNow Tokyo is coming out soon. I heard that Tokyo Early Availability is on August 4, 2022.&lt;/p&gt;&lt;p&gt;What features do you think will be in it and make it? What features do you think will be the most valuable?&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0718545&quot; rel=&quot;noopener&quot;&gt;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0718545&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/rtp-rtp-release-notes/page/rtp-rn/concept/rn-learn-landing-page.html&quot; rel=&quot;noopener&quot;&gt;https://docs.servicenow.com/bundle/rtp-rtp-release-notes/page/rtp-rn/concept/rn-learn-landing-page.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/posts/figenschow_servicenow-tokyo-es12-activity-6953988502296354816-THi_/?utm_source=linkedin_share&amp;amp;utm_medium=member_desktop_web&quot; rel=&quot;noopener&quot;&gt;ES12 Scripts available for scopes only&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/posts/laurence-tindall-28757912a_servicenow-glidefast-activity-6953732451600916481-RM6s/?utm_source=linkedin_share&amp;amp;utm_medium=member_desktop_web&quot; rel=&quot;noopener&quot;&gt;View all values with show xml&lt;/a&gt;&lt;/p&gt;&lt;p&gt;New folks (&lt;a href=&quot;https://www.linkedin.com/search/results/content/?keywords=servicenow%20skillbridge&amp;amp;origin=FACETED_SEARCH&amp;amp;sid=E%2Ci&amp;amp;sortBy=%22date_posted%22&quot; rel=&quot;noopener&quot;&gt;linkedin skillbridge&lt;/a&gt;) and (&lt;a href=&quot;https://twitter.com/search?q=%40mytechbf%20acceptance&amp;amp;src=typed_query&amp;amp;f=live&quot; rel=&quot;noopener&quot;&gt;mtbf cohort&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://snjobs.com&quot; rel=&quot;noopener&quot;&gt;snjobs.com by Nathan Firth&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://omny.fm/shows/break-point/what-you-need-to-know-about-the-next-experience-wi&quot; rel=&quot;noopener&quot;&gt;Breakpoint - what you need to know about the next experience&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sn-aug.gumroad.com/l/mZaGH&quot; rel=&quot;noopener&quot;&gt;Jelly is forever - amazing resource by Sal Costa&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://share.transistor.fm/s/fc855a7a&quot; rel=&quot;noopener&quot;&gt;CJ &amp;amp; The Duke - why we do it&lt;/a&gt; (mtbf mention)&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=CIKRTI_uYSI&amp;amp;t&quot; rel=&quot;noopener&quot;&gt;Developer Game on replay&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=sTb0A8ByWx0&amp;amp;feature=youtu.be&quot; rel=&quot;noopener&quot;&gt;What you can expect as a Certified System Administrator&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://news.jace.pro/public-feed/130&quot; rel=&quot;noopener&quot;&gt;Justin Meadows killing it with his content&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>New 07-11</title>
      <link href="https://jace.pro/blog/new-07-11/" />
      <updated>2022-07-11T00:00:00Z</updated>
      <id>https://jace.pro/blog/new-07-11/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=642ee1d9dbe0d590457ae6be13961911&quot; rel=&quot;noopener&quot;&gt;Rising star nominations&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://finite-partners.com/advanced-business-rules-before-query/&quot; rel=&quot;noopener&quot;&gt;David Durling writes about Before Queries&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://omny.fm/shows/customer-connection-servicenow/now-learning&quot; rel=&quot;noopener&quot;&gt;Now Learning with Amanda Johnson - Love the Acronym donation part&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=7ea031611ba851d0acdc54e56b4bcb14&quot; rel=&quot;noopener&quot;&gt;Live Q+A about Certified System Administrator stuff&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.snowballs.rocks/post/game-of-portals&quot; rel=&quot;noopener&quot;&gt;Jeff Pierce’s Snowballs with Game of Portals.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Ias8N0hm6Tg&quot; rel=&quot;noopener&quot;&gt;Glidefast release visual portfolio&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://twitter.com/themanmythlegnd/status/1545798197167243267?s=12&amp;amp;t=YDy7-1bEpnvFsGjNKzN1dQ&quot; rel=&quot;noopener&quot;&gt;Ryan G looking for feedback about Didja know, didja care&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://twitter.com/poshprogrammer/status/1544333396935147521?s=12&amp;amp;t=YDy7-1bEpnvFsGjNKzN1dQ&quot; rel=&quot;noopener&quot;&gt;Lauren McManamon joins the dev rel team&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6952275361850150914/&quot; rel=&quot;noopener&quot;&gt;The developer game - MavenNext&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>News 07-05</title>
      <link href="https://jace.pro/blog/news-07-05/" />
      <updated>2022-07-05T00:00:00Z</updated>
      <id>https://jace.pro/blog/news-07-05/</id>
      <content type="html">
				&lt;ul&gt;&lt;li&gt;Getting an offer from a job is great. Being able to negotiate that salary is something I still struggle with. Andrea South shared that she got an offer but wasn’t thrilled with offer. She asked “How would you negotiate the salary?” Robert Fedoruk and Joesph Laudon piped up with some great knowledge.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ol&gt;&lt;li&gt;You have to be willing to walk away.&lt;/li&gt;&lt;li&gt;Make your response short, sweet and to the point.&lt;/li&gt;&lt;li&gt;Say what you want and decide for yourself where your hard line is.&lt;ul&gt;&lt;li&gt;Robert Fedoruk&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;As a &lt;em&gt;(role name)&lt;/em&gt; I will provide &lt;em&gt;(the value you will bring to the organization)&lt;/em&gt;. As a culture fit , I will empower my teammates and nurture company culture. An offer of &lt;em&gt;(insert desired pay)&lt;/em&gt; is what I request based off the the value I will bring as an (role name) and to my teammates and overall company culture. I am eagerly awaiting your response and excited to accomplish &lt;em&gt;(company name)&lt;/em&gt; vision and mission statement.&lt;/p&gt;&lt;p&gt;Hi, &lt;em&gt;(hiring manager or recruiter’s name)&lt;/em&gt;&lt;br&gt;Thank you again for the opportunity to interview for &lt;em&gt;(role title)&lt;/em&gt; it was a pleasure to speak with you and I am so excited for the opportunity to be a part of the &lt;em&gt;(company name)&lt;/em&gt; team. I truly believe that I am a perfect fit for this position and the culture at &lt;em&gt;(company name)&lt;/em&gt; and would like to discuss the salary offer, is this an option?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Joesph Laudon&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6947704433753358336/&quot; rel=&quot;noopener&quot;&gt;https://www.linkedin.com/feed/update/urn:li:activity:6947704433753358336/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Written.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I’ve been in a few situations where I wanted to anonymize data in a table. I can imagine many scenarios where you have personal identification information you need to keep secure in lower environments this person just made some &lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=8f1491481bac5950a59033f2cd4bcb9c&quot; rel=&quot;noopener&quot;&gt;Servicenow Table data anonymizer&lt;/a&gt; I haven’t had time to check it out but it’s on a list for me to get to.&lt;/li&gt;&lt;li&gt;Jeff pierce &lt;a href=&quot;https://www.snowballs.rocks/post/skills&quot; rel=&quot;noopener&quot;&gt;Snowballs Skills&lt;/a&gt;&lt;/li&gt;&lt;li&gt;There’s some great ways to keep your catalog items from having extra unneeded stuff &lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=ccf465ba1bd81510b4b577bc1d4bcb26&quot; rel=&quot;noopener&quot;&gt;Nia McCash writes about a few Instance Scan&lt;/a&gt; checks you can build to help.&lt;/li&gt;&lt;li&gt;Speaking of instance scans. Have you heard of the &lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=9e1bf1bd1b189510c552c8031d4bcb11&quot; rel=&quot;noopener&quot;&gt;instance troubleshooter application&lt;/a&gt;? I hadn’t. Kopal does a great review.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Audio&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I really enjoy Dhruv and Ashutosh’s podcast. This week they had Nerys on. Turns out she’s one of their bosses. It’s great to hear folks and their different pasts and how they come up. Have you ever interviewed your boss publicly like this? If so I’d love to check it out. Share a link in the doobly doo. &lt;a href=&quot;https://audio.buzzsprout.com/pgcwody2b6kocv39fupz82ayi8wm?response-content-disposition=inline&amp;amp;&quot; rel=&quot;noopener&quot;&gt;Laten We Praten Nerys Mutlow&lt;/a&gt;&lt;/li&gt;&lt;li&gt;I was asked to talk about &lt;a href=&quot;https://www.youtube.com/watch?v=Bh35wt4w8vY&quot; rel=&quot;noopener&quot;&gt;side projects on Break Point&lt;/a&gt;. I really think they are crucial to solidly learning concepts and new tech. What side projects are you working on?&lt;/li&gt;&lt;li&gt;Speaking of breakpoint I finally got some time to &lt;a href=&quot;https://www.youtube.com/watch?v=hNJtWoXaSKM&quot; rel=&quot;noopener&quot;&gt;listen to Tracy Miller and she talks about the nextgen&lt;/a&gt; bootcamp they are running and I don’t often reach out to folks to thank them but I did to Tracy. It’s an amazing program and I’m inspired every time I see progress by the groups they are running.&lt;/li&gt;&lt;li&gt;Chuck and the Duke give their two cents on &lt;a href=&quot;https://share.transistor.fm/s/c307e8ac&quot; rel=&quot;noopener&quot;&gt;What the hec is a ServiceNow Admin&lt;/a&gt;?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Video&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Earl had been making some fun short form stuff on TikTok. I enjoy this content a lot - &lt;a href=&quot;https://www.youtube.com/watch?v=K0MnXbOAbko&quot; rel=&quot;noopener&quot;&gt;The two states of all deverlopers.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Barry O’Sulliven plays golf most Friday afternoons. He does this cause Crossfuze makes Friday afternoons free for employees to take off. That sounds awesome. I remember when I worked at Expedia we had some amazing travel benefits and were also considered a “travel agent”. What benefits have you seen that are like those two? &lt;a href=&quot;https://youtu.be/j_tq9OkAeYA&quot; rel=&quot;noopener&quot;&gt;Family First - Barry O’Sullivan&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Hey who’s that. How did you get in here. Never mind I’m glad to have you what’s new chuck. &lt;a href=&quot;https://www.youtube.com/watch?v=NJzT3HGTHXQ&quot; rel=&quot;noopener&quot;&gt;SN Utils with Arnoud Kooi - Did You Know&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Measurable value is so important. I made a video recently about using metrics in scopes where I emphasized that. Then I found this talk between Harry Tillman and Lombardo about generating revenue. &lt;a href=&quot;https://youtu.be/VOPACeMO8R0&quot; rel=&quot;noopener&quot;&gt;GlideChat E26&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=f5YP1mrEJ0E&quot; rel=&quot;noopener&quot;&gt;The PhxDev Show - Exiting Development&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Other stuff&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/news-07-05/*%20https:/youtu.be/aD3htEQUhxM&quot;&gt;Fedoruk continues go with the flow series&lt;/a&gt;&lt;/li&gt;&lt;li&gt;MyTechBestFriend sent out acceptance letter this week and the hope and eagerness this class shows is amazing&lt;/li&gt;&lt;li&gt;Nextgen the skills bridge cohort just finished up. There’s new folks popping up on LinkedIn and I’m on it. You should reach out too.&lt;/li&gt;&lt;li&gt;ServiceNow received a user experience award. This I the first year of it in the us. I’m not sure how fierce the competition was but ServiceNow won it. I know theirs parts of platform that need help but a lot of it is really great with WCAG 2 or 3 compliance.&lt;/li&gt;&lt;li&gt;Hardik shared that ServiceNow’s cloud connectors include a plug-in for oracles cloud. More providers is always a great thing.&lt;/li&gt;&lt;li&gt;Chris walker shares stuff about &lt;a href=&quot;https://jace.pro/blog/news-07-05/*%20https:/www.linkedin.com/posts/christopher-walker-771a2666_secbytes-s2e2-mitre-attck-with-servicenow-activity-6946135393884934145-3kdX&quot;&gt;MITRE ATT&amp;amp;CK&lt;/a&gt; in a great video&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/news-07-05/*%20https:/www.linkedin.com/posts/jrpoisson_happy-to-share-that-servicenow-has-been-named-activity-6942833021309915136-d6Wj&quot;&gt;ServiceNow received a Silver Stevie award&lt;/a&gt; which I had to look up what they meant. Sounds like they were initially set up to tell the good guys from the bad ones. I suppose that’s subjective. But it’s nice to get an award.&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>News 06-20</title>
      <link href="https://jace.pro/blog/news-06-20/" />
      <updated>2022-06-20T00:00:00Z</updated>
      <id>https://jace.pro/blog/news-06-20/</id>
      <content type="html">
				&lt;ol&gt;&lt;li&gt;&lt;p&gt;Jeslyn Carlson has been making really engaging content about ServiceNow. A masterclass on how to get some serious engagement.&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/posts/jeslyncarlson_newposition-lebronjames-servicenow-activity-6940777128103723008-txEz?utm_source=linkedin_share&amp;amp;utm_medium=member_desktop_web&quot; rel=&quot;noopener&quot;&gt;Big news&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6942499120376930304/&quot; rel=&quot;noopener&quot;&gt;ServiceNowSuccessStory&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6839287206633332736/&quot; rel=&quot;noopener&quot;&gt;ABCDs is not CMDB&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=yJttdDa-9xU&quot; rel=&quot;noopener&quot;&gt;Robert Fedoruk shows us the value of many to many relationships&lt;/a&gt; and how to make them.&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/NorhOPSHYn-650.webp 650w, https://jace.pro/img/NorhOPSHYn-960.webp 960w, https://jace.pro/img/NorhOPSHYn-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/NorhOPSHYn-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/NorhOPSHYn-650.jpeg 650w, https://jace.pro/img/NorhOPSHYn-960.jpeg 960w, https://jace.pro/img/NorhOPSHYn-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Found Sascha Wildgrube’s CodeSanity app repo that has LOADS of Instance Scans. Mark Roehtful, if you’re watching this let me know what you think in the comments! &lt;a href=&quot;https://www.wildgrube.com/servicenow-codesanity&quot; rel=&quot;noopener&quot;&gt;https://www.wildgrube.com/servicenow-codesanity&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Pop-up experiences are a thing now. Looks like a &lt;a href=&quot;https://jace.pro/blog/news-06-20/1.%20https:/360magazine.com/2022/06/15/servicenow-innovation-park-experience/&quot;&gt;ServiceNow County Fair&lt;/a&gt; to show and demo ServiceNow in person it happened in 10 cities. I don’t know when is but it’s happening. If you know more I would love to hear from you.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/HIrtVE9ZaD-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/HIrtVE9ZaD-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;212&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ServiceNow just released &lt;a href=&quot;https://servicenow.github.io/azimuth/main/&quot; rel=&quot;noopener&quot;&gt;Azimuth&lt;/a&gt;, a open source utility to better understand AI datasets and model predictions. I don’t know much about that stuff, but it’s rare to see ServiceNow do this.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/K8dY-lXyAJ-650.webp 650w, https://jace.pro/img/K8dY-lXyAJ-960.webp 960w, https://jace.pro/img/K8dY-lXyAJ-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/K8dY-lXyAJ-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/K8dY-lXyAJ-650.jpeg 650w, https://jace.pro/img/K8dY-lXyAJ-960.jpeg 960w, https://jace.pro/img/K8dY-lXyAJ-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=_GeQXYBpAEU&quot; rel=&quot;noopener&quot;&gt;GlideFast shows the value of Scripted Rest APIs in this tutorial&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/OV4Qm9_02n-650.webp 650w, https://jace.pro/img/OV4Qm9_02n-960.webp 960w, https://jace.pro/img/OV4Qm9_02n-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/OV4Qm9_02n-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/OV4Qm9_02n-650.jpeg 650w, https://jace.pro/img/OV4Qm9_02n-960.jpeg 960w, https://jace.pro/img/OV4Qm9_02n-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Next week I have a special edition of the news all about metrics!&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;events&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06-20/#events&quot; class=&quot;heading-anchor&quot;&gt;Events&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;6/21 - &lt;a href=&quot;https://info.servicenow.com/LiveOnServiceNow-ITSM&quot; rel=&quot;noopener&quot;&gt;Integrating ServiceNow Virtual Agent with Microsoft Teams&lt;/a&gt;&lt;br&gt;Nothing else is scheduled that I could find.&lt;br&gt;Mark Scott, Troy Pesola, Jon Merchant.&lt;/p&gt;&lt;h2 id=&quot;missed-events&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06-20/#missed-events&quot; class=&quot;heading-anchor&quot;&gt;Missed Events&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/video/event/urn:li:ugcPost:6937818151225110528/&quot; rel=&quot;noopener&quot;&gt;Huntington bank and Southwest talk about ServiceNow by Vividcharts on Demand&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=KpLWd44uOR8&quot; rel=&quot;noopener&quot;&gt;Show value over time by learning Performance Analytics&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;new-folks&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06-20/#new-folks&quot; class=&quot;heading-anchor&quot;&gt;New Folks&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6943249192077180928/&quot; rel=&quot;noopener&quot;&gt;Mark Scott gives away the interview!&lt;/a&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/d_49va4GK--630.webp 630w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/d_49va4GK--630.jpeg&quot; alt width=&quot;630&quot; height=&quot;272&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/posts/daronjasmith_interview-servicenow-tips-activity-6943533921603112960-kh6i?utm_source=linkedin_share&amp;amp;utm_medium=member_desktop_web&quot; rel=&quot;noopener&quot;&gt;Techbridge hones Daronja Smith’s interview skills.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Here’s the things Daronja always found useful when interviewing:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Try to incorporate a fun fact about yourself, this a good way to eliminate the pressure.&lt;/li&gt;&lt;li&gt;Think of the interview as a conversation, instead of an interrogation.&lt;/li&gt;&lt;li&gt;Ask questions! This is a time for you to learn as much as you can about the company and their values, to ensure they align with your own.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>News 06-13</title>
      <link href="https://jace.pro/blog/news-06-13/" />
      <updated>2022-06-13T00:00:00Z</updated>
      <id>https://jace.pro/blog/news-06-13/</id>
      <content type="html">
				&lt;h2 id=&quot;interesting-content&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06-13/#interesting-content&quot; class=&quot;heading-anchor&quot;&gt;Interesting Content&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Use storytelling to tell a better story that &lt;a href=&quot;https://www.linkedin.com/posts/jacebenson_what-movies-can-teach-us-about-storytelling-activity-6940883936839442432-26rm?utm_source=linkedin_share&amp;amp;utm_medium=member_desktop_web&quot; rel=&quot;noopener&quot;&gt;Courtney Zamm shared on LinkedIn&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/W4gqL5UOhL-460.webp 460w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/W4gqL5UOhL-460.jpeg&quot; alt width=&quot;460&quot; height=&quot;331&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=eHdn2Qrx_t4&quot; title=&quot;Using the ServiceNow store for smoother upgrades&quot; rel=&quot;noopener&quot;&gt;Using the ServiceNow store for smoother upgrades&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/e95AaRAoDF-650.webp 650w, https://jace.pro/img/e95AaRAoDF-960.webp 960w, https://jace.pro/img/e95AaRAoDF-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/e95AaRAoDF-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/e95AaRAoDF-650.jpeg 650w, https://jace.pro/img/e95AaRAoDF-960.jpeg 960w, https://jace.pro/img/e95AaRAoDF-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=2xxpYbAbyAs&quot; title=&quot;How to Change Your Company Logo in ServiceNow | ServiceNow Tutorial&quot; rel=&quot;noopener&quot;&gt;How to Change Your Company Logo in ServiceNow | ServiceNow Tutorial&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/MoKXssdGuL-650.webp 650w, https://jace.pro/img/MoKXssdGuL-960.webp 960w, https://jace.pro/img/MoKXssdGuL-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/MoKXssdGuL-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/MoKXssdGuL-650.jpeg 650w, https://jace.pro/img/MoKXssdGuL-960.jpeg 960w, https://jace.pro/img/MoKXssdGuL-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Justin Meadows - &lt;a href=&quot;https://www.youtube.com/watch?v=ZWxfoS8rIhI&quot; rel=&quot;noopener&quot;&gt;My First UI Builder Experience - Part 1 - Build the Recipe Page&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=I5ZU7ePsJrI&quot; rel=&quot;noopener&quot;&gt;My First UI Builder Experience - Part 2 - Build the Home Page&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/zicoeBzO3B-650.webp 650w, https://jace.pro/img/zicoeBzO3B-960.webp 960w, https://jace.pro/img/zicoeBzO3B-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/zicoeBzO3B-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/zicoeBzO3B-650.jpeg 650w, https://jace.pro/img/zicoeBzO3B-960.jpeg 960w, https://jace.pro/img/zicoeBzO3B-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=4PQ70X_YyCY&quot; rel=&quot;noopener&quot;&gt;MavenNext shared their webinar&lt;/a&gt; of how to surprise and delight their customers when building a service portal&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/WqoZT3zvis-640.webp 640w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/WqoZT3zvis-640.jpeg&quot; alt width=&quot;640&quot; height=&quot;480&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://share.transistor.fm/s/eaca1214&quot; rel=&quot;noopener&quot;&gt;CJ &amp;amp; the Duke talk about how work is bull****&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/5V_Zc2jlis-532.webp 532w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/5V_Zc2jlis-532.jpeg&quot; alt width=&quot;532&quot; height=&quot;344&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FM8cIVFPkjk&quot; rel=&quot;noopener&quot;&gt;Jace covers Casey Barela’s Copy Link Share&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/HvTT2ayZtE-640.webp 640w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/HvTT2ayZtE-640.jpeg&quot; alt width=&quot;640&quot; height=&quot;480&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/resources/&quot; rel=&quot;noopener&quot;&gt;My Resources&lt;/a&gt; Tools, Labs + Learning, Community, Documentation&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/T8ues4CuOV-531.webp 531w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/T8ues4CuOV-531.jpeg&quot; alt width=&quot;531&quot; height=&quot;342&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;now-learning-content-added&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06-13/#now-learning-content-added&quot; class=&quot;heading-anchor&quot;&gt;Now Learning Content Added&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Agent Client Collector Fundamentals&lt;/li&gt;&lt;li&gt;Flow Designer: Error Handling&lt;/li&gt;&lt;li&gt;Flow Designer: Administration&lt;/li&gt;&lt;li&gt;FSO: Insurance Essentials&lt;/li&gt;&lt;li&gt;Get Started with Reports&lt;/li&gt;&lt;li&gt;Health Log Analytics Technical Overview&lt;/li&gt;&lt;li&gt;Scripting a UI Action&lt;/li&gt;&lt;li&gt;Scripting an Event&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/hJJT6NJRbi-559.webp 559w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/hJJT6NJRbi-559.jpeg&quot; alt width=&quot;559&quot; height=&quot;555&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;do-you-hire-people-how-about-new-people-no-not-babies-but-folks-who-can-make-flows-and-portals-get-in-touch-with-sarah-lewis&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06-13/#do-you-hire-people-how-about-new-people-no-not-babies-but-folks-who-can-make-flows-and-portals-get-in-touch-with-sarah-lewis&quot; class=&quot;heading-anchor&quot;&gt;Do you hire people? How about new people? No not babies but folks who can make flows and portals? Get in touch with Sarah Lewis.&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/uMc_SjgALk-555.webp 555w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/uMc_SjgALk-555.jpeg&quot; alt width=&quot;555&quot; height=&quot;207&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;upcoming-events&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06-13/#upcoming-events&quot; class=&quot;heading-anchor&quot;&gt;Upcoming Events&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Meeting in person is a breath of fresh air, check it out, you could have met DeAnn and some of the other Skillgen folks last week in San Antonio Texas.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/-5shcm2J8Q-537.webp 537w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/-5shcm2J8Q-537.jpeg&quot; alt width=&quot;537&quot; height=&quot;367&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/-hwLIWV9Dh-650.webp 650w, https://jace.pro/img/-hwLIWV9Dh-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/-hwLIWV9Dh-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;448&quot; srcset=&quot;https://jace.pro/img/-hwLIWV9Dh-650.jpeg 650w, https://jace.pro/img/-hwLIWV9Dh-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Amsterdam-ServiceNow-Developer-Meetup/events/285745791/&quot; rel=&quot;noopener&quot;&gt;Amsterdam Meetup June 15&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Phoenix-ServiceNow-Developer-Meetup/events/285697919/&quot; rel=&quot;noopener&quot;&gt;Phoenix Meetup June 15&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/pune-servicenow-developer-meetup/events/286240598/&quot; rel=&quot;noopener&quot;&gt;Pune Meetup June 18&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Online stuff&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://info.servicenow.com/LiveOnServiceNow-ITSM&quot; rel=&quot;noopener&quot;&gt;LiveOnServiceNow&lt;/a&gt; stuff&lt;/p&gt;&lt;ul&gt;&lt;li&gt;June 14 Best practices on setting up ServiceNow Performance Analytics&lt;/li&gt;&lt;li&gt;June 16 Employee Center and Curated Experiences: Accelerate taxonomy driven content discovery&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;June 15&lt;/p&gt;&lt;h2 id=&quot;new-folks&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06-13/#new-folks&quot; class=&quot;heading-anchor&quot;&gt;New Folks&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Lui Iacobellis, hello. I was delight to find &lt;a href=&quot;https://www.youtube.com/playlist?list=PLmE7KGV9-I4tHVS_L-AqnKBPDOJ64zfuL&quot; rel=&quot;noopener&quot;&gt;all the content you have on YouTube&lt;/a&gt;. He came up with his &lt;a href=&quot;https://www.youtube.com/watch?v=ZuUgm9jQOe8&quot; title=&quot;How To Create A Dashboard In ServiceNow&quot; rel=&quot;noopener&quot;&gt;How To Create A Dashboard In ServiceNow&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/R28sutzIMQ-650.webp 650w, https://jace.pro/img/R28sutzIMQ-960.webp 960w, https://jace.pro/img/R28sutzIMQ-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/R28sutzIMQ-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/R28sutzIMQ-650.jpeg 650w, https://jace.pro/img/R28sutzIMQ-960.jpeg 960w, https://jace.pro/img/R28sutzIMQ-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Joshua Roberson seems excited to get into the ServiceNow space. I’m excited to have him Check out this post.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/YEy0DUJCw2-451.webp 451w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/YEy0DUJCw2-451.jpeg&quot; alt=&quot;Whiteboard with text, Hire Attitude. Train Skill.&quot; title=&quot;Hire Attitude Train Skill&quot; width=&quot;451&quot; height=&quot;332&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Hire Attitude Train Skill&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6938556519760191488/&quot; rel=&quot;noopener&quot;&gt;Kyle Kennedy found Ashley Snyder’s Next UI Themes article&lt;/a&gt; to be incredible helpful. Good job Ashley and thanks for sharing Kyle.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/FFo2NBAbGq-566.webp 566w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/FFo2NBAbGq-566.jpeg&quot; alt width=&quot;566&quot; height=&quot;354&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;fun-content&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06-13/#fun-content&quot; class=&quot;heading-anchor&quot;&gt;Fun Content&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Mark Scott found a Lombardo in the wild at a Celtics game!&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/4taH_Zu9_Q-450.webp 450w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/4taH_Zu9_Q-450.jpeg&quot; alt width=&quot;450&quot; height=&quot;344&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Earl Duque is signing about ServiceNow on TikTok.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/lHv96e-h9T-487.webp 487w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/lHv96e-h9T-487.jpeg&quot; alt=&quot;Man in home with boom mic signing on the Internet&quot; title=&quot;Earl Duque singing on TikTok&quot; width=&quot;487&quot; height=&quot;851&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Earl Duque singing on TikTok&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Scoped Metrics Fail</title>
      <link href="https://jace.pro/blog/scoped-metrics-fail/" />
      <updated>2022-06-11T00:00:00Z</updated>
      <id>https://jace.pro/blog/scoped-metrics-fail/</id>
      <content type="html">
				&lt;p&gt;This has been in my queue for a bit to figure out.&lt;/p&gt;&lt;p&gt;I tried this again with a fresh scoped application and this is not currently possible to do entirely within a scope.&amp;nbsp; At some point you need to either shim in access to a script include or create something in global.&lt;/p&gt;&lt;p&gt;I’ll walk through the working solution for whatever poor soul happens across this.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a scoped application.&lt;/li&gt;&lt;li&gt;Create a table called “Content”&lt;/li&gt;&lt;li&gt;Add two fields, “Title” (string), “Stage” (choice)&lt;/li&gt;&lt;li&gt;Give Stage a few choices.&lt;/li&gt;&lt;li&gt;We’re done in the scope.&lt;/li&gt;&lt;li&gt;Switch to global&lt;/li&gt;&lt;li&gt;Copy the rule “metric events”, and point it to your scoped table.&lt;/li&gt;&lt;li&gt;That’s it.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now I feel like I need to argue with myself.&lt;/p&gt;&lt;p&gt;“Come on, it can’t be impossible.”&lt;/p&gt;&lt;p&gt;Okay, lets walk through the last 3 hours of my life.&lt;/p&gt;&lt;h1 id=&quot;the-business-rule&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/scoped-metrics-fail/#the-business-rule&quot; class=&quot;heading-anchor&quot;&gt;The business rule&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I created a scope, table, copied the business rule, “metrics events”.&lt;/p&gt;&lt;p&gt;Created a Fix Script to test running this quickly.&lt;/p&gt;&lt;h2 id=&quot;glidescriptrecordutil-is-not-available-in-scopes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/scoped-metrics-fail/#glidescriptrecordutil-is-not-available-in-scopes&quot; class=&quot;heading-anchor&quot;&gt;GlideScriptRecordUtil is not available in scopes.&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;So this was used to get the fields that changed.&amp;nbsp; Okay some work and I got a working scoped version here.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getChangedFieldNames&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;gr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; elements &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElements&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; elements&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; size&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ge &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; elements&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ge&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;changes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ge&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Once that’s added to the business rule we can call it instead of &lt;code&gt;GlideScriptRecordUtil&lt;/code&gt;.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//var gru = new GlideScriptRecordUtil.get(current);&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//var fieldsChanged = gru.getChangedFieldNames();&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; fieldsChanged &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getChangedFieldNames&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;addactivequery-is-not-available-in-scopes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/scoped-metrics-fail/#addactivequery-is-not-available-in-scopes&quot; class=&quot;heading-anchor&quot;&gt;addActiveQuery is not available in scopes.&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Okay updated the `getDefinitions` function to use gr.addQuery(‘active’, ‘true’);&lt;/p&gt;&lt;h2 id=&quot;glidedbobjectmanagergettables-is-not-available-in-scope&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/scoped-metrics-fail/#glidedbobjectmanagergettables-is-not-available-in-scope&quot; class=&quot;heading-anchor&quot;&gt;GlideDBObjectManager.getTables() is not available in scope.&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;There’s a replacement&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tables &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideTableHierarchy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then when you would have called tables before you call &lt;code&gt;tables.getTables();&lt;/code&gt;&lt;/p&gt;&lt;h2 id=&quot;metricupdate-is-not-available-or-found-for-scope&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/scoped-metrics-fail/#metricupdate-is-not-available-or-found-for-scope&quot; class=&quot;heading-anchor&quot;&gt;metric.update is not available or found for scope.&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;So either I don’t know how to give permission to generate a global event OR I need to create a scoped version of the event and trigger it.&lt;/p&gt;&lt;p&gt;Created a the scoped version of the event and updated the &lt;code&gt;gs.eventQueue&lt;/code&gt; line to&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eventQueue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&#39;x_8821_testmetric.metric.update&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  fields&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_mod_count&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  &lt;span class=&quot;token string&quot;&gt;&#39;metric_update&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;At this point you have a working rule that &lt;strong&gt;should&lt;/strong&gt; work if you can get the event to process.&amp;nbsp; Since this is a different script I’m breaking this up here.&lt;/p&gt;&lt;h1 id=&quot;the-script-action&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/scoped-metrics-fail/#the-script-action&quot; class=&quot;heading-anchor&quot;&gt;The Script Action&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Created a copy of the script action that processes &lt;code&gt;metric.update&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Because it’s async, created another fix script and emulated running the code there.&lt;/p&gt;&lt;h2 id=&quot;glidedbobjectmanagergettables-not-available-in-scope&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/scoped-metrics-fail/#glidedbobjectmanagergettables-not-available-in-scope&quot; class=&quot;heading-anchor&quot;&gt;GlideDBObjectManager.getTables not available in scope&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We solved this before, so just solved that the same way.&amp;nbsp; Well nearly, I passed in a table since I was having some other problem with my fix script.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//var tables = GlideDBObjectManager.getTables(current.getTableName());&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tables &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideTableHierarchy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tables&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTables&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nail in the coffin is next.&lt;/p&gt;&lt;h2 id=&quot;gliderecordrollback-not-available-in-scope&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/scoped-metrics-fail/#gliderecordrollback-not-available-in-scope&quot; class=&quot;heading-anchor&quot;&gt;GlideRecordRollback not available in scope&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I don’t see a way around this unless someone reverse engineers how the &lt;code&gt;toVersion&lt;/code&gt; function works.&amp;nbsp; I looked and didn’t find anything.&lt;/p&gt;&lt;p&gt;If anyone else wants to try this please have it and comment on the &lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=966e14621b824814d01143f6fe4bcbd7&quot; rel=&quot;noopener&quot;&gt;thread&lt;/a&gt; here so I can follow along with my ???.&lt;/p&gt;&lt;h1 id=&quot;references&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/scoped-metrics-fail/#references&quot; class=&quot;heading-anchor&quot;&gt;References&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=966e14621b824814d01143f6fe4bcbd7&quot; rel=&quot;noopener&quot;&gt;Original Post&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/csh?version=latest&amp;amp;topicname=c_MetricDefinitionSupport&quot; rel=&quot;noopener&quot;&gt;Docs on Metric Definitions that say create a rule&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Final Business Rule in global.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;executeRule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; previous &lt;span class=&quot;token comment&quot;&gt;/*null when async*/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;queueMetricUpdate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;queueMetricUpdate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;    
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gru &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;  &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideScriptRecordUtil&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; fieldsChanged &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gru&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getChangedFieldNames&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getDefinitions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fieldsChanged&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	fields &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      fields &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;field &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;,&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      fields &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;[&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; fields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eventQueue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;metric.update&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
                    current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
                    fields&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
                    current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_mod_count&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
                    &lt;span class=&quot;token string&quot;&gt;&#39;metric_update&#39;&lt;/span&gt;
                   &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getDefinitions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideAggregate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;metric_definition&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addActiveQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tables &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; GlideDBObjectManager&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTables&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTableName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tables&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;field&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fields&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;groupBy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;field&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; previous&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Better Links - A share item from Casey Barela</title>
      <link href="https://jace.pro/blog/better-links-a-share-item-from-casey-barela/" />
      <updated>2022-06-09T00:00:00Z</updated>
      <id>https://jace.pro/blog/better-links-a-share-item-from-casey-barela/</id>
      <content type="html">
				&lt;p&gt;Copying links in ServiceNow isn’t terrible but it could be better.&lt;/p&gt;&lt;p&gt;Casey B. must have felt that way too because he made it better.&lt;/p&gt;&lt;p&gt;This share item, &lt;a href=&quot;https://developer.servicenow.com/connect.do#!/share/contents/3931356_copy_quick_link?v=1.0&amp;amp;t=PRODUCT_DETAILS&quot; rel=&quot;noopener&quot;&gt;Copy Quick Link&lt;/a&gt;, adds a UI Action on the task table to copy a more descriptive link to the current item.&lt;/p&gt;&lt;p&gt;I made a video going over this too, check it out.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FM8cIVFPkjk&quot; title=&quot;Video Title&quot; rel=&quot;noopener&quot;&gt;&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>When to Scope</title>
      <link href="https://jace.pro/blog/when-to-scope/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/when-to-scope/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;What is the post about?&lt;/strong&gt;&lt;br&gt;When to Scope&lt;br&gt;&lt;strong&gt;What things would help with writing the post&lt;/strong&gt;&lt;/p&gt;&lt;h1 id=&quot;service-nows-stance&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/when-to-scope/#service-nows-stance&quot; class=&quot;heading-anchor&quot;&gt;Service-now’s Stance&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;According to the&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/docs/DOC-7746&quot; rel=&quot;noopener&quot;&gt;community&lt;/a&gt;;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;When should you build an app under global scope versus private application scope?&lt;/p&gt;&lt;p&gt;There are two use cases when considering application scope: extending an existing app or creating a custom app from scratch. If you are extending or modifying an existing global scope application and the changes are having a high impact on other applications, then leave the change in the global scope. However, if the changes are going to have less impact to other applications, then the modifications can be done as a scoped app.&lt;/p&gt;&lt;p&gt;When you are creating a new application from scratch, you should be creating it as a scoped app. ServiceNow’s product strategy is to develop more and more scoped apps to make it easier for customers to deploy the application and to simplify future upgrades. Also, backing out changes to scoped apps is much simpler and can be done with a single push of a button.&lt;/p&gt;&lt;/blockquote&gt;&lt;h1 id=&quot;thoughts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/when-to-scope/#thoughts&quot; class=&quot;heading-anchor&quot;&gt;Thoughts&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Generally it looks like Servicenow has broken up things in the scoped applications by function or business unit, e.g.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Guided Setup&lt;/li&gt;&lt;li&gt;Knowledge Management - Service Portal&lt;/li&gt;&lt;li&gt;Service Portal Surveys&lt;/li&gt;&lt;li&gt;Human Resources&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That’s the precident Servicenow has set.&lt;/p&gt;&lt;p&gt;The pro’s and cons of by function and business unit are such&lt;/p&gt;&lt;h2 id=&quot;business-unit&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/when-to-scope/#business-unit&quot; class=&quot;heading-anchor&quot;&gt;Business Unit&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pro&lt;/th&gt;&lt;th&gt;Con&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Easy to tell what needs to be updated based on the ask&lt;/td&gt;&lt;td&gt;Hard to expand to othre area’s if some functionality needs to be shared.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Having&lt;/td&gt;&lt;td&gt;--&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h1 id=&quot;notes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/when-to-scope/#notes&quot; class=&quot;heading-anchor&quot;&gt;Notes&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;Our dev team is a little gun-shy when it comes to scoped apps. Do you have a written policy about what goes in a new scoped app?&lt;br&gt;e.g. Our team is concerned about a future state where our drop-down of scoped apps is 200-items long. (edited)&lt;br&gt;I’m looking for a decision matrix of when to go scope, when to stay global.&lt;br&gt;Like if you’re extending&amp;nbsp;&lt;code&gt;incident&lt;/code&gt;, stay Global because it’s already in global. - Jarod M&lt;/p&gt;&lt;p&gt;taht line i think is everyones question&lt;br&gt;sn’s done it at a business unit with HR&lt;br&gt;I’d follow suit w/ SN where you make an app per unit, if all units are going to use said table add it to some core app - Jace&lt;/p&gt;&lt;p&gt;We’re leaning towards our IT solution hierarchy. if it’s a separate product, then it’s separated in the CMDB.&lt;br&gt;that’s our current draft policy - Jarod M&lt;/p&gt;&lt;p&gt;im so confused - jace&lt;/p&gt;&lt;p&gt;We have SN as a Business Service.&lt;br&gt;We also have SN-Incident as a Business Service that is a&amp;nbsp;&lt;code&gt;module of&lt;/code&gt;&amp;nbsp;the root SN. This has separate ownership, etc…&lt;br&gt;so if we’re going to track something as a new product (e.g. “Advanced Reporting App”) as a Business Service (in the CMDB), we will make it a new scoped app. (edited)&lt;br&gt;That, or if there’s a security/performance concern, it can be in a scope.&lt;br&gt;That’s our draft policy. I was curious how other teams decide when to put enhancement (new functionality) requests in scope - Jarod M&lt;/p&gt;&lt;p&gt;right but, where is the line drawn, is an application considered just a form on the catalog, or a net new table? what if the catalog item needs data from a net new table? - Jace&lt;/p&gt;&lt;p&gt;Me and&amp;nbsp;&lt;a href=&quot;https://github.com/Rolf&quot; rel=&quot;noopener&quot;&gt;@Rolf&lt;/a&gt;&amp;nbsp;were talking about the other side of this issue too, When to use great discussion to have but then a few of us have made them and still struggling on how to maintain . clone ect. So maybe these questions would be a great addition to the TechNow were were hoping for over in #lchh - kcimpulse&lt;/p&gt;&lt;p&gt;i guess if you looking for how others are doing it. we have no process around it. we have a “marketing” app scope, and some weirdly named other unit scope - jace&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/docs/DOC-7746&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/docs/DOC-7746&lt;/a&gt;&lt;br&gt;When should you build an app under global scope versus private application scope?&lt;br&gt;There are two use cases when considering application scope: extending an existing app or creating a custom app from scratch. If you are extending or modifying an existing global scope application and the changes are having a high impact on other applications, then leave the change in the global scope. However, if the changes are going to have less impact to other applications, then the modifications can be done as a scoped app.&lt;br&gt;When you are creating a new application from scratch, you should be creating it as a scoped app. ServiceNow’s product strategy is to develop more and more scoped apps to make it easier for customers to deploy the application and to simplify future upgrades. Also, backing out changes to scoped apps is much simpler and can be done with a single push of a button. - Jarod M&lt;/p&gt;&lt;p&gt;We are using them pretty liberally here. When we upgraded to Istanbul earlier this year we decided to prioritize developing in scoped apps. Our main motivation was to make the upgrade process smoother (less conflicts on upgrade!) - rolf&lt;/p&gt;&lt;p&gt;Do you have a naming convention (so they are sorted in the dropdown)? - Jarod M&lt;/p&gt;&lt;p&gt;Only for Scoped Apps in which we’re creating a Service Catalog Category, where we preface it with an SC&lt;br&gt;other than that it’s just search, but we only have around 35 apps right now so it’s not a huge deal - rolf&lt;/p&gt;&lt;p&gt;We are doing the Abvr for the team name - Because the OCD in me hates the scope being in the same long table name as the name of the table. Like We made an Investment application. So I might have made it INV but didnt want the table name being INV_Investment (edited) - kcimpulse&lt;/p&gt;&lt;p&gt;Even with 200 apps though I don’t think we’d be running into any naming conflicts. The list is sorted by creation date so most of the time the stuff you want to work on is on top&lt;br&gt;While there’s definitely some confusing aspects at first with scoped app dev, it’s been worth it for our team to make the switch to primarily working out of global. Making a large scale application while knowing that you can always uninstall and be back to PDI functionality is really nice. I think it’ll help us as we scale… right now we are a small team of 4 (3 devs and a manager). - rolf&lt;/p&gt;&lt;p&gt;Great video@chrismaloy very appreciated and good timing on a few discussions we have been having -&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=DLqkDxGVLbE&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=DLqkDxGVLbE&lt;/a&gt;&amp;nbsp;- kcimpulse&lt;/p&gt;&lt;p&gt;Thanks&amp;nbsp;&lt;a href=&quot;https://github.com/kcimpulse&quot; rel=&quot;noopener&quot;&gt;@kcimpulse&lt;/a&gt;! The video is a little old but still relevant. Thank you for the shout out. - chrismaloy&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;What is “Application Scoping”?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I don’t like the name “Application Scoping”. It’s more like a workspace.&lt;/li&gt;&lt;li&gt;It’s a way of collecting application files together that do a specific a function.&lt;/li&gt;&lt;li&gt;That function may be a full blow app e.g. invoice management&lt;/li&gt;&lt;li&gt;That also may be minor additive changes to out of box apps or integrations, or utility apps not even needing a data model (e.g. tables)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;What does the the Scoped Application Model do for me?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Design and Runtime Protection&lt;/li&gt;&lt;li&gt;Universally enforced namespace&lt;/li&gt;&lt;li&gt;Contextual Development&lt;/li&gt;&lt;li&gt;Runtime Application Separation&lt;/li&gt;&lt;li&gt;Installation and Un-installation&lt;/li&gt;&lt;li&gt;Public and Private API definitions&lt;/li&gt;&lt;li&gt;Table level data access controls&lt;/li&gt;&lt;li&gt;Dependency Tracking&lt;/li&gt;&lt;li&gt;Delegated Development&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Easy Migration Tools to move things from Global.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;New Changes&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>ServiceNow does not use their own Surveys, do you know why?</title>
      <link href="https://jace.pro/blog/servicenow-does-not-use-their-own-surveys-do-you-know-why/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenow-does-not-use-their-own-surveys-do-you-know-why/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;What is the post about?&lt;/strong&gt;&lt;br&gt;#ServiceNow doens’t use their own survey system for webinars. Lets be honest, the only folks using this are for task closures… but It could be so much better. Why can’t you use it in place of SurveyMonkey, Typeform and Google Forms&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What things would help with writing the post&lt;/strong&gt;&lt;br&gt;&lt;a href=&quot;https://twitter.com/jacebenson/status/1156661749552209920&quot; rel=&quot;noopener&quot;&gt;https://twitter.com/jacebenson/status/1156661749552209920&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Using uibModel</title>
      <link href="https://jace.pro/blog/using-uibmodel/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/using-uibmodel/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;What is the post about?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What things would help with writing the post&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;openModal&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;modalInstance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $uibModal&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;templateUrl&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;ticket-modal.html&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;controllerAs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;modalC&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token function-variable function&quot;&gt;controller&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; modalC &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                modalC&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;modalInstance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;modalInstance&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                modalC&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;action &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; action&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                modalC&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;action&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                modalC&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                modalC&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;record &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;recordId&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                modalC&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;action_reason &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;//modalC.fnSubmit = c.submitModal(action,modalC.record,modalC.action_reason);&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;tahnk t1mb0b&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Useful reports on variables</title>
      <link href="https://jace.pro/blog/useful-reports-on-variables/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/useful-reports-on-variables/</id>
      <content type="html">
				&lt;h2 id=&quot;wheres-the-data-stored&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-reports-on-variables/#wheres-the-data-stored&quot; class=&quot;heading-anchor&quot;&gt;Where’s the data stored&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Type&lt;/th&gt;&lt;th&gt;Table&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Record Producer&lt;/td&gt;&lt;td&gt;question_answer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Catalog Item&lt;/td&gt;&lt;td&gt;sc_item_option_mtom&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MRVS&lt;/td&gt;&lt;td&gt;sc_multi_row_question_answer&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;what-do-you-do-with-the-data&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-reports-on-variables/#what-do-you-do-with-the-data&quot; class=&quot;heading-anchor&quot;&gt;What do you do with the data&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;If variable options are just not used, is it safe to exclude them or assume the popular is the default? This could have big wins for UX.&lt;/p&gt;&lt;p&gt;If items are not used is it safe to just remove the item etc. etc.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Upgrade like a pro!</title>
      <link href="https://jace.pro/blog/upgrade-like-a-pro/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/upgrade-like-a-pro/</id>
      <content type="html">
				&lt;p&gt;See if mhz opinion is worth taking&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;These days I modify the OOB. Because the sheer amount of code base change since we went live with Helsinki is staggering. It isn’t a viable option to blindly keep using our custom code thru an upgrade because of the vast number of changes and fixes that are coming in each upgrade. Eg. I extended DemandUtil with LLUHDemandUtil in order to customize one method. So I had to modify a business rule to make it call my extended class. Come upgrade time there’s no telling &lt;em&gt;(1)&lt;/em&gt; whether my extended method will/should still continue to work, in light of new process changes and new/updated bus.rules, &lt;em&gt;(2)&lt;/em&gt; how the overridden method may have changed, &lt;em&gt;(3)&lt;/em&gt; how the rest of DemandUtil has changed (ie. do I still need this customization? Or is something else needed to achieve it?)&lt;br&gt;For every upgrade impact, you ALWAYS need a reminder that will force you to examine &lt;em&gt;each&lt;/em&gt; of those three things. Can I just temporarily ignore the overridden methods or classes? No. Even if my overrides do continue to work (in the capacity they were designed) I’ll miss new functionality. This might &lt;em&gt;seem&lt;/em&gt; okay, if user’s would not notice. But its likely &lt;em&gt;they will&lt;/em&gt; notice because there are new platform portal pages and dashboards and PA metrics, all sorts of user-facing stuff that comes with each upgrade and depends on you integrating the new code for its proper function. This has occurred at such pace that I don’t extend things anymore.&lt;br&gt;IMO the simplest way is just modify the OOB, and use the upgrade monitor/diff engine as your reminder. Because we &lt;em&gt;must&lt;/em&gt; check all three of those steps above, for our process to keep providing the mixture of working customizations and new features. They’ve been dumping changes into the system at mad pace, but not fast enough that we can make our customers wait for them. So it seems we’ll always have this comparison process.&lt;br&gt;&lt;em&gt;DISCLAIMER:&lt;/em&gt; &lt;em&gt;I don’t have ATF tests, which if I did, might actually be able to provide some level of comfort that things will keep working. But I would still need to do steps 2-3 regardless.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Understanding the ServiceNow Cloud Architecture</title>
      <link href="https://jace.pro/blog/understanding-the-servicenow-cloud-architecture/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/understanding-the-servicenow-cloud-architecture/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=JTYWyw0v8R4&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=JTYWyw0v8R4&lt;/a&gt;&lt;/p&gt;&lt;h1 id=&quot;ccb0853-demystifying-the-servicenow-cloud-architecture-and-scaling&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/understanding-the-servicenow-cloud-architecture/#ccb0853-demystifying-the-servicenow-cloud-architecture-and-scaling&quot; class=&quot;heading-anchor&quot;&gt;CCB0853 - Demystifying the ServiceNow Cloud: Architecture and Scaling&lt;/a&gt;&lt;/h1&gt;
 			</content>
    </entry><entry>
      <title>Show your value, show a chargeback</title>
      <link href="https://jace.pro/blog/show-your-value-show-a-chargeback/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/show-your-value-show-a-chargeback/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;What is the post about?&lt;/strong&gt;&lt;br&gt;Implementing chargebacks&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What things would help with writing the post&lt;/strong&gt;&lt;/p&gt;&lt;h1 id=&quot;implementing-chargebacks&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/show-your-value-show-a-chargeback/#implementing-chargebacks&quot; class=&quot;heading-anchor&quot;&gt;Implementing Chargebacks&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;start-with-speaking&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/show-your-value-show-a-chargeback/#start-with-speaking&quot; class=&quot;heading-anchor&quot;&gt;Start with speaking&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Talk in terms that you’re providing these forms, and customizations at your business’s cost but talk about things in a way to be clear, there is a cost.&lt;/p&gt;&lt;p&gt;E.g.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;We will customize that form, it will take ~ x points or ~ x hours.&lt;br&gt;Today we don’t charge other units for this work.&lt;br&gt;In time these requests will need to provide a return of investment greator than the cost of development&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;start-with-showback&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/show-your-value-show-a-chargeback/#start-with-showback&quot; class=&quot;heading-anchor&quot;&gt;Start with showback&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Once you start talking that way, determine what the cost actually is.&lt;br&gt;Identify Rate of pay per hour or per point based on average of staff or some arbitrary number&lt;/p&gt;&lt;p&gt;Use estimated points/hours to show estimated cost, use actual points/hours to actual cost.&lt;/p&gt;&lt;p&gt;Continue to provide work even if it’s at a loss during this time.&lt;/p&gt;&lt;h2 id=&quot;implement-chargeback&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/show-your-value-show-a-chargeback/#implement-chargeback&quot; class=&quot;heading-anchor&quot;&gt;Implement Chargeback&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Now that this work has been shown to have cost and what a return on investment would be.&lt;br&gt;Start using that data.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>ServiceNow Developer Survey Results</title>
      <link href="https://jace.pro/blog/servicenow-developer-survey-results/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenow-developer-survey-results/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/blog.do?p=/tags/developer-survey/&quot; rel=&quot;noopener&quot;&gt;https://developer.servicenow.com/blog.do?p=/tags/developer-survey/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Write about this.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Resources</title>
      <link href="https://jace.pro/blog/resources/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/resources/</id>
      <content type="html">
				&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tools&lt;/th&gt;&lt;th&gt;Labs + Learning&lt;/th&gt;&lt;th&gt;Community&lt;/th&gt;&lt;th&gt;Documentation&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://bootsnipp.com/forms&quot; rel=&quot;noopener&quot;&gt;Bootstrap Form Builder&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/knowledge18&quot; rel=&quot;noopener&quot;&gt;K18&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/servicenow&quot; rel=&quot;noopener&quot;&gt;StackOverflow&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.servicenow.com/&quot; rel=&quot;noopener&quot;&gt;Developer&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://workflow.jace.pro&quot; rel=&quot;noopener&quot;&gt;Workflow Diagrammer&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/creatorcon18&quot; rel=&quot;noopener&quot;&gt;K18 CreatorCon&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://reddit.com/r/servicenow&quot; rel=&quot;noopener&quot;&gt;Reddit&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://docs.servicenow.com/&quot; rel=&quot;noopener&quot;&gt;Docs&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://code.jace.pro&quot; rel=&quot;noopener&quot;&gt;Code Collab&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/knowledge19&quot; rel=&quot;noopener&quot;&gt;K19&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.meetup.com/pro/servicenowdevprogram/&quot; rel=&quot;noopener&quot;&gt;Meetups&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://hi.service-now.com/styles/heisenberg/styleguide/docs/index.html&quot; rel=&quot;noopener&quot;&gt;Style Guide&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/jacebenson/servicenow-code&quot; rel=&quot;noopener&quot;&gt;code search&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/naw19&quot; rel=&quot;noopener&quot;&gt;Now @ Work &#39;19&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://discord.gg/QaMwnGd&quot; rel=&quot;noopener&quot;&gt;Discord&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://hi.service-now.com/styles/retina_icons/retina_icons.html&quot; rel=&quot;noopener&quot;&gt;Retina Icons&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://dev-labs.io/&quot; rel=&quot;noopener&quot;&gt;Dev-Labs.io&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/knowledge2020&quot; rel=&quot;noopener&quot;&gt;K20&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://sndevs.slack.com/&quot; rel=&quot;noopener&quot;&gt;Slack&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://code.angularjs.org/1.5.3/docs/api&quot; rel=&quot;noopener&quot;&gt;Angular 1.5.x&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://sndocs.jace.pro/&quot; rel=&quot;noopener&quot;&gt;ServiceNow Versions&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/knowledge2021&quot; rel=&quot;noopener&quot;&gt;K21&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.servicenow.com/app.do#!/share&quot; rel=&quot;noopener&quot;&gt;Share&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://getbootstrap.com/docs/3.3/components/&quot; rel=&quot;noopener&quot;&gt;Bootstrap 3.3&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://sndocs.jace.pro/&quot; rel=&quot;noopener&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/knowledge2022&quot; rel=&quot;noopener&quot;&gt;K22&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/events/&quot; rel=&quot;noopener&quot;&gt;Upcoming Events&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://angular-ui.github.io/bootstrap/&quot; rel=&quot;noopener&quot;&gt;UI Bootstrap&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://codesnipnow.netlify.app&quot; rel=&quot;noopener&quot;&gt;CodeSnipNow&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp&quot; rel=&quot;noopener&quot;&gt;Now Learning&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://info.servicenow.com/LiveOnServiceNow-ITSM&quot; rel=&quot;noopener&quot;&gt;IT Events&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://sn.jace.pro/&quot; rel=&quot;noopener&quot;&gt;Unofficial Docs&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://sn.jace.pro/properties&quot; rel=&quot;noopener&quot;&gt;Unofficial Props&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Reports that earn their keep</title>
      <link href="https://jace.pro/blog/reports-that-earn-their-keep/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/reports-that-earn-their-keep/</id>
      <content type="html">
				&lt;p&gt;Add reports that actually have actionable output;&lt;br&gt;e.g.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;[ ]&amp;nbsp;Trend on catalog item&lt;/li&gt;&lt;li&gt;[ ]&amp;nbsp;Service Account transactions&lt;/li&gt;&lt;li&gt;[ ]&amp;nbsp;Login/Logout events&lt;/li&gt;&lt;li&gt;[ ]&amp;nbsp;Performance of Event Processing per Hour&lt;/li&gt;&lt;li&gt;[ ]&amp;nbsp;Transaction Log Performance by Type&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://youtu.be/1onAf1WCW2M&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/1onAf1WCW2M&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://youtu.be/ytI9JL4ifjU&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/ytI9JL4ifjU&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Making killer emails</title>
      <link href="https://jace.pro/blog/making-killer-emails/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/making-killer-emails/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;What is the post about?&lt;/strong&gt;&lt;br&gt;Using MJML for emails.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What things would help with writing the post&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://mjml.io/templates/receipt-email&quot; rel=&quot;noopener&quot;&gt;https://mjml.io/templates/receipt-email&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://mjml.io/try-it-live/BkYkzL-G4&quot; rel=&quot;noopener&quot;&gt;https://mjml.io/try-it-live/BkYkzL-G4&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A few years ago I was working with someone on setting up an email series from ServiceNow to let folks know they are due to replace their computer. They were very concerned with how the email worked. That was how I came across MJML. MJML is an amazing framework to generate better supported HTML for all email clients. &lt;a href=&quot;https://caniuse.email/&quot; rel=&quot;noopener&quot;&gt;Email clients are still the wild west&lt;/a&gt; when it comes to controlling how an email works.&lt;/p&gt;&lt;p&gt;Okay, one thing my first amazing boss in tech told me was about writing emails. She said “Short and concise is what you want”. She wasn’t wrong. Emails subjects are the first or second things folks see. You need to make it clear and that email NEEDS to have an ACTIONABLE item.&lt;/p&gt;&lt;p&gt;You can choose to send non-actionable emails but if you’re like me you just ignore those messages. At a high level here’s the X things you need to do to make a great email.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Get their attention with a concise subject.&lt;/li&gt;&lt;li&gt;Make it clear what action you want them to take.&lt;/li&gt;&lt;li&gt;Make it meaningful.&lt;/li&gt;&lt;li&gt;Make it look nice!&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;concise-subjects&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/making-killer-emails/#concise-subjects&quot; class=&quot;heading-anchor&quot;&gt;Concise Subjects&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Depending on the goal of the email (imagine cancel a meeting, schedule a meeting, ask a question, share a critical detail, get an approval).&lt;/p&gt;&lt;p&gt;If the readers have to click into the email you just wasted some time. Sometimes you need to say more but then you can do that in the body, but the reader should know what they are getting into.&lt;/p&gt;&lt;p&gt;Sometimes that email is a multifactor authentication email, that should contain the code in the subject. I don’t want to click that email to get it.&lt;/p&gt;&lt;h2 id=&quot;clear-call-to-action&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/making-killer-emails/#clear-call-to-action&quot; class=&quot;heading-anchor&quot;&gt;Clear Call to Action&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Coming back to what the goal is, your email should have ONE. An email is effectively a tool to just get someone to take some action. If you’re not expecting an action, why are you sending the email?&lt;/p&gt;&lt;h2 id=&quot;make-it-meaningful&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/making-killer-emails/#make-it-meaningful&quot; class=&quot;heading-anchor&quot;&gt;Make it Meaningful&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I’m interested in ServiceNow, RedwoodJS, Design and family stuff. If I get an email about lip balm, I aint opening that. If I get an email that doesn’t provide some provide insight about one of those topics or doesn’t apply to me. Think about hte “Incident has been updated” emails where it is just a link. That’s silly. It might not even be actionable. It’s a waste of time.&lt;/p&gt;&lt;h2 id=&quot;make-is-look-nice&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/making-killer-emails/#make-is-look-nice&quot; class=&quot;heading-anchor&quot;&gt;Make is Look Nice&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;There’s three kinds of emails you want to send. Automated and hand-written, and automated hand-written.&lt;/p&gt;&lt;p&gt;Hand-written emails should be plaintext and be written by you to convey a point or ask something of the reader.&lt;/p&gt;&lt;p&gt;Automated emails should look nice, feel free to use images and HTML to make this look great.&lt;/p&gt;&lt;p&gt;Automated hand-written should be sent automatically but should be plaintext and replies should be handled by a person.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Host static sites on ServiceNow</title>
      <link href="https://jace.pro/blog/host-static-sites-on-servicenow/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/host-static-sites-on-servicenow/</id>
      <content type="html">
				&lt;p&gt;How can you do this?&lt;br&gt;I know ajb, slusher and nerius do this with their hugo blog. But there must be an easier way.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Export to CSV (Custom)</title>
      <link href="https://jace.pro/blog/export-to-csv-custom/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/export-to-csv-custom/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;What is the post about?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Exporting to a custom CSV format. There’s probably a better way to do this. Here’s a way I’ve done it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What things would help with writing the post&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Export to CSV &lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; attachment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideSysAttachment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Number,Name&#92;n&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;incident&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;true&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	data &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;number &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;,&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;caller_id&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
incident &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;incident&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
incident&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;85071a1347c12200e0ef563dbb9a71c1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Gets the record I want to attach the file too&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; newFile &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; attachment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;incident&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Incidents.csv&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;text/csv&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Dialogs</title>
      <link href="https://jace.pro/blog/dialogs/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/dialogs/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;What is the post about?&lt;/strong&gt;&lt;br&gt;Notification Dialogs&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What things would help with writing the post&lt;/strong&gt;&lt;/p&gt;&lt;h1 id=&quot;ui-notification-vs-notification-dialogs&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dialogs/#ui-notification-vs-notification-dialogs&quot; class=&quot;heading-anchor&quot;&gt;UI Notification vs Notification Dialogs&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;To figure out what to use and when really is going to come down to each specific situation, but I’ll go through my thoughts on what these are, how to use them, and why I favor one over another.&amp;nbsp; To do this lets introduce our contenders.&amp;nbsp; On the left we have the quick and dirty, to the point, not always clean UI Notifications.&amp;nbsp; On the right we have the attention grabbing, mouse-taking, extensions exist to block Notification Dialogs.&lt;/p&gt;&lt;h2 id=&quot;ui-notifications-what-they-are-and-when-to-use-them&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dialogs/#ui-notifications-what-they-are-and-when-to-use-them&quot; class=&quot;heading-anchor&quot;&gt;UI Notifications, what they are and when to use them&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;By on the left I mean first.&amp;nbsp; So UI Notifications for me have been a progression for debugging.&amp;nbsp; I almost always use some sort of logging of UI Notification to test some problematic script.&amp;nbsp; Way back when&amp;nbsp;I used&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Window/alert&quot; rel=&quot;noopener&quot;&gt;alerts&lt;/a&gt;&amp;nbsp;because&amp;nbsp;&lt;a href=&quot;https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#5473193&quot; rel=&quot;noopener&quot;&gt;Internet Explorer didn’t support console log for debugging&lt;/a&gt;&amp;nbsp;but that was a long time ago. Then I used started using&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/app.do#!/api_doc?v=jakarta&amp;amp;id=r_GS-addInfoMessage_O&quot; rel=&quot;noopener&quot;&gt;gs.addInfoMessage&lt;/a&gt;&amp;nbsp;because it wasn’t as “In your face.”&amp;nbsp; Then Servicenow was nice enough to&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/app.do#!/api_doc?v=jakarta&amp;amp;id=r_GlideFormShowFieldMsg_String_String_String&quot; rel=&quot;noopener&quot;&gt;g_form.showFieldMsg&lt;/a&gt;. They had error and information styles.&lt;/p&gt;&lt;p&gt;The only UI Notifications in Servicenow are the following and are used these ways;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;gs.addInfoMessage (server) and&amp;nbsp;gs.addErrorMessage (server)&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;When you have a message from the server, perhaps when the record is “Awaiting User Info” and you want it to be more clear, this can be done to show a message at the top of the screen.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://gitlab.com/jacebenson/sndocs/blob/master/sources/jakarta/5/scripts/doctype/GlideForm14.js#L1826&quot; rel=&quot;noopener&quot;&gt;client g_form.showFieldMsg()&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;When a field changes, you may clear the messages for the field, then check if it’s valid, if not, show a field message.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://gitlab.com/jacebenson/sndocs/blob/master/sources/jakarta/5/scripts/classes/doctype/NotificationMessage.js&quot; rel=&quot;noopener&quot;&gt;NotificationMessage (client)&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;This is what triggers when you change update sets.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;why-are-notification-dialogs-are-important&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dialogs/#why-are-notification-dialogs-are-important&quot; class=&quot;heading-anchor&quot;&gt;Why are notification dialogs are important?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Using the right type of notification dialog is important to convey the message to your users. Most the time I believe these are just a distraction or waste of a click, however sometimes they are necessary to inform the user.&amp;nbsp; There are a log of these and you can make them look nice.&amp;nbsp; The issue with the&lt;/p&gt;&lt;p&gt;I also have used GlideDialogWindow, GlideWindow, and GlideModal in place of the alerts and confirmation messagebut they are all essentially the same except they work slightly differently.&lt;/p&gt;&lt;p&gt;Available notification dialogs today.&lt;/p&gt;&lt;p&gt;Examples of the notification dialogs.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;spModal - Just a wrapper to uibModal&lt;/li&gt;&lt;li&gt;uibModal -&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/thread/247907#1059129&quot; rel=&quot;noopener&quot;&gt;uibModal&lt;/a&gt;&lt;/li&gt;&lt;li&gt;SweetAlerts -&amp;nbsp;&lt;a href=&quot;https://t4t5.github.io/sweetalert/&quot; rel=&quot;noopener&quot;&gt;sweetAlert&lt;/a&gt;&lt;/li&gt;&lt;li&gt;GlideModal -&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/app.do#!/api_doc?v=helsinki&amp;amp;id=c_GlideModalClientSideV3API&quot; rel=&quot;noopener&quot;&gt;glideModal&lt;/a&gt;&lt;/li&gt;&lt;li&gt;GlideWindow&lt;/li&gt;&lt;li&gt;GlideDialogWindow&lt;/li&gt;&lt;li&gt;Native - Alerts/Dialog/Confirm&lt;/li&gt;&lt;li&gt;AddInfoMessage&lt;/li&gt;&lt;li&gt;AddErrorMessage&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Using the right type of dialog window is important to convey the message to your users. Most the time I believe any distraction or waste of a click. However sometimes as much as you recommend against sometimes you got to do things you don’t like. Like making a pop up window. Might as well make it look nice.&lt;/p&gt;&lt;p&gt;&lt;code&gt;/scripts/classes/doctype/GlideModal.js&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Any client-side library the browser needs -has to be shipped to the browser-. Now, by default ServiceNow will bundle these into -includes files and send them down all appended together, but we _also- put a marker in that gives you the original filename and where you can access it directly when we do that.&lt;/p&gt;&lt;p&gt;So you can use the ‘search all files’ feature of Chrome (or the equivalent in other browsers) to find references to what you’re interested in. When you find the definition of said thing, see if it’s in an _includes.js file&lt;/p&gt;&lt;p&gt;If so, scroll up to the closest Resources tag, and it should tell you where to go find that file by itself.&lt;br&gt;In this case, I loaded the Incident form, and found the definition in&amp;nbsp;&lt;code&gt;js_includes_last_doctype.js&lt;/code&gt;&amp;nbsp;(edited)&lt;br&gt;So I just scrolled up a tiny bit and got the direct URL out of the _includes file&lt;br&gt;If the modal is just going to submit to an existing form, you could use GlideModalForm instead (that takes a title, a table name, and a callback for when the submit is successful) and that handles closing the modal and whatnot for you.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Debugging inbound emails</title>
      <link href="https://jace.pro/blog/debugging-inbound-emails/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/debugging-inbound-emails/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;What is the post about?&lt;/strong&gt;&lt;br&gt;Inbound Action debugging&lt;br&gt;Inbound Email debugging&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What things would help with writing the post&lt;/strong&gt;&lt;br&gt;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sys_kb_id=eb556f1287cd7c003fff83bdff434d46&quot; rel=&quot;noopener&quot;&gt;Source&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.youtube.com/watch?list=PLCOmiTb5WX3o-8pchYsG4DuyvrDXjbgjd&amp;amp;v=KX0b-MrTDpY&quot; rel=&quot;noopener&quot;&gt;Youtube&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If emails are not received or processed as expected,&lt;br&gt;it is important to identify the root cause. The following&lt;br&gt;steps help understand the inbound email process as well&lt;br&gt;as guide you through troubleshooting common issues.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;A message is sent from a customer’s email such as Microsoft Outlook, Hotmail, or Gmail.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Email is delivered to a mail server.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The ServiceNow instance polls the email server every two minutes to download sent messages.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Verify if the instance is configured to receive emails&lt;/li&gt;&lt;li&gt;Identify if the scheduled job (POP Reader) in an error state&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Confirm the scheduled job (POP Reader) is running.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Note: Polling time is configurable and may vary by instance.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Emails are received in the ServiceNow instance and processed.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Emails are stuck in the inbox&lt;/li&gt;&lt;li&gt;Validate the inbound email action is performed&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Confirm the email is processed by the instance.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Cancelling a flow</title>
      <link href="https://jace.pro/blog/cancelling-a-flow/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/cancelling-a-flow/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;What is the post about?&lt;/strong&gt;&lt;br&gt;Cancelling Workflows&lt;br&gt;&lt;strong&gt;What things would help with writing the post&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Something almost always asked for and rarely delivered is the ability to cancel a requested item. I’ll try to explain why this is so difficult and how I’ve suggested implementing this.&lt;/p&gt;&lt;p&gt;Why is this difficult? The problem is not with the actual canceling the requested item. It’s because asking groups to undo what they did is not a simple statement.&lt;/p&gt;&lt;p&gt;Take for example the following workflow. There’s an approval and two tasks.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/C50RyY4COf-648.webp 648w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/C50RyY4COf-648.jpeg&quot; alt=&quot;cancelling-a-flow&quot; width=&quot;648&quot; height=&quot;72&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Say this item gets cancelled before “Create email” is complete. Do we assume someone needs to check if the email was created but not activated, or just make a task to remove the AD account. Do we need to inform the approval chain?&lt;/p&gt;&lt;p&gt;This is a pretty simple example, but should show some of the issues with trying to cancel an item. I’m of the opinion that I think there are two ways to broadly address this, and one way to specifically address it.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;For each task updated (sys_mod_count&amp;gt;0) create a task to undo work done in task #.&lt;/li&gt;&lt;li&gt;Create a task to the group to undo all work done from this ritm#.&lt;/li&gt;&lt;li&gt;For specific have a path in your workflow waiting for the cancel and depending where the workflow is, create appropriate tasks to cancel this item completely.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The first option will require less involvement from each group to set up, but may find some tasks don’t make sense. Imagine you have a request to make a doctors account in Epic. Sometimes the folks who make the account don’t give the roles. So if you had two tasks one to create the account and another to give the roles. If the group who made the account got a task to “undo” the account, the roles couldn’t be removed.&lt;/p&gt;&lt;p&gt;The second option requires you to identify a single group who is primary owner for the group (which has other great benefits but I’m not going to go into those now). That has some office politics attached and more often then not if this is done I’ll bet a number of non service now items are owners of automated or complex items.&lt;/p&gt;&lt;p&gt;The third option would only work for items where the cancelling was thought through at the time the item was sized or after a conversation came up to clear up questions. Where this is different from the first option is this will create very specific tasks per the workflow. The first option would always make “undo” tasks.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Alternatives to the attachment API in ServiceNow</title>
      <link href="https://jace.pro/blog/alternatives-to-the-attachment-api-in-servicenow/" />
      <updated>2022-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/alternatives-to-the-attachment-api-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;Storage in ServiceNow is expensive. Because of that, I’d encourage you to AVOID this for your work’s budget. That being said, if you find you need to upload attachments programtically, this post might be helpful as these ways aren’t clearly defined in the other sources.&lt;/p&gt;&lt;p&gt;There’s three ways to upload attachments to ServiceNow.&lt;/p&gt;&lt;h3 id=&quot;rest-attachment-api&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/alternatives-to-the-attachment-api-in-servicenow/#rest-attachment-api&quot; class=&quot;heading-anchor&quot;&gt;REST Attachment API&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The &lt;a href=&quot;https://docs.servicenow.com/search?q=attachment%20api&quot; rel=&quot;noopener&quot;&gt;Attachment API&lt;/a&gt; is probably the one most will use. It works generally how you would expect, you can get the file content, meta data, post a new file, delete a file. One thing to note. When creating a file you must have a valid table and sys_id that will have the file.&lt;/p&gt;&lt;h3 id=&quot;web-services-soap&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/alternatives-to-the-attachment-api-in-servicenow/#web-services-soap&quot; class=&quot;heading-anchor&quot;&gt;Web Services (soap)&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is not recommended, ServiceNow recommends the REST Attachment API.&lt;/p&gt;&lt;p&gt;Like the REST Attachment API, this also says it requires a table and sys_id albeit, but that isn’t true. So you can attach things to random places like how catalog item attachments get created.&lt;/p&gt;&lt;h3 id=&quot;related-uploads&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/alternatives-to-the-attachment-api-in-servicenow/#related-uploads&quot; class=&quot;heading-anchor&quot;&gt;Related Uploads&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Sometimes you don’t only want to upload a file but you also want to tranform the data in the file. There’s a special endpoint to handle that as Josh Nerius wrote a few years ago;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;[attachment api] can be used to attach a file to a record in ServiceNow, but it does not facilitate loading/transforming attached data.&lt;/p&gt;&lt;p&gt;Instead, take a look at this page on the docs site: Post CSV or Excel files directly to an import set. This allows you to upload an attachment to a special endpoint that will then load the attached data into an Import Set table and Transform it.&lt;/p&gt;&lt;p&gt;Before posting the file, you must first set up an Import Set and Transform map. Here’s a post that explains the basics: Getting Started with Import Sets.&lt;/p&gt;&lt;p&gt;In summary, you will need to:&lt;/p&gt;&lt;p&gt;Create an Import Set / Transform Map&lt;br&gt;Use the special sys_import.do endpoint with the parameters described above to upload the file - &lt;a href=&quot;https://www.servicenow.com/community/developer-forum/send-attachment-using-rest-api/m-p/1486913/highlight/true#M143839&quot; rel=&quot;noopener&quot;&gt;Josh Nerius 2017&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;sources&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/alternatives-to-the-attachment-api-in-servicenow/#sources&quot; class=&quot;heading-anchor&quot;&gt;Sources&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0546294&quot; rel=&quot;noopener&quot;&gt;https://hi.service-now.com/kb_view.do?sysparm_article=KB0546294&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenow.com/community/developer-forum/send-attachment-using-rest-api/m-p/1486913/highlight/true#M143839&quot; rel=&quot;noopener&quot;&gt;https://www.servicenow.com/community/developer-forum/send-attachment-using-rest-api/m-p/1486913/highlight/true#M143839&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/vancouver-api-reference/page/integrate/inbound-soap/reference/r_AttachmentCreatorSOAPWebService.html&quot; rel=&quot;noopener&quot;&gt;https://docs.servicenow.com/bundle/vancouver-api-reference/page/integrate/inbound-soap/reference/r_AttachmentCreatorSOAPWebService.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/vancouver-api-reference/page/integrate/inbound-rest/concept/c_AttachmentAPI.html&quot; rel=&quot;noopener&quot;&gt;https://docs.servicenow.com/bundle/vancouver-api-reference/page/integrate/inbound-rest/concept/c_AttachmentAPI.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>What is a shard and how can I find the one this table is on?</title>
      <link href="https://jace.pro/blog/what-is-a-shard-and-how-can-i-find-the-one-this-table-is-on/" />
      <updated>2022-06-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-a-shard-and-how-can-i-find-the-one-this-table-is-on/</id>
      <content type="html">
				&lt;p&gt;I have this code snippet;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// The following script (or variant thereof) can be used in &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// /sys.scripts.do or in a server-side script to determine&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// the current shard for a table. &lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;printCurrentShard&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysevent&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;printCurrentShard&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;pTableName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_table_rotation&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pTableName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
    gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;=&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pTableName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 
  gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
  &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tre &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
Packages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;snc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;db&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replicate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;TableRotationExtensions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; extension &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tre&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tablename &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; extension&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTableName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
      gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Error getting current shard for table &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;finally&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
      gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;The current shard of table &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; is &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; tablename&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Reporting with Fiscal calenders</title>
      <link href="https://jace.pro/blog/reporting-with-fiscal-calenders/" />
      <updated>2022-06-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/reporting-with-fiscal-calenders/</id>
      <content type="html">
				&lt;p&gt;Write about fiscal calenders&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=ccb2cf21dbd8dbc01dcaf3231f961970&quot; rel=&quot;noopener&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.servicenow.com/community/now-platform-forum/fiscal-calendar-reporting-throughout-the-instance/m-p/1165954/page/2&quot; rel=&quot;noopener&quot;&gt;https://www.servicenow.com/community/now-platform-forum/fiscal-calendar-reporting-throughout-the-instance/m-p/1165954/page/2&lt;/a&gt;&lt;/p&gt;&lt;p&gt;W﻿hen you encounter them, how to set them up and why you might be doing this&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Reporting on multiple sets of data in one report</title>
      <link href="https://jace.pro/blog/reporting-on-multiple-sets-of-data-in-one-report/" />
      <updated>2022-06-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/reporting-on-multiple-sets-of-data-in-one-report/</id>
      <content type="html">
				&lt;p&gt;Add an additional dataset to a report — Report Designer&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/csh?version=latest&amp;amp;topicname=t_AddAnAdditionalDataSet&quot; rel=&quot;noopener&quot;&gt;https://docs.servicenow.com/csh?version=latest&amp;amp;topicname=t_AddAnAdditionalDataSet&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Performance Troubleshooting</title>
      <link href="https://jace.pro/blog/performance-troubleshooting/" />
      <updated>2022-06-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/performance-troubleshooting/</id>
      <content type="html">
				&lt;p&gt;Might just be a page of links.&lt;/p&gt;&lt;p&gt;milligna Today at 22:58&lt;br&gt;Anyone got any good resources for investigating performance drops across the platform? We’re a bigger instance with 6 nodes, but we’re seeing some real performance drops lately and we need to find some metrics or performance history data to support tightening up some of our performance holes (for example, we have a security team who take advantage of the fact that our CSV extract limit is 500k rows…)&lt;br&gt;jace 5 minutes ago&lt;br&gt;these are the worst&lt;br&gt;jace 5 minutes ago&lt;br&gt;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0516495&quot; rel=&quot;noopener&quot;&gt;https://hi.service-now.com/kb_view.do?sysparm_article=KB0516495&lt;/a&gt;&lt;br&gt;jace 4 minutes ago&lt;br&gt;there’s so much to look at for these kinds of issues.&lt;br&gt;jace 3 minutes ago&lt;br&gt;looks like theres… a bigger resource page w/specific tells&lt;br&gt;jace 3 minutes ago&lt;br&gt;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0829067&quot; rel=&quot;noopener&quot;&gt;https://hi.service-now.com/kb_view.do?sysparm_article=KB0829067&lt;/a&gt;&lt;br&gt;jace 1 minute ago&lt;br&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=e61d22e5dbd0dbc01dcaf3231f9619fd&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=e61d22e5dbd0dbc01dcaf3231f9619fd&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What is the post about?&lt;/strong&gt;&lt;br&gt;Debugging Performance issues&lt;br&gt;&lt;strong&gt;What things would help with writing the post&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=0c3c6661dbd0dbc01dcaf3231f961947&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=0c3c6661dbd0dbc01dcaf3231f961947&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=c35c2aa1dbd0dbc01dcaf3231f961972&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=c35c2aa1dbd0dbc01dcaf3231f961972&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0516495&quot; rel=&quot;noopener&quot;&gt;Performance troubleshooting guide&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Including data in a scoped application, why and how?</title>
      <link href="https://jace.pro/blog/including-data-in-a-scoped-application-why-and-how/" />
      <updated>2022-06-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/including-data-in-a-scoped-application-why-and-how/</id>
      <content type="html">
				&lt;p&gt;Scoped apps -&lt;br&gt;How to save data in a scoped app?&lt;/p&gt;&lt;p&gt;Extend sys_meta table.&lt;/p&gt;&lt;p&gt;Int he past there was a ui action&lt;br&gt;and before that there was a dictionary attribute&lt;/p&gt;&lt;p&gt;Source:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=0TT6hhrBDdo&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=0TT6hhrBDdo&lt;/a&gt;&amp;nbsp;44 minutes in.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Extension Points</title>
      <link href="https://jace.pro/blog/extension-points/" />
      <updated>2022-06-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/extension-points/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/knowledge19/CCW1630&quot; rel=&quot;noopener&quot;&gt;https://developer.servicenow.com/connect.do#!/event/knowledge19/CCW1630&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Post about extension points…&lt;/p&gt;&lt;p&gt;Mhz matt a great tldr about this.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;mhz&lt;br&gt;TIL: How scripted extension points work.&lt;br&gt;BENEFIT: You can define a script include where the same methods have different implementations for different circumstances.&lt;/p&gt;&lt;p&gt;OVERVIEW:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;In the [sys_extension_point] table, define a script include to serve as interface definition (method signatures and their return types).&lt;/li&gt;&lt;li&gt;On the record you made in step #1, use “Create Implementation” button to generate a copy of the interface script include, then edit the generated file to handle a specific circumstance.&lt;br&gt;you can do this multiple times to create alternate versions of the script include with same method names but different implementations.&lt;br&gt;each include has a boolean method which can tell if its applicable to the current situation.&lt;br&gt;Its “handles()” method, can initialize internal variables if needed, then returns a boolean to the caller, true if it applies or false means to ignore it.&lt;br&gt;Example: handles: function() { return record.type==“incident” };&lt;/li&gt;&lt;li&gt;Create a wrapper script to call the implemented script include(s)&lt;br&gt;wrapper asks for a list of the “extensions” for a script include name&lt;br&gt;loops thru each “extension” calling the boolean “handles()” method, followed by other desired method if handles() returns true.&lt;br&gt;USE CASE: There are many use cases but the one I’m envisioning is when there are multiple different customer integrations for the same table, each with different rules.&lt;br&gt;DISCLAIMER: I’m basing this on studying work of others. I haven’t built it myself yet. (edited)&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Communicate Like a Pro: Spoken and Written Communication</title>
      <link href="https://jace.pro/blog/communicate-like-a-pro-spoken-and-written-communication/" />
      <updated>2022-06-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/communicate-like-a-pro-spoken-and-written-communication/</id>
      <content type="html">
				&lt;h2 id=&quot;introduction&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/communicate-like-a-pro-spoken-and-written-communication/#introduction&quot; class=&quot;heading-anchor&quot;&gt;Introduction&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Speaking, Listening, and Writing are critical skills when it comes to communicating. I’ve taken some notes on the topic and here they may help you.&lt;/p&gt;&lt;h2 id=&quot;spoken-communication&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/communicate-like-a-pro-spoken-and-written-communication/#spoken-communication&quot; class=&quot;heading-anchor&quot;&gt;Spoken Communication&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;When engaging in spoken communication, it’s important to practice active listening. This means putting away phones and other distractions so that you can be fully present. Listen and understand what the other person is saying. Avoid pontificating and multi-tasking. Additionally, use open-ended to keep the conversation flowing.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://youtu.be/R1vskiVDwl4&quot; rel=&quot;noopener&quot;&gt;Celeste Headlee has outlined 10 rules&lt;/a&gt; to help ensure effective communication:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Don’t multi-task. Put away your phone or clicker. Actually be present. Do not be half in and out of the conversation.&lt;/li&gt;&lt;li&gt;Don’t pontificate - enter every conversation assuming you have something to learn.&lt;/li&gt;&lt;li&gt;Use open ended questions. Complicated questions generally get simple answers.&lt;/li&gt;&lt;li&gt;Go with the flow. When thoughts come into your mind, you need to let them go out of your mind. When you hold that thought you may stop listening.&lt;/li&gt;&lt;li&gt;If you don’t know. Say that you don’t know. Don’t make your talk cheap. Say things as if you are going on the record. Error on the the side of caution.&lt;/li&gt;&lt;li&gt;Don’t equate your experience with theirs. If they are talking about losing a family member don’t talk about the time you lost a family member. All experiences are individual. It is not about you. You don’t need to take that moment to prove how amazing you are or how much you suffered.&lt;/li&gt;&lt;li&gt;Try not to repeat yourself. It’s condescending and boring and done all the time. We keep rephrasing the point over and over, don’t do that.&lt;/li&gt;&lt;li&gt;Stay out of the weeds. People care about you. Remembering the dates and who aren’t as important as finding out what your like and what you have in common.&lt;/li&gt;&lt;li&gt;Listen.&lt;/li&gt;&lt;li&gt;Be brief.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;written-communication&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/communicate-like-a-pro-spoken-and-written-communication/#written-communication&quot; class=&quot;heading-anchor&quot;&gt;Written Communication&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;It’s important to be aware of certain techniques that can help make your writing more effective.&lt;/p&gt;&lt;p&gt;Here are some tips for ensuring effective written communication:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Strong Subjects are important.&lt;ul&gt;&lt;li&gt;Avoid the words “There” and “It” as they are better ways to refer to the subject. &lt;a href=&quot;https://www.youtube.com/watch?v=9S1UlvDHozE&quot; rel=&quot;noopener&quot;&gt;Video 5 min&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Avoid passive voice. You can do this by eliminating the nominalization(verbs becoming nouns).&lt;a href=&quot;https://www.youtube.com/watch?v=99pnFKIt2Ck&quot; rel=&quot;noopener&quot;&gt;Video 3 min&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Strong Verbs&lt;ul&gt;&lt;li&gt;Keep subjects and verbs close. &lt;a href=&quot;https://www.youtube.com/watch?v=6_gh15VTrp4&quot; rel=&quot;noopener&quot;&gt;Video 5 min&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Use the active voice. &lt;a href=&quot;https://www.youtube.com/watch?v=w3JRAfwiQA8&quot; rel=&quot;noopener&quot;&gt;Video 6 min&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Understanding active verbs and passive verbs. &lt;a href=&quot;https://www.youtube.com/watch?v=QGX8x-ymFmY&quot; rel=&quot;noopener&quot;&gt;Video 5 min&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;quiz-and-resources&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/communicate-like-a-pro-spoken-and-written-communication/#quiz-and-resources&quot; class=&quot;heading-anchor&quot;&gt;Quiz and Resources&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.mindtools.com/pages/article/newCS_99.htm&quot; rel=&quot;noopener&quot;&gt;Quiz - How Good Are Your Communication Skills?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/Communicating-Effectively-Dummies-Marty-Brounstein/dp/0764553194&quot; rel=&quot;noopener&quot;&gt;Book: Communicating Effectively for Dummies&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/communicate-like-a-pro-spoken-and-written-communication/#conclusion&quot; class=&quot;heading-anchor&quot;&gt;Conclusion&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Communicating is something we can all improve and should always work on.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>News 06/06 - More from this week</title>
      <link href="https://jace.pro/blog/news-06/06-more-from-this-week/" />
      <updated>2022-06-03T00:00:00Z</updated>
      <id>https://jace.pro/blog/news-06/06-more-from-this-week/</id>
      <content type="html">
				&lt;h2 id=&quot;save-thousands&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06/06-more-from-this-week/#save-thousands&quot; class=&quot;heading-anchor&quot;&gt;Save thousands&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;h3 id=&quot;servicenow-fundamentals-on-demand-course-and-certified-system-administrator-exam-voucher-free-till-8/31&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06/06-more-from-this-week/#servicenow-fundamentals-on-demand-course-and-certified-system-administrator-exam-voucher-free-till-8/31&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=db32f40adb7bcd901227db85ca9619c2&quot; rel=&quot;noopener&quot;&gt;ServiceNow Fundamentals on-demand course and Certified System Administrator exam voucher&amp;nbsp;free till 8/31&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;why-did-servicenow-buy-hitch&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06/06-more-from-this-week/#why-did-servicenow-buy-hitch&quot; class=&quot;heading-anchor&quot;&gt;Why did ServiceNow Buy Hitch?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://joshbersin.com/2022/06/servicenow-acquires-hitch-entering-the-skills-and-hcm-market/&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/q6UnQddNzx-650.webp 650w, https://jace.pro/img/q6UnQddNzx-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/q6UnQddNzx-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;541&quot; srcset=&quot;https://jace.pro/img/q6UnQddNzx-650.jpeg 650w, https://jace.pro/img/q6UnQddNzx-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;apex-acquires-glidefast&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06/06-more-from-this-week/#apex-acquires-glidefast&quot; class=&quot;heading-anchor&quot;&gt;Apex acquires GlideFast&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.apexsystems.com/insights/article/asgn-incorporated-acquire-glidefast-consulting-elite-servicenow-partner&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/MIJycPJ9aS-650.webp 650w, https://jace.pro/img/MIJycPJ9aS-960.webp 960w, https://jace.pro/img/MIJycPJ9aS-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/MIJycPJ9aS-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;684&quot; srcset=&quot;https://jace.pro/img/MIJycPJ9aS-650.jpeg 650w, https://jace.pro/img/MIJycPJ9aS-960.jpeg 960w, https://jace.pro/img/MIJycPJ9aS-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;upcoming-events&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06/06-more-from-this-week/#upcoming-events&quot; class=&quot;heading-anchor&quot;&gt;Upcoming Events!&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/VyoI3mmLSM-650.webp 650w, https://jace.pro/img/VyoI3mmLSM-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/VyoI3mmLSM-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;467&quot; srcset=&quot;https://jace.pro/img/VyoI3mmLSM-650.jpeg 650w, https://jace.pro/img/VyoI3mmLSM-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;great-content&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06/06-more-from-this-week/#great-content&quot; class=&quot;heading-anchor&quot;&gt;Great Content&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Robert Fedoruk&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ztews1Vltoo&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/y9byTSWz9A-650.webp 650w, https://jace.pro/img/y9byTSWz9A-960.webp 960w, https://jace.pro/img/y9byTSWz9A-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/y9byTSWz9A-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/y9byTSWz9A-650.jpeg 650w, https://jace.pro/img/y9byTSWz9A-960.jpeg 960w, https://jace.pro/img/y9byTSWz9A-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=PpWMFORUsv0&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/pk9dR5nene-650.webp 650w, https://jace.pro/img/pk9dR5nene-960.webp 960w, https://jace.pro/img/pk9dR5nene-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/pk9dR5nene-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/pk9dR5nene-650.jpeg 650w, https://jace.pro/img/pk9dR5nene-960.jpeg 960w, https://jace.pro/img/pk9dR5nene-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=s5LKO45r1eQ&quot; rel=&quot;noopener&quot;&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/QfJwPEJWva-650.webp 650w, https://jace.pro/img/QfJwPEJWva-960.webp 960w, https://jace.pro/img/QfJwPEJWva-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/QfJwPEJWva-650.jpeg&quot; alt=&quot;Titans of now themed photo with Etta Wilson on it.&quot; title=&quot;Titans of now with Etta Happy Path Wilson&quot; width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/QfJwPEJWva-650.jpeg 650w, https://jace.pro/img/QfJwPEJWva-960.jpeg 960w, https://jace.pro/img/QfJwPEJWva-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Titans of now with Etta Happy Path Wilson&lt;/figcaption&gt;&lt;/figure&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Kevin and Matt talk about good service come from on Ticket Volume podcast&lt;br&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Rc-vx4S5Arg&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/XbMtlur2ix-650.webp 650w, https://jace.pro/img/XbMtlur2ix-960.webp 960w, https://jace.pro/img/XbMtlur2ix-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/XbMtlur2ix-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/XbMtlur2ix-650.jpeg 650w, https://jace.pro/img/XbMtlur2ix-960.jpeg 960w, https://jace.pro/img/XbMtlur2ix-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Jeff pierce has been convincing clients to make intranets with Sevicenow for a decade&lt;a href=&quot;https://www.linkedin.com/posts/portalguru_the-next-generation-intranet-with-servicenow-activity-6938522673454956545-OxuH?utm_source=linkedin_share&amp;amp;utm_medium=ios_app&quot; rel=&quot;noopener&quot;&gt;&lt;/a&gt;. ServiceNow shared a video on Vimeo how Next Experience can make this great.&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/posts/portalguru_the-next-generation-intranet-with-servicenow-activity-6938522673454956545-OxuH/?utm_source=linkedin_share&amp;amp;utm_medium=ios_app&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/EWGGWIy2-K-650.webp 650w, https://jace.pro/img/EWGGWIy2-K-960.webp 960w, https://jace.pro/img/EWGGWIy2-K-1342.webp 1342w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/EWGGWIy2-K-650.jpeg&quot; alt width=&quot;1342&quot; height=&quot;715&quot; srcset=&quot;https://jace.pro/img/EWGGWIy2-K-650.jpeg 650w, https://jace.pro/img/EWGGWIy2-K-960.jpeg 960w, https://jace.pro/img/EWGGWIy2-K-1342.jpeg 1342w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Free app “freelucy” makes adding relations easier - &lt;a href=&quot;https://www.ins-pi.com/freelucy&quot; rel=&quot;noopener&quot;&gt;https://www.ins-pi.com/freelucy&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.ins-pi.com/freelucy&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/m6vyIpFKNP-650.webp 650w, https://jace.pro/img/m6vyIpFKNP-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/m6vyIpFKNP-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;482&quot; srcset=&quot;https://jace.pro/img/m6vyIpFKNP-650.jpeg 650w, https://jace.pro/img/m6vyIpFKNP-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Justin Meadows is still bringing his A-Game with Service Catalog builder content&lt;br&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ilCwE51ehpw&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/Al2sE0eR17-650.webp 650w, https://jace.pro/img/Al2sE0eR17-960.webp 960w, https://jace.pro/img/Al2sE0eR17-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/Al2sE0eR17-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/Al2sE0eR17-650.jpeg 650w, https://jace.pro/img/Al2sE0eR17-960.jpeg 960w, https://jace.pro/img/Al2sE0eR17-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Blake M wrote up a great post about Adding a pesky On-call escalations button&lt;br&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=4642275a1b3f8114c17111751a4bcb17&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/QQjbuxfUlt-584.webp 584w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/QQjbuxfUlt-584.jpeg&quot; alt width=&quot;584&quot; height=&quot;387&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;odds-and-ends&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-06/06-more-from-this-week/#odds-and-ends&quot; class=&quot;heading-anchor&quot;&gt;Odds and Ends&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Thanks Phil for noting these fun things out there.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ads in person for ServiceNow sure is nice to see. I had to spend some time to find some images of these but I did. It does really look great, good job Aoife Hall from marketing!&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6935228891103969280/&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/t3ys0FXcuf-535.webp 535w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/t3ys0FXcuf-535.jpeg&quot; alt width=&quot;535&quot; height=&quot;541&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;People are sharing their first messages with The ServiceNow Mayor, Michael Lombardo. There’s privacy stuff here but I’ve collected a few links for yall. I enjoyed all these. I made a list of links, check them out.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/posts/philgoesdeep_jacenow-philgoesdeep-swag-activity-6938279376329314304-HrWf?utm_source=linkedin_share&amp;amp;utm_medium=member_desktop_web&quot; rel=&quot;noopener&quot;&gt;Phillip Swan&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/posts/rfedoruk_looks-like-were-all-posting-michael-lombardo-activity-6938267077333979136-ZuPS&quot; rel=&quot;noopener&quot;&gt;Fedoruk&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6938506874631716864&quot; rel=&quot;noopener&quot;&gt;Fedoruk-2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/posts/portalguru_since-were-all-sharing-our-first-lombardo-activity-6938505866123853825-zl6E&quot; rel=&quot;noopener&quot;&gt;Jeff Pierce&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/posts/toptanti_glidefast-consulting-and-michael-lombardo-activity-6938145791693770752-i-15&quot; rel=&quot;noopener&quot;&gt;Top Tanti&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/posts/ryancgillespie_since-several-folks-are-posting-their-first-activity-6938149923792052225-rmqG%3E&quot; rel=&quot;noopener&quot;&gt;Ryan Gillespie&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/posts/phxdev_servicenow-activity-6938252734903042048-O-LX&quot; rel=&quot;noopener&quot;&gt;Mark Scott&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/posts/davidself3_glidefast-activity-6938232705742503937-gy6U&quot; rel=&quot;noopener&quot;&gt;David Self&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/posts/steve-reeves-85948929_congrats-michael-lombardo-and-the-glidefast-activity-6938514587080155136-ezdY&quot; rel=&quot;noopener&quot;&gt;Steve Reeves&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>News with Jace May 30th</title>
      <link href="https://jace.pro/blog/news-with-jace-may-30th/" />
      <updated>2022-05-21T00:00:00Z</updated>
      <id>https://jace.pro/blog/news-with-jace-may-30th/</id>
      <content type="html">
				&lt;h2 id=&quot;k22-amazing-content&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-with-jace-may-30th/#k22-amazing-content&quot; class=&quot;heading-anchor&quot;&gt;K22 Amazing content&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Unleash the Citizen Developer Hero in your Organization - Phil S +1, +&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=learning_course_prev&amp;amp;course_id=000ebf3edb7e0990421266f748961990&quot; rel=&quot;noopener&quot;&gt;Building a Killer Experience with UI Builder&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/z1Plvydlec-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/z1Plvydlec-650.jpeg&quot; alt=&quot;CCL1072-K22-Building a Killer Experience with UI Builder screenshot&quot; title=&quot;CCL1072-K22-Building a Killer Experience with UI Builder&quot; width=&quot;650&quot; height=&quot;399&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;CCL1072-K22-Building a Killer Experience with UI Builder&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=search&amp;amp;q=CreatorCon%202022&quot; rel=&quot;noopener&quot;&gt;Other Nowlearnings from Creatorcon&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/SJKtqnpHKc-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/SJKtqnpHKc-650.jpeg&quot; alt=&quot;CreatorCon 2022 NowLearnings&quot; title=&quot;CreatorCon 2022 NowLearnings&quot; width=&quot;650&quot; height=&quot;349&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;CreatorCon 2022 NowLearnings&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6935967944006914048/&quot; rel=&quot;noopener&quot;&gt;ES6 was announced for Tokyo!&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/2yREZtwv50-534.webp 534w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/2yREZtwv50-534.jpeg&quot; alt=&quot;ES6 is announced for ServiceNow&#39;s Tokyo Release&quot; title=&quot;ES6 is announced for ServiceNow&#39;s Tokyo Release&quot; width=&quot;534&quot; height=&quot;369&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;ES6 is announced for ServiceNow&#39;s Tokyo Release&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6935678399122219008/&quot; rel=&quot;noopener&quot;&gt;Chuck Tomasi is literally signing laptops!&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/c9F6FWWHrM-536.webp 536w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/c9F6FWWHrM-536.jpeg&quot; alt=&quot;Chuck Tomasi signing his fans laptops!&quot; title=&quot;Chuck Tomasi signing his fans laptops!&quot; width=&quot;536&quot; height=&quot;344&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Chuck Tomasi signing his fans laptops!&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6934839172729901056/&quot; rel=&quot;noopener&quot;&gt;WomenNow Meetup was great and full of amazing individuals&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/L_IRw-tFA0-533.webp 533w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/L_IRw-tFA0-533.jpeg&quot; alt=&quot;WomenNow Meetup&quot; title=&quot;WomenNow Meetup&quot; width=&quot;533&quot; height=&quot;345&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;WomenNow Meetup&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=VYFzY2q3gyA&quot; rel=&quot;noopener&quot;&gt;Jon, Dorin and Eric Schuman discuss K22&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/PI22FF2H3e-650.webp 650w, https://jace.pro/img/PI22FF2H3e-960.webp 960w, https://jace.pro/img/PI22FF2H3e-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/PI22FF2H3e-650.jpeg&quot; alt=&quot;Cask talk on K22&quot; title=&quot;Cask talk on K22&quot; width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/PI22FF2H3e-650.jpeg 650w, https://jace.pro/img/PI22FF2H3e-960.jpeg 960w, https://jace.pro/img/PI22FF2H3e-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Cask talk on K22&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;new-folks&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-with-jace-may-30th/#new-folks&quot; class=&quot;heading-anchor&quot;&gt;New Folks&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6935649028495867904/&quot; rel=&quot;noopener&quot;&gt;Frank Shorey and his POD finish week 12&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/dwqtFncKYJ-534.webp 534w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/dwqtFncKYJ-534.jpeg&quot; alt=&quot;Frank S. shares week 12 is complete!&quot; title=&quot;Frank S. shares week 12 is complete!&quot; width=&quot;534&quot; height=&quot;368&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Frank S. shares week 12 is complete!&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6935699746036617216/&quot; rel=&quot;noopener&quot;&gt;DeAnn Boudreaux on Team Now Travel delivering their project!&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/eNM6boed97-536.webp 536w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/eNM6boed97-536.jpeg&quot; alt=&quot;If the flow ain&#39;t broke don&#39;t fix it&quot; title=&quot;If the flow ain&#39;t broke don&#39;t fix it&quot; width=&quot;536&quot; height=&quot;369&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;If the flow ain&#39;t broke don&#39;t fix it&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;other-good-stuff&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/news-with-jace-may-30th/#other-good-stuff&quot; class=&quot;heading-anchor&quot;&gt;Other good stuff&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Ryal Litwiller said Darren did a great job on the &lt;a href=&quot;https://www.youtube.com/watch?v=DXGJtPBzAhk&quot; rel=&quot;noopener&quot;&gt;Creating Custom Components&lt;/a&gt; video. Related content from the &lt;a href=&quot;https://www.youtube.com/watch?v=6AXWj4RRiSs&amp;amp;list=PLRpsAi5HxghTBQ4IW7xsyGL4KYGWK25gS&quot; rel=&quot;noopener&quot;&gt;ServiceNow Ninja’s channel&lt;/a&gt; and this &lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=learning_course_prev&amp;amp;course_id=38717dd9db7320d0785e2a591396199d&quot; rel=&quot;noopener&quot;&gt;nowlearning&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/Iu6PbqgA-g-530.webp 530w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/Iu6PbqgA-g-530.jpeg&quot; alt=&quot;Creating Custom Components video from serviceportal.io&quot; title=&quot;Creating Custom Components video from serviceportal.io&quot; width=&quot;530&quot; height=&quot;344&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Creating Custom Components video from serviceportal.io&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6934983747939282945/&quot; rel=&quot;noopener&quot;&gt;Tim Woodruff discusses the FREE Tanium Integration Core app.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/VyMZQsH5nr-530.webp 530w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/VyMZQsH5nr-530.jpeg&quot; alt=&quot;Tim W. interviews on Endless Explorers re: Tanium Free App&quot; title=&quot;Tim W. interviews on Endless Explorers re: Tanium Free App&quot; width=&quot;530&quot; height=&quot;368&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Tim W. interviews on Endless Explorers re: Tanium Free App&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=NNV1Z2dLPH4&amp;amp;t=1s&quot; rel=&quot;noopener&quot;&gt;Jarod M inducted into Titans of Now&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/bN4ap8LnFz-650.webp 650w, https://jace.pro/img/bN4ap8LnFz-960.webp 960w, https://jace.pro/img/bN4ap8LnFz-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/bN4ap8LnFz-650.jpeg&quot; alt=&quot;Titans of Now featuring Jarod Mundt&quot; title=&quot;Titans of Now featuring Jarod Mundt&quot; width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/bN4ap8LnFz-650.jpeg 650w, https://jace.pro/img/bN4ap8LnFz-960.jpeg 960w, https://jace.pro/img/bN4ap8LnFz-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Titans of Now featuring Jarod Mundt&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=eEWH5KinzFE&quot; rel=&quot;noopener&quot;&gt;Horea shares how to do OAuth 2.0 auth with ServiceNow and Postman in 4 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/a19ltdQ6Le-650.webp 650w, https://jace.pro/img/a19ltdQ6Le-960.webp 960w, https://jace.pro/img/a19ltdQ6Le-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/a19ltdQ6Le-650.jpeg&quot; alt=&quot;Horea Porutiu video thumbnail showing his face, postman, and servicenow&quot; title=&quot;Horea Porutiu video thumbnail showing his face, postman, and servicenow&quot; width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/a19ltdQ6Le-650.jpeg 650w, https://jace.pro/img/a19ltdQ6Le-960.jpeg 960w, https://jace.pro/img/a19ltdQ6Le-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Horea Porutiu video thumbnail showing his face, postman, and servicenow&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;New podcasts to me.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLEXUf6YDCK-koA6Xpn62BpFzgJSC4aPnb&quot; rel=&quot;noopener&quot;&gt;Alldus Podcast&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLp1Rra7OyefU6o7u8qEeRgVOyAKqCCbyW&quot; rel=&quot;noopener&quot;&gt;XenTegra Podcast&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;New Learning channels&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCAZadwRpHjCa_oLimTC-ULA/featured&quot; rel=&quot;noopener&quot;&gt;Step Up&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCXpQCadm49L7FtPlCuOzqbA/videos&quot; rel=&quot;noopener&quot;&gt;ServiceNow 911&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/c/LearnGrowTogetherwithAtulG&quot; rel=&quot;noopener&quot;&gt;Learn &amp;amp; Grow Together With Atul G&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Next Experience Notes</title>
      <link href="https://jace.pro/blog/next-experience-notes/" />
      <updated>2021-12-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/next-experience-notes/</id>
      <content type="html">
				&lt;h2 id=&quot;now-component-concepts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#now-component-concepts&quot; class=&quot;heading-anchor&quot;&gt;Now Component Concepts&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;My rough notes on this, as I get more understanding I’ll update this… Sometimes called Tectonic or UI21&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/dev.do#!/reference/now-experience/rome/ui-framework/main-concepts/view&quot; rel=&quot;noopener&quot;&gt;https://developer.servicenow.com/dev.do#!/reference/now-experience/rome/ui-framework/main-concepts/view&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;virtual-dom&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#virtual-dom&quot; class=&quot;heading-anchor&quot;&gt;Virtual DOM&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Snabbdom: This is the virtual dom library they use under the hood - tltoulson&lt;/p&gt;&lt;h3 id=&quot;state-store-/-application-state-management&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#state-store-/-application-state-management&quot; class=&quot;heading-anchor&quot;&gt;State Store / Application State Management&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Redux is one of the most popular state stores in use and ServiceNow drew inspiration from it in creating the Now Experience Framework - tltoulson&lt;/p&gt;&lt;h3 id=&quot;actions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#actions&quot; class=&quot;heading-anchor&quot;&gt;Actions&lt;/a&gt;&lt;/h3&gt;&lt;h3 id=&quot;reducers&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#reducers&quot; class=&quot;heading-anchor&quot;&gt;Reducers&lt;/a&gt;&lt;/h3&gt;&lt;h3 id=&quot;one-direction-data-flow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#one-direction-data-flow&quot; class=&quot;heading-anchor&quot;&gt;One Direction Data Flow&lt;/a&gt;&lt;/h3&gt;&lt;h3 id=&quot;hooks&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#hooks&quot; class=&quot;heading-anchor&quot;&gt;Hooks&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;React Hooks: Seems to be the inspiration for Effects and how the DOM is tied to the state in NowX (&lt;a href=&quot;https://reactjs.org/docs/hooks-intro.html&quot; rel=&quot;noopener&quot;&gt;https://reactjs.org/docs/hooks-intro.html&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;effects&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#effects&quot; class=&quot;heading-anchor&quot;&gt;Effects&lt;/a&gt;&lt;/h3&gt;&lt;h3 id=&quot;web-components&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#web-components&quot; class=&quot;heading-anchor&quot;&gt;Web Components&lt;/a&gt;&lt;/h3&gt;&lt;h3 id=&quot;component-based-ui&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#component-based-ui&quot; class=&quot;heading-anchor&quot;&gt;Component Based UI&lt;/a&gt;&lt;/h3&gt;&lt;h3 id=&quot;shadow-dom&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#shadow-dom&quot; class=&quot;heading-anchor&quot;&gt;Shadow DOM&lt;/a&gt;&lt;/h3&gt;&lt;h2 id=&quot;tooling&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/next-experience-notes/#tooling&quot; class=&quot;heading-anchor&quot;&gt;Tooling&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://mermaid-js.github.io/mermaid-live-editor/edit#pako:eNqVVE1v2zAM_SuCTh1Q9wfkUKDN2jVAmw1xtx3mHTibsY3akiHJSYui_32ULckf8YouFzN875GUSOqVpzJDvuL7Sh7TApRhj9eJSARbgziAvnlufiW8txn9QVWiSPFMf0r478AKlDP0wE-pnnQDKRIW7CD7BrkF7GcIJetGChTGRvP2gBZllb1Pibfr-w0h8ZaR0fu-b65bEqIi_1YeR0cgiDmsp97trnIKNy78bsc633CannpbCqAQ60pqvGqNrMGUUpDAAaxD5qofKDKpHkDQqWuXySXqITZgzIPu9PHDSXHkW65u87jAts5letftcE8suuiayVKFYIjC6HcRXQ6iD5BtX5d5UuzLvFWWSrzQww-RJxPg-20zBsV6Wsb_kWfhSaPbP7mCpmBCHvG50fnpEMETsNO5ulVQ45FubLwkRGFR1Ocu4ICsBvHiMNR9HX2B0aVzB23v9luGmhWyytjR92RQW-24VcFeSN1Ql8Z5ndw1z368c65M_TVNE4_vO9hLcnvV0yCdfN5gWopuPodG3MsUqi62oUH5umNfStPIzPc3aIIgRnUoU7Qt2ght7HKOZ22cJHQpGk27nhUwAeYvxj9fhneWf2m5F3e4L5Wf8xpVDWVGb_Yr-VjCTUERE74iM8M9tJVJeCLeiNo2GY34TVYaqfhqD5XGcw5UVvwiUr4yqkVP-lwCnbB2rLe_Z2YTFA&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/q3NkzBWr5K-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/q3NkzBWr5K-650.jpeg&quot; alt=&quot;Diagram of Now Experience Framework Concepts&quot; width=&quot;650&quot; height=&quot;611&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>ServiceNow keeps buying things</title>
      <link href="https://jace.pro/blog/servicenow-keeps-buying-things/" />
      <updated>2021-08-13T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenow-keeps-buying-things/</id>
      <content type="html">
				&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Date&lt;/th&gt;&lt;th&gt;Company&lt;/th&gt;&lt;th&gt;Blurb&lt;/th&gt;&lt;th&gt;Platform Feature&lt;/th&gt;&lt;th&gt;Founders&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2025-04-03&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.businesswire.com/news/home/20250403689918/en/ServiceNow-to-Boost-CRM-Offering-With-Acquisition-of-Logik.ais-Best-in-class-AI-powered-CPQ-Solution&quot; rel=&quot;noopener&quot;&gt;Logik.ai&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AI powered Configure, Price, Quote&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;CRM&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/christopher-shutts-0622237/&quot; rel=&quot;noopener&quot;&gt;Christopher Shutts CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/fazalgupta/&quot; rel=&quot;noopener&quot;&gt;Fazal Gupta Product&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/r1chardj0nes/&quot; rel=&quot;noopener&quot;&gt;Richard Jones SVP&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2025-03-10&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://techcrunch.com/2025/03/10/servicenow-buys-moveworks-for-2-85b-to-grow-its-ai-portfolio/&quot; rel=&quot;noopener&quot;&gt;Moveworks&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AI powered Chatbot&lt;br&gt;($2.85B)&lt;/td&gt;&lt;td&gt;NowAssist&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/bhavinnicholasshah/&quot; rel=&quot;noopener&quot;&gt;Bhavin Shah CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/vnivargi/&quot; rel=&quot;noopener&quot;&gt;Vaibhav Nivargi CTO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/vsingh3/&quot; rel=&quot;noopener&quot;&gt;Varun Singh President&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/criver/&quot; rel=&quot;noopener&quot;&gt;Jiang Chen CTO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2025-02-26&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.crn.com/news/channel-news/2025/servicenow-acquires-quality-360-manufacturing-tech-from-elite-partner-advania&quot; rel=&quot;noopener&quot;&gt;Quality360&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AI Root Cause Analysis&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;MCO - After market Quailty&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/search/results/people/?keywords=elliot%20west%20advania&quot; rel=&quot;noopener&quot;&gt;Elliot West Architect&lt;/a&gt; of Advania (company)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2025-01-17&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.crn.com/news/channel-news/2025/servicenow-plans-cuein-acquisition-to-expand-agentic-ai-roadmap&quot; rel=&quot;noopener&quot;&gt;CueIn&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Agentic AI&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;NowAssist&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/mayukhbhaowal/&quot; rel=&quot;noopener&quot;&gt;Mayukh Bhaowal CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/vigneshganapathy/&quot; rel=&quot;noopener&quot;&gt;Vignesh Ganapathy Sr. Dir&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2024-07-24&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.crn.com/news/channel-news/2024/servicenow-acquires-raytion-for-genai-powered-multi-site-search&quot; rel=&quot;noopener&quot;&gt;Raytion&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Gen-AI Multi-Site Search&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;NowAssist/AI Search&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/search/results/people/?keywords=Valentin%20Richter%20servicenow&quot; rel=&quot;noopener&quot;&gt;Valentin Richter CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2024-05-18&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.computerweekly.com/news/366574463/ServiceNow-acquires-4Industry-EY-Smart-to-boost-smart-industry&quot; rel=&quot;noopener&quot;&gt;4Industry&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Operational Technology&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/lucraeskin/&quot; rel=&quot;noopener&quot;&gt;Luc Raeskin CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2023-12-19&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://techcrunch.com/2023/12/18/servicenow-dives-deeper-into-task-mining-with-latest-acquisition/&quot; rel=&quot;noopener&quot;&gt;UltimateSuite&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Task Mining&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Process Mining&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/robertsamanek000/&quot; rel=&quot;noopener&quot;&gt;Robert Samanek CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2023-05-15&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.crn.com/news/managed-services/servicenow-to-acquire-g2k-in-workflow-ai-play&quot; rel=&quot;noopener&quot;&gt;G2K&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AI Powered Platform&lt;br&gt;($500M)&lt;/td&gt;&lt;td&gt;NowAssist&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/karsten-neugebauer-9767aab7/&quot; rel=&quot;noopener&quot;&gt;Karsten Neugebauer CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/omar-el-gohary-431143b3/&quot; rel=&quot;noopener&quot;&gt;Omar El Gohary CTO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2022-10-05&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.businesswire.com/news/home/20221005005278/en/ServiceNow-to-Acquire-Observability-Innovator-Era-Software-Helping-Businesses-Turn-Data-Driven-Insights-into-Action&quot; rel=&quot;noopener&quot;&gt;Era&lt;/a&gt;&lt;/td&gt;&lt;td&gt;unified observability&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/toddpersen/&quot; rel=&quot;noopener&quot;&gt;Todd Persen CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2021-08-11&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-acquires-mapwize-aims-to-add-indoor-mapping-to-now-platform/&quot; rel=&quot;noopener&quot;&gt;Mapwize&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Indoor Mapping&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Workspace Service Delivery/Map&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/mederic/&quot; rel=&quot;noopener&quot;&gt;Mederic Morel CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2021-08-08&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-acquires-database-performance-company-swarm64/#ftag=RSSbaffb68&quot; rel=&quot;noopener&quot;&gt;Swarm64&lt;/a&gt;&lt;/td&gt;&lt;td&gt;PostgrSQL platform&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;RaptorDB&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/alfonso-martinez-de-la-torre/&quot; rel=&quot;noopener&quot;&gt;Alfonso Martinez Co-Founder&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/eivlil01/&quot; rel=&quot;noopener&quot;&gt;Eivind Liland CEO/CTO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/thomas-d-richter/&quot; rel=&quot;noopener&quot;&gt;Thomas Richter CEO/CTO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2021-05-10&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.informationweek.com/strategic-cio/servicenow-s-acquisition-spree-adds-observability&quot; rel=&quot;noopener&quot;&gt;LightStep&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Observability&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/bcronin/&quot; rel=&quot;noopener&quot;&gt;Ben Cronin Co-Founder&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/spoons/&quot; rel=&quot;noopener&quot;&gt;Daniel Spoonhower Co-Founder&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2021-03-23&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-acquires-hyderabad-based-rpa-company-intellibot/&quot; rel=&quot;noopener&quot;&gt;Intellibot&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Robotic Process Auto&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;RPA&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/raghualekh/&quot; rel=&quot;noopener&quot;&gt;Alekh Barli CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/srikanthvemulapalli/&quot; rel=&quot;noopener&quot;&gt;Srikanth Vemulapalli CTO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/kushang-moorthy-3515b717/&quot; rel=&quot;noopener&quot;&gt;Kushang Moorthy COO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2020-11-30&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-acquires-artificial-intelligence-startup-element-ai/&quot; rel=&quot;noopener&quot;&gt;Element AI&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AI Talent&lt;br&gt;($230M)&lt;/td&gt;&lt;td&gt;BigCode&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/yoshuabengio/&quot; rel=&quot;noopener&quot;&gt;Yoshua Bengio Co-Founder&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/anne-martel-mba-icd-d-041603104/&quot; rel=&quot;noopener&quot;&gt;Anne Martel Co-Founder SVP&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/nicolaschapados/&quot; rel=&quot;noopener&quot;&gt;Nicolas Chapados Co-Founder CSO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/beaudoin/&quot; rel=&quot;noopener&quot;&gt;Philippe Beaudoin Co-Founder SVP&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2020-07-01&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://techcrunch.com/2020/06/22/servicenow-to-acquire-belgian-configuration-management-startup-sweagle/&quot; rel=&quot;noopener&quot;&gt;Sweagle&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Configuration Data&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/mark-verstockt-9253a915a/&quot; rel=&quot;noopener&quot;&gt;Mark Verstockt CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/bennyvandesompele/&quot; rel=&quot;noopener&quot;&gt;Benny Van de Sompele Co-Founder&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2020-01-28&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/company/investor-relations/financials/servicenow-to-acquire-passage-ai.html&quot; rel=&quot;noopener&quot;&gt;Passage AI&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AI Platform&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/ravinraj/&quot; rel=&quot;noopener&quot;&gt;Ravi Raj CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/mathihalli/&quot; rel=&quot;noopener&quot;&gt;Madhu Mathihalli CTO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/mitultiwari/&quot; rel=&quot;noopener&quot;&gt;Mitul Tiwari CTO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2020-01-01&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/company/investor-relations/financials/servicenow-to-acquire-loom-systems.html&quot; rel=&quot;noopener&quot;&gt;Loom Systems&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AIOps Company&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Machine Learning&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/ronnyle/&quot; rel=&quot;noopener&quot;&gt;Ronny Lehmann CTO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/gabby-menachem-a28b16109/&quot; rel=&quot;noopener&quot;&gt;Gabby Menachem CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/manndror/&quot; rel=&quot;noopener&quot;&gt;Dror Mann VP Products&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-08&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://continuityinsights.com/servicenow-to-acquire-fairchild-resiliency-systems/&quot; rel=&quot;noopener&quot;&gt;Fairchild&lt;/a&gt;&lt;/td&gt;&lt;td&gt;GRC + IRM&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Business Continuity Mangement&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/aaron-callaway-a701a06/&quot; rel=&quot;noopener&quot;&gt;Aaron Callaway CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-10-23&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://blogs.servicenow.com/2019/servicenow-acquires-attivio-cognitive-search-platform.html&quot; rel=&quot;noopener&quot;&gt;Attivio&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Cognitive Search&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;AI Search&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/aliriaz/&quot; rel=&quot;noopener&quot;&gt;Ali Riaz CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/sidprobstein/&quot; rel=&quot;noopener&quot;&gt;Sid Probstein CTO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/willjohnson/&quot; rel=&quot;noopener&quot;&gt;Will Johnson CTO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-05-01&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://techcrunch.com/2019/05/13/servicenow-acquihires-mobile-analytics-startup-appsee/&quot; rel=&quot;noopener&quot;&gt;Appsee&lt;/a&gt;&lt;/td&gt;&lt;td&gt;In-App Mobile Analytics&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Mobile Analytics&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/zahib/&quot; rel=&quot;noopener&quot;&gt;Zahi Boussiba CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/yonidouek/&quot; rel=&quot;noopener&quot;&gt;Yoni Douek CTO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2018-10-01&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-acquires-friendlydata-for-natural-language-interfaces/&quot; rel=&quot;noopener&quot;&gt;FriendlyData&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Natural Language Understa&lt;br&gt;nding (?$10M)&lt;/td&gt;&lt;td&gt;Natural Language Understanding&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/alexzaytsav/&quot; rel=&quot;noopener&quot;&gt;Alex Zaytsav CTO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/alexeyzenovich/&quot; rel=&quot;noopener&quot;&gt;Alexey Zenovich Co-Founder&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/rubyway/&quot; rel=&quot;noopener&quot;&gt;Michael Rumiantsau CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2018-05-03&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-buys-ai-startup-parlo/&quot; rel=&quot;noopener&quot;&gt;Parlo&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AI Natural Language&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Natural Language Understanding&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/muralisubbarao/&quot; rel=&quot;noopener&quot;&gt;Murali Subbarao CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2018-04-01&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-beats-estimates-acquires-vendorhawk/&quot; rel=&quot;noopener&quot;&gt;VendorHawk&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Software Asset Mgmt&lt;br&gt;($25M)&lt;/td&gt;&lt;td&gt;SAM Pro&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/benkstephens/&quot; rel=&quot;noopener&quot;&gt;Ben Stephens Co-Founder&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/briangeihsler/&quot; rel=&quot;noopener&quot;&gt;Brian Geihsler CTO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/patricklowndes/&quot; rel=&quot;noopener&quot;&gt;Patrick Lowndes CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2017-10-25&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-buys-mobile-platform-startup-skygiraffe/&quot; rel=&quot;noopener&quot;&gt;SkyGiraffe&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Mobile Development&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Mobile Studio&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/boazhecht/&quot; rel=&quot;noopener&quot;&gt;Boaz Hecht CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/itay-braun/&quot; rel=&quot;noopener&quot;&gt;Itay Braun CTO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2017-10-01&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-acquires-telepathy-a-ux-ui-consulting-company-that-has-worked-with-quip-new-relic/&quot; rel=&quot;noopener&quot;&gt;Telepathy&lt;/a&gt;&lt;/td&gt;&lt;td&gt;design firm&lt;br&gt;($5M)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/takahitoiguchi/&quot; rel=&quot;noopener&quot;&gt;Takahito (Taka) Iguchi CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2017-05-17&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-buys-qlue-invests-in-buildonme-in-chatbot-expansion/&quot; rel=&quot;noopener&quot;&gt;Qlue Inc&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AI powered Virtual Agents&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Virtual Agent&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/rahim-yaseen-ba66a9/&quot; rel=&quot;noopener&quot;&gt;Rahim Yaseen CTO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2017-01-18&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-buys-dxcontinuum-to-boost-enterprise-automation-services/&quot; rel=&quot;noopener&quot;&gt;DxContinuum&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Intelligent Automation&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Machine Learning&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/baskarjayaraman/&quot; rel=&quot;noopener&quot;&gt;Baskar Jayaraman CTO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/debuchatterjee/&quot; rel=&quot;noopener&quot;&gt;Debu Chatterjee CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/govindarajankannan/&quot; rel=&quot;noopener&quot;&gt;Kannan Govindarajan VP Product&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2016-06-01&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://fortune.com/2016/06/01/servicenow-security-software-brightpoint/&quot; rel=&quot;noopener&quot;&gt;BrightPoint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Security Analtyics&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/robert-laikin-267b6b60/&quot; rel=&quot;noopener&quot;&gt;Robert Laikin CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2016-04-05&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.zdnet.com/article/servicenow-acquires-cloud-management-startup-itapp/&quot; rel=&quot;noopener&quot;&gt;ITapp&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Cloud Management&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Cloud Management&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/tahvildary/&quot; rel=&quot;noopener&quot;&gt;Andrew Tahvildary&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/brajeshgoyal/&quot; rel=&quot;noopener&quot;&gt;Brajesh Goyal CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/krugone/&quot; rel=&quot;noopener&quot;&gt;Brian Krug Founder&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/giridhar-padmanabh/&quot; rel=&quot;noopener&quot;&gt;Giri Padmanabh CTO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2015-02-25&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://itbrief.co.nz/story/servicenow-acquires-intreis-launches-new-grc-offering&quot; rel=&quot;noopener&quot;&gt;Interis&lt;/a&gt;&lt;/td&gt;&lt;td&gt;GRC Consultancy&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Unified Compliance Framework&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2014-07-09&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://en.globes.co.il/en/article-servicenow-acquires-neebula-systems-for-100m-1000953148&quot; rel=&quot;noopener&quot;&gt;Neebula Systems&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Service Availability&lt;br&gt;($100M)&lt;/td&gt;&lt;td&gt;ServiceWatch&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/yuval-cohen-55b89/&quot; rel=&quot;noopener&quot;&gt;Yuval Cohen CEO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/arielgordon/&quot; rel=&quot;noopener&quot;&gt;Ariel Gordon CTO&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://www.linkedin.com/in/shaimo/&quot; rel=&quot;noopener&quot;&gt;Shai Mohaban CTO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2013-07-09&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://xconomy.com/san-diego/2013/07/09/servicenow-acquires-dutch-provider-of-performance-analytics-software/&quot; rel=&quot;noopener&quot;&gt;Mirror42&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Business Intelligence&lt;br&gt;(not disclosed)&lt;/td&gt;&lt;td&gt;Performance Analytics&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linkedin.com/in/karelvanderpoel/&quot; rel=&quot;noopener&quot;&gt;Karel van der Poel CEO&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Thanks Allen, and Tommy LaMonte for helping me filling in these details!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title> Mirroring choices on catalog items</title>
      <link href="https://jace.pro/blog/mirroring-choices-on-catalog-items/" />
      <updated>2021-08-13T00:00:00Z</updated>
      <id>https://jace.pro/blog/mirroring-choices-on-catalog-items/</id>
      <content type="html">
				&lt;p&gt;To do this you don’t need a lot. I’ve hinted at this kind of stuff before with my&amp;nbsp;&lt;a href=&quot;https://jace.pro/post/2017-10-28-lookup-select-attributes/&quot; rel=&quot;noopener&quot;&gt;Lookup Select Attribute&lt;/a&gt;&amp;nbsp;post. Here I’ll spell it out.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Make&amp;nbsp;&lt;code&gt;category&lt;/code&gt;&amp;nbsp;variable with the following bits&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Type: Lookup select box&lt;/li&gt;&lt;li&gt;Include none: true&lt;/li&gt;&lt;li&gt;Table:&amp;nbsp;&lt;code&gt;sys_choice&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Reference Qualifier:&amp;nbsp;&lt;code&gt;name=incident^element=category^language=en^inactive=false^ORDERBYsequence&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Make&amp;nbsp;&lt;code&gt;subcategory&lt;/code&gt;&amp;nbsp;variable with the following bits&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Type: Lookup select box&lt;/li&gt;&lt;li&gt;Include none: true&lt;/li&gt;&lt;li&gt;Table:&amp;nbsp;&lt;code&gt;sys_choice&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Reference Qualifer:&amp;nbsp;&lt;code&gt;javascript: &#39;name=incident^element=subcategory^language=en^inactive=false^dependent_value=&#39; + current.variables.category&lt;/code&gt;&lt;br&gt;(note the dependent value column in your query)&lt;/li&gt;&lt;li&gt;Attributes:&amp;nbsp;&lt;code&gt;ref_qual_elements=category&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Extending User is Bad</title>
      <link href="https://jace.pro/blog/extending-user-is-bad/" />
      <updated>2021-08-13T00:00:00Z</updated>
      <id>https://jace.pro/blog/extending-user-is-bad/</id>
      <content type="html">
				&lt;p&gt;A few weeks ago extending User [&lt;code&gt;sys_user&lt;/code&gt;] came up and I had always thought, well ServiceNow did it for Customer Service Management, so it must be fine. This day however Pheedbaq explained why this is a problem and why we shouldn’t do it.&lt;/p&gt;&lt;p&gt;Here’s my understanding.&lt;/p&gt;&lt;p&gt;Let’s go with spatial bodies. For this example we’ll extend sys_user to user_martian and user_plutonian.&lt;/p&gt;&lt;p&gt;You can create a user on user_martian, they will never hav a class of sys_user.&lt;/p&gt;&lt;p&gt;If you decide that later you want user_plutonian extension, users who were made on user_martian can never also exist on user_plutonian.&lt;/p&gt;&lt;p&gt;Let’s use an example. Let’s say John is a new Citizen on Mars and moved there yesterday. You guys have a process that creates a user_martian record for him. Then you decided he’s going to move to Pluto and work from the branch there.&lt;/p&gt;&lt;p&gt;You’d need a second record because his class cannot be both user_plutonian and user_martian.&lt;/p&gt;&lt;h2 id=&quot;pheedbaqs-message-that-spurred-this&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/extending-user-is-bad/#pheedbaqs-message-that-spurred-this&quot; class=&quot;heading-anchor&quot;&gt;Pheedbaq’s message that spurred this&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;If you have: sys_user&lt;/p&gt;&lt;p&gt;contract_user extends sys_user&lt;/p&gt;&lt;p&gt;subsidiary_user extends sys_user&lt;/p&gt;&lt;p&gt;Then you create Bob who is a contract_user&lt;/p&gt;&lt;p&gt;Bob’s class will never be “sys_user”.&lt;/p&gt;&lt;p&gt;Bob can never be a “subsidiary_user”.&lt;/p&gt;&lt;p&gt;To make Bob both a contract_user and a subsidiary_user, Bob must have 2 accounts.&lt;/p&gt;&lt;p&gt;The User table should never be extended. We have had apps and guidance in the past that say “extend sys_user” and those are wrong. For ServiceNow-made apps which extend sys_user, those teams have already or are in the process of unwinding that so they don’t break future customers. The documentation should hopefully already be cleaned up, but there may be some lingering bad advice out there.&lt;/p&gt;&lt;p&gt;I didn’t mean to interrupt the LCHH; I thought posting here would be non-disruptive. Hope it wasn’t a bother.&lt;/p&gt;&lt;p&gt;-- Pheedbaq&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Activity Streams ACLs changed in Paris</title>
      <link href="https://jace.pro/blog/activity-streams-acls-changed-in-paris/" />
      <updated>2021-08-13T00:00:00Z</updated>
      <id>https://jace.pro/blog/activity-streams-acls-changed-in-paris/</id>
      <content type="html">
				&lt;p&gt;The other day Matt (mhz) was answering a question about form activity streams visiblity for emails. He had recently opened a support case and shared that on Slack.&lt;/p&gt;&lt;p&gt;Here’s my understanding of what was conveyed.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;There’s two gates to view emails on activity streams&lt;/li&gt;&lt;li&gt;The first gate is if the logged in user has roles matched with sys_property&amp;nbsp;&lt;code&gt;glide.ui.activity.email_roles&lt;/code&gt;&lt;/li&gt;&lt;li&gt;The second gate (new in Paris) leverages reader ACLs against the user.&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;Basically this is ‘2 gates to viewing an Email within the Activity Stream’, 1st gate ‘glide.ui.activity.email_roles’ will let user of the roles defined see the “Show Email Details” section regardless the content being displayed, while post-PRB1406163 (since Paris) the added logic in processor (2nd gate) will leverage email reader ACLs against the user to determine if the content can be displayed to the user or not - even the user is permitted to see the “Show Email Details” section due to his role being added into ‘glide.ui.activity.email_roles’.&lt;/p&gt;&lt;p&gt;From Dev:&lt;/p&gt;&lt;p&gt;EmailDisplayProcessor controls ability to see email body. Thus fixing PRB1406163 was about respecting the sys_email ACL when the processor loaded this email for viewing. (Meaning it has not relied on activity stream specific properties like glide.ui.activity.email_roles.)&lt;br&gt;In particular: this ‘glide.ui.activity.email_roles’ property is checked to determine whether to show the “Show Email Details” link that can be clicked. Then if the link appears, then the EmailDisplayProcessor will open and respect the sys_email ACLs from there.&lt;/p&gt;&lt;p&gt;There are 2 gates to viewing an Email within the Activity Stream. The property glide.ui.activity.email_roles is still effective and determines which roled users are able to see Emails in the Activity Stream. There are cases where not all users containing one of the roles should see every email on the target record. Consider the case where a notification generates an email containing a randomly generated password. Due to security concerns, rather than displaying the email body to all users, you might want only the recipient of the email to have read access. The OOB email read ACL specifically handles emails containing sensitive content such as the PW example, by evaluating Email Access Restriction records (sys_email_access_restriction).&lt;/p&gt;&lt;p&gt;The customer has added the ‘admin’ role to their sys_email table READ ACL, which indicates that only admins should have read access to email records. They certainly could revert the change in the Email Display processor to begin seeing emails again, but that also re-introduces the security concern that a user will be able to view an email that they shouldn’t have access to. My suggestion would be to leave the Email Display processor as is and update the email read ACL to accurately reflect who should be able to read an email record.&lt;/p&gt;&lt;p&gt;So even quick fix is reverting email processor logic to pre-Paris, but as dev said it “re-introduces the security concern that a user will be able to view an email that they shouldn’t have access to.”.&lt;/p&gt;&lt;p&gt;Please consider the suggestion from Dev - add the role of the users to the email read acl, so the users will be able to see the email records, then based on the logic of the process, they will be able to see the email content in Activity Stream (along with the “Show Email Details” section due to the defined role in ‘glide.ui.activity.email_roles’)&lt;br&gt;https://.service-now.com/nav_to.do?uri=sys_security_acl.do?sys_id=8de12cdfc0a8016701fdf6b2bdb041cb&lt;/p&gt;&lt;p&gt;Thank you Matt for sharing this!&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>TechNow Rome</title>
      <link href="https://jace.pro/blog/technow-rome/" />
      <updated>2021-07-23T00:00:00Z</updated>
      <id>https://jace.pro/blog/technow-rome/</id>
      <content type="html">
				&lt;p&gt;Feel free to edit!!! everyone!&lt;/p&gt;&lt;h1 id=&quot;now-exp&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#now-exp&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2021-07-27-technow-rome/#technow-rome&quot; rel=&quot;noopener&quot;&gt;&lt;/a&gt;Now Exp&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;CSS available on an element level.&lt;/li&gt;&lt;/ul&gt;&lt;h1 id=&quot;playbook&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#playbook&quot; class=&quot;heading-anchor&quot;&gt;playbook&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;moving to store release&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;playbook-record-generator&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#playbook-record-generator&quot; class=&quot;heading-anchor&quot;&gt;playbook record generator&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;allows an agent to enter the data before the record is created.&lt;/li&gt;&lt;li&gt;playbook + ui builder has a better intergration&lt;/li&gt;&lt;li&gt;more options to add actions at the playbook level&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;playbook-preview&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#playbook-preview&quot; class=&quot;heading-anchor&quot;&gt;playbook preview&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;improves the exp of building a playbook by allowing you to see it as you build on&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Q: Can you use SP on Now Experience?&lt;br&gt;A: No, they are different technologies.&lt;/p&gt;&lt;p&gt;SN may release now components to SP (safe harbor)&lt;/p&gt;&lt;h1 id=&quot;dev-tool-enhancements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#dev-tool-enhancements&quot; class=&quot;heading-anchor&quot;&gt;Dev Tool Enhancements&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;expanded-source-control&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#expanded-source-control&quot; class=&quot;heading-anchor&quot;&gt;Expanded Source control&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;can edit things like CSM in studio now?&lt;/li&gt;&lt;li&gt;headless testing is now possible via docker&lt;/li&gt;&lt;li&gt;servicenow cli&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;delegate-dev&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#delegate-dev&quot; class=&quot;heading-anchor&quot;&gt;delegate dev&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;admin can delegate the source control feature&lt;/li&gt;&lt;li&gt;delete app can be given to users&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;studio-enchancements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#studio-enchancements&quot; class=&quot;heading-anchor&quot;&gt;studio enchancements&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;can now create a now experience in studio&lt;/li&gt;&lt;li&gt;this allows folks w/o the app eng. studio licensines to create now exp.&#39;s&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;flow-designer&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#flow-designer&quot; class=&quot;heading-anchor&quot;&gt;flow designer&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;improved error handling&lt;/li&gt;&lt;li&gt;new simple math and string functions&lt;/li&gt;&lt;li&gt;performance of flow can be imporved by turning off logging&lt;/li&gt;&lt;li&gt;automatic variable cleaning. var_dictionary cleared after a month&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Q: Can error handling actions have access to data pills?&lt;br&gt;A: Yes&lt;/p&gt;&lt;h2 id=&quot;intergrationhub-dollar&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#intergrationhub-dollar&quot; class=&quot;heading-anchor&quot;&gt;intergrationhub $&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;now does imports (competes with import sets now - import sets reimagined - only supports data streams)&lt;/li&gt;&lt;li&gt;notifications - will tell you when you run into licensing issues&lt;/li&gt;&lt;li&gt;tls 1.2 support for fips compliance&lt;/li&gt;&lt;/ul&gt;&lt;h1 id=&quot;security&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#security&quot; class=&quot;heading-anchor&quot;&gt;security&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;multi-factor-authentication&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#multi-factor-authentication&quot; class=&quot;heading-anchor&quot;&gt;multi-factor authentication&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;adaptive authentication - contextual security?&lt;/li&gt;&lt;li&gt;certificate based authentication&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;data-exports-metrics&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#data-exports-metrics&quot; class=&quot;heading-anchor&quot;&gt;data exports metrics&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;this will let you measure whats being exported and if its sensitve&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;platform-encryption-enhancements-dollar&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#platform-encryption-enhancements-dollar&quot; class=&quot;heading-anchor&quot;&gt;platform encryption Enhancements $&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;in rome encryption now doesnt need to apply to business rules/scripts&lt;/li&gt;&lt;/ul&gt;&lt;h1 id=&quot;platform-foundation&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#platform-foundation&quot; class=&quot;heading-anchor&quot;&gt;platform foundation&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;system-logs&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-rome/#system-logs&quot; class=&quot;heading-anchor&quot;&gt;system logs&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;new fields&lt;/p&gt;&lt;ul&gt;&lt;li&gt;source (existing)&lt;/li&gt;&lt;li&gt;source package (new)&lt;/li&gt;&lt;li&gt;source application family (new)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;schedule installation of plugins and applications&lt;br&gt;Q: Can you scheduled install of update sets? A: ?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;instance scan has new scan&lt;/p&gt;&lt;ul&gt;&lt;li&gt;reactive scan (based on a specific failure)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;inbound emails actions&lt;/p&gt;&lt;ul&gt;&lt;li&gt;now can properly identify the user based on email across the extended user tables.&lt;/li&gt;&lt;li&gt;this was resolved by changing how the inbound does a match,&amp;nbsp;&lt;code&gt;cmn_notif_device&lt;/code&gt;&amp;nbsp;table to find the user.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Q: how is the health scan different then the instance scan?&lt;br&gt;A: They are not different. Well Support does a health scan, you run an instance scan.&lt;/p&gt;&lt;p&gt;Q: is instance scans performance intensive?&lt;br&gt;A: Generally no&lt;/p&gt;&lt;p&gt;Q: an interesting use for instance scan.&lt;br&gt;A: data sanity checks (verify users have managers)&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Calculating Business Durations</title>
      <link href="https://jace.pro/blog/calculating-business-durations/" />
      <updated>2021-04-20T00:00:00Z</updated>
      <id>https://jace.pro/blog/calculating-business-durations/</id>
      <content type="html">
				&lt;h1 id=&quot;calculating-business-durations&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/calculating-business-durations/#calculating-business-durations&quot; class=&quot;heading-anchor&quot;&gt;Calculating Business Durations&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;First, why is this a thing? Well companies like to list things in “business days” sometimes. I’m not sure why, but that’s the origin.&lt;/p&gt;&lt;p&gt;Sure, so now that we know why, how does this work in ServiceNow?&lt;/p&gt;&lt;p&gt;To do that you’re going to have to dig in to some code.&lt;/p&gt;&lt;p&gt;As of today, ServiceNow still uses&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/dev.do#!/reference/api/quebec/server_legacy/c_GlideSystemAPI#r_GS-dateDiff_S_S_B&quot; rel=&quot;noopener&quot;&gt;gs.dateDiff&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/dev.do#!/reference/api/quebec/server_legacy/c_GlideSystemAPI#r_GS-calDateDiff_S_S_B&quot; rel=&quot;noopener&quot;&gt;gs.calDateDiff&lt;/a&gt;&amp;nbsp;to calculate duration and business duration. See Business rule&amp;nbsp;&lt;code&gt;mark_resolved&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code&gt;mark_closed&lt;/code&gt;&amp;nbsp;on Incident. Below I’ve pasted the business rule for&amp;nbsp;&lt;code&gt;mark_closed&lt;/code&gt;.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//mark_closed business rule&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;setClosureFields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setClosureFields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// incident_state is Closed so&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 1. mark the task as inactive&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 2. set the closed by to current user if not supplied&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 3. set the closed time to now if not supplied&lt;/span&gt;
	current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;active &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;closed_by&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;closed_by &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;closed_at&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;closed_at &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nowDateTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;// Update the fields that indicate the time/duration of the incident&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// from open to close.&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// Keep track of duration as a glide_duration value (dd hh:mm:ss)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// and as a pure number of seconds.&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// Both calendar time and business time are maintained.&lt;/span&gt;
	
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dataChange &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opened_at&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;changes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
    &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;closed_at&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;changes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
    &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isValidField&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;resolved_at&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; opened &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opened_at&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; closed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;closed_at&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataChange &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;business_duration&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;business_duration &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;calDateDiff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opened&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; closed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataChange &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;business_stc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;business_stc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;calDateDiff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opened&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; closed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataChange &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;calendar_duration&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;calendar_duration &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;dateDiff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opened&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; closed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataChange &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;calendar_stc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;calendar_stc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;dateDiff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opened&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; closed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can see it’s using those old methods.&lt;/p&gt;&lt;h2 id=&quot;gsdatediff&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/calculating-business-durations/#gsdatediff&quot; class=&quot;heading-anchor&quot;&gt;gs.dateDiff&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/dev.do#!/reference/api/quebec/server_legacy/c_GlideSystemAPI#r_GS-dateDiff_S_S_B&quot; rel=&quot;noopener&quot;&gt;gs.dateDiff&lt;/a&gt;&amp;nbsp;takes two string of time in the user’s format and returns the duration between them in a ddd hh:mm:ss format. ServiceNow docs do also say;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you are working with GlideDateTime objects use the GlideDateTime subtract() method instead of dateDiff().&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I’m not sure if gs.dateDiff is available to scopes but I would not bet on it. This is an instance of “Do what I say, and not what I do.” from ServiceNow.&lt;/p&gt;&lt;h2 id=&quot;gscaldatediff&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/calculating-business-durations/#gscaldatediff&quot; class=&quot;heading-anchor&quot;&gt;gs.calDateDiff&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/dev.do#!/reference/api/quebec/server_legacy/c_GlideSystemAPI#r_GS-calDateDiff_S_S_B&quot; rel=&quot;noopener&quot;&gt;gs.calDateDiff&lt;/a&gt;&amp;nbsp;takes two string of time in the user’s format and returns the duration between them in a ddd hh:mm:ss format against the “default” schedule. I can hear you now, “Jace, what is the default schedule?” It’s not defined to me. I know it uses the 8-5 weekdays schedule (on cmn_schedule) but there are lot of&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/quebec-platform-administration/page/administer/time/reference/r_DefaultSchedules.html&quot; rel=&quot;noopener&quot;&gt;default schedules&lt;/a&gt;. ServiceNow docs do also say;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Calendars are now legacy. If Schedules are being used, see the topic Calculate Duration Given a Schedule.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I looked for this “Topic” but there isn’t a page for this. I did find a section on&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/quebec-application-development/page/script/useful-scripts/concept/c_UsefulSchedulingScripts.html&quot; rel=&quot;noopener&quot;&gt;Usefil scheduling scripts&lt;/a&gt;&amp;nbsp;that matches. Let’s look here.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Type: Before update/insert business rule&lt;br&gt;Table: Incident&lt;br&gt;Description: A Business Duration calculates the Open to Close duration on an incident based on the particular Creating and using schedules. If there is no schedule specified, the script will use the first schedule returned by the query.&lt;br&gt;Script example:&lt;br&gt;The example below sets the resolved duration when the incident state moves to resolved.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*Modified to make more readable*/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; opened_at &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opened_at&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; updated_on &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_updated_on&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; schedule_sys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;08fcd0830a0a0b2600079f56b1adb9ae&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;incident_state&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dur &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calcDurationSchedule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opened_at&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; updated_on&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;u_resolved_duration&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dur&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

 &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calcDurationSchedule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;start&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
 &lt;span class=&quot;token comment&quot;&gt;// Get the user   &lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; usr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 usr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token comment&quot;&gt;// Create schedule - pass in the sys_id of your standard work &lt;/span&gt;
 &lt;span class=&quot;token comment&quot;&gt;// day schedule and &amp;gt;pass in the users timezone&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sched &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideSchedule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;schedule_sys_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;usr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;time_zone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token comment&quot;&gt;// Get duration based on schedule/timezone &lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sched&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;duration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getGlideObject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; end&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getGlideObject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;This again seems like a case where it’s “Do as I say and not as I do.”&lt;/p&gt;&lt;h2 id=&quot;tl;dr&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/calculating-business-durations/#tl;dr&quot; class=&quot;heading-anchor&quot;&gt;TL;DR&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow uses old functions to calculate these bits.&lt;/p&gt;&lt;p&gt;Business Duration seems to use a “default” calendar of 8-5 Weekdays. An example duration might be;&lt;br&gt;Opened at: Feb 5th (Fri) at 7am&lt;br&gt;Closed at: Feb 8th (Mon) at 2pm&lt;br&gt;Duration calculated …&lt;br&gt;Feb 5th: 9 hours&lt;br&gt;Feb 6th: 0 hours&lt;br&gt;Feb 7th: 0 hours&lt;br&gt;Feb 8th: 6 hours&lt;br&gt;Total Business Duration: 15 hours.&lt;/p&gt;&lt;p&gt;Duration is the difference in time without a calendar considered. An example duration might be;&lt;/p&gt;&lt;p&gt;Opened at: Feb 5th (Fri) at 7am&lt;br&gt;Closed at: Feb 8th (Mon) at 2pm&lt;br&gt;Total Hours: 79 hours. (ServiceNow displays these in days, so 3 days 7 hours)&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Custom Domain for PDIs using Vercel</title>
      <link href="https://jace.pro/blog/custom-domain-for-pdis-using-vercel/" />
      <updated>2021-02-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/custom-domain-for-pdis-using-vercel/</id>
      <content type="html">
				&lt;h1 id=&quot;custom-domain-for-pdis-using-vercel&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-domain-for-pdis-using-vercel/#custom-domain-for-pdis-using-vercel&quot; class=&quot;heading-anchor&quot;&gt;Custom Domain for PDIs using Vercel&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I was able to do this with the help of Mav and Mike Bahr. Thanks guys!&lt;/p&gt;&lt;p&gt;First of all this fixes the redirect issues from the Netlify version. Netlify appends a slash to some endpoints. I don’t see a way to control it, Vercel lets you control how that works.&lt;/p&gt;&lt;h1 id=&quot;simple-vercel-proxy&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-domain-for-pdis-using-vercel/#simple-vercel-proxy&quot; class=&quot;heading-anchor&quot;&gt;Simple Vercel Proxy&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;This is a simple repository.&lt;/p&gt;&lt;p&gt;It’s purpose it to create a proxy to a site you own.&lt;/p&gt;&lt;h2 id=&quot;how-does-it-work&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-domain-for-pdis-using-vercel/#how-does-it-work&quot; class=&quot;heading-anchor&quot;&gt;How does it work?&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;You have a domain point to Vercel&lt;/li&gt;&lt;li&gt;Vercel has a “redirect/rewrite” rule that doesn’t redirect instead proxies&lt;/li&gt;&lt;li&gt;That’s it&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;what-do-i-have-to-do&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-domain-for-pdis-using-vercel/#what-do-i-have-to-do&quot; class=&quot;heading-anchor&quot;&gt;What do I have to do?&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;A GitHub account.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Access to your DNS&lt;/strong&gt;&amp;nbsp;for the domain to create appropriate records.&lt;/li&gt;&lt;li&gt;A&amp;nbsp;&lt;strong&gt;Vercel account&lt;/strong&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;h1 id=&quot;ok-im-ready&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-domain-for-pdis-using-vercel/#ok-im-ready&quot; class=&quot;heading-anchor&quot;&gt;Ok, I’m ready!&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;deploy-the-repo&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-domain-for-pdis-using-vercel/#deploy-the-repo&quot; class=&quot;heading-anchor&quot;&gt;Deploy the repo&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fjacebenson%2Fdev&quot; rel=&quot;noopener&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/Yw3T1mn72S-650.webp 650w, https://jace.pro/img/Yw3T1mn72S-960.webp 960w, https://jace.pro/img/Yw3T1mn72S-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/Yw3T1mn72S-650.jpeg&quot; alt=&quot;Deploy with Vercel&quot; width=&quot;1400&quot; height=&quot;434&quot; srcset=&quot;https://jace.pro/img/Yw3T1mn72S-650.jpeg 650w, https://jace.pro/img/Yw3T1mn72S-960.jpeg 960w, https://jace.pro/img/Yw3T1mn72S-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Login with GitHub, trust me.&lt;/li&gt;&lt;li&gt;Enter a project name, I called mine&amp;nbsp;&lt;code&gt;pdi-redirect&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Pick GitHub.&lt;/li&gt;&lt;li&gt;Create the repository private or public, your choice.&lt;/li&gt;&lt;li&gt;Leave the Import Project settings, they were auto-detected by Vercel, and “Deploy”.&lt;/li&gt;&lt;li&gt;Now it’s building, it’ll take about 20 seconds to build.&lt;/li&gt;&lt;li&gt;You should get a 🎉&amp;nbsp;&lt;strong&gt;CONGRATULATIONS&lt;/strong&gt;&amp;nbsp;🎉 message. It should work now.&lt;br&gt;Well, it’s redirecting to my site. Let’s fix that.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;update-the-repo-to-point-to-your-site&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-domain-for-pdis-using-vercel/#update-the-repo-to-point-to-your-site&quot; class=&quot;heading-anchor&quot;&gt;Update the repo to point to your site&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Go to your git source where that button created the repo.&lt;/li&gt;&lt;li&gt;Update the&amp;nbsp;&lt;code&gt;./_includes/layout/redirect.njk&lt;/code&gt;&amp;nbsp;file to the site you want.&lt;/li&gt;&lt;li&gt;Vercel should trigger a build and update index.html and 404.html to redirect to your site.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;set-up-the-domain&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-domain-for-pdis-using-vercel/#set-up-the-domain&quot; class=&quot;heading-anchor&quot;&gt;Set up the domain&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Now you need to set up the domain. To do that goto “Domains”,&lt;/li&gt;&lt;li&gt;It’ll ask what project you want to use, pick the one you made from #1.&lt;/li&gt;&lt;li&gt;It will show you, that your DNS is wrong. Go forth and set the dns as depicted.&lt;/li&gt;&lt;li&gt;Comeback to Vercel’s domain page and “Refresh” your domain entry. You may need to wait for your DNS to propagate.&lt;/li&gt;&lt;li&gt;That’s it.&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Technow Quebec Review</title>
      <link href="https://jace.pro/blog/technow-quebec-review/" />
      <updated>2021-01-27T00:00:00Z</updated>
      <id>https://jace.pro/blog/technow-quebec-review/</id>
      <content type="html">
				&lt;h1 id=&quot;technow-quebec-review&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#technow-quebec-review&quot; class=&quot;heading-anchor&quot;&gt;Technow Quebec Review&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;The team presenting this noted that slides had a price tag indicating if something was effectively platform, or “extra”. I’ll denote this in the title with a 💲 emoji.&lt;/p&gt;&lt;p&gt;This aired on Jan. 26th, and will be available in video sometime in March.&lt;/p&gt;&lt;h2 id=&quot;ui-builder&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#ui-builder&quot; class=&quot;heading-anchor&quot;&gt;UI Builder&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Lots of things in here, but just check the&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=xEb6-E0Xk1w&quot; rel=&quot;noopener&quot;&gt;LCHH video&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;data-classification&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#data-classification&quot; class=&quot;heading-anchor&quot;&gt;Data Classification&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Categorize fields as PII, internal, restricted, confidential&lt;/li&gt;&lt;li&gt;Quickly report on field categorization for regulatory compliance&lt;/li&gt;&lt;li&gt;Manage fields via REST and script APIs&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;now-platform-foundation-enhancements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#now-platform-foundation-enhancements&quot; class=&quot;heading-anchor&quot;&gt;Now Platform foundation enhancements&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Office 365 integration&lt;/li&gt;&lt;li&gt;Embedded Help Panel&lt;/li&gt;&lt;li&gt;User on-boarding walkthroughs&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;ai-search&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#ai-search&quot; class=&quot;heading-anchor&quot;&gt;AI Search&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Via the acquisition from&amp;nbsp;&lt;a href=&quot;https://blogs.servicenow.com/2019/servicenow-acquires-attivio-cognitive-search-platform.html&quot; rel=&quot;noopener&quot;&gt;Attivio&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;This is everywhere. Service portal, workspaces, mobile, etc.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;process-optimization-💲&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#process-optimization-%F0%9F%92%B2&quot; class=&quot;heading-anchor&quot;&gt;Process Optimization 💲&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;This shows a kind of diagram of how work is actually done in the platform.&lt;/li&gt;&lt;li&gt;Part of ITSM Enterprise and CSM Enterprise packages.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;virtual-agent-enhancements-💲&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#virtual-agent-enhancements-%F0%9F%92%B2&quot; class=&quot;heading-anchor&quot;&gt;Virtual Agent enhancements 💲&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Guided set up with topic recommendations&lt;/li&gt;&lt;li&gt;Advanced authoring tools&lt;/li&gt;&lt;li&gt;Automatically resolve incidents, actionable notifications, and password reset&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;nlu-workbench&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#nlu-workbench&quot; class=&quot;heading-anchor&quot;&gt;NLU Workbench&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;This replaces the “Model Builder”.&lt;/li&gt;&lt;li&gt;Support for 13 more languages (now at 16 total).&lt;/li&gt;&lt;li&gt;Ability to add vocabulary sources to be referenced by models&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;regression-framework-💲&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#regression-framework-%F0%9F%92%B2&quot; class=&quot;heading-anchor&quot;&gt;Regression Framework 💲&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Uses machine learning to estimate a value. e.g.&lt;br&gt;If we have 100 things done what will the time be for the 101st item.&lt;/p&gt;&lt;p&gt;Any prof or ent. package as part of artificial intelligence&lt;/p&gt;&lt;h2 id=&quot;natural-language-query-nlq-💲&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#natural-language-query-nlq-%F0%9F%92%B2&quot; class=&quot;heading-anchor&quot;&gt;Natural Language Query NLQ 💲&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;NLQ is officially released with Quebec.&lt;br&gt;This is nice as you can ask ServiceNow is common language for things.&lt;/p&gt;&lt;p&gt;E.g. How many P1’s were logged last month? Should build a report showing incident.priority=1^sys_created_on=LastMonth&lt;/p&gt;&lt;h2 id=&quot;performance-analytics-enhancements-💲&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#performance-analytics-enhancements-%F0%9F%92%B2&quot; class=&quot;heading-anchor&quot;&gt;Performance Analytics enhancements 💲&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;PA Capabilities now availabe on workspaces&lt;/li&gt;&lt;li&gt;PA now supports flexible calendars (e.g. fiscal not matching standard calendar)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;reporting-enhancements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#reporting-enhancements&quot; class=&quot;heading-anchor&quot;&gt;Reporting enhancements&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Quick calculations on specific fields&lt;/li&gt;&lt;li&gt;Tailor reporting to highlight what’s important&lt;/li&gt;&lt;li&gt;Design dynamic reports with response to questions stored on the catalog&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;mobile-experience-enhancements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#mobile-experience-enhancements&quot; class=&quot;heading-anchor&quot;&gt;Mobile Experience enhancements&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;(Jace’s note what app does this apply to? You all have 4!)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Added AI Search&lt;/li&gt;&lt;li&gt;Added Deeplink capability to apps&lt;/li&gt;&lt;li&gt;Cards now can have actionable buttons&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;mobile-agent-enhancements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#mobile-agent-enhancements&quot; class=&quot;heading-anchor&quot;&gt;Mobile Agent enhancements&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Saved Views, favorite mobile screens for quicker access&lt;/li&gt;&lt;li&gt;Field Service surveys online and offline&lt;/li&gt;&lt;li&gt;Native Knowledge KB articles&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;mobile-developer-tool-enhancements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#mobile-developer-tool-enhancements&quot; class=&quot;heading-anchor&quot;&gt;Mobile Developer Tool Enhancements&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Mobile Card builder. You can make your own cards now instead of using the pre-made designs&lt;/li&gt;&lt;li&gt;UI Rules, Apply field value calculations and UI Styling to UI elements&lt;/li&gt;&lt;li&gt;Impersonate Users&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;app-engine-studio-aes-💲-store-release&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#app-engine-studio-aes-%F0%9F%92%B2-store-release&quot; class=&quot;heading-anchor&quot;&gt;App Engine Studio (AES) 💲 (Store release)&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Not really gone into, will be topic in March TechNow.&lt;/p&gt;&lt;p&gt;Not available in PDI’s yet.&lt;/p&gt;&lt;h2 id=&quot;integrationhub-enhancements-💲&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#integrationhub-enhancements-%F0%9F%92%B2&quot; class=&quot;heading-anchor&quot;&gt;IntegrationHub enhancements 💲&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;“Simplify inbound integrations with REST API trigger”&lt;/li&gt;&lt;li&gt;Remote Process Sync allows for better ebonding (by-directional) integrations&lt;/li&gt;&lt;li&gt;Perform data mapping with modern UX for codeless ETL&lt;/li&gt;&lt;li&gt;Retrieve date easily with JDBC data stream&lt;/li&gt;&lt;li&gt;Send one or more files to your instance over SFTP&lt;/li&gt;&lt;li&gt;Choose specific MID server for your integration&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;flow-designer-enhancements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#flow-designer-enhancements&quot; class=&quot;heading-anchor&quot;&gt;Flow Designer enhancements&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;UX improvements to help citizen developers&lt;/li&gt;&lt;li&gt;Record Producers can now be submitted via Flow designer with variables&lt;/li&gt;&lt;li&gt;Flow level variables now exist (akin to workflow scratchpad)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;email-enhancements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#email-enhancements&quot; class=&quot;heading-anchor&quot;&gt;Email enhancements&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Parse email replies with per domain separators that also support regex&lt;/li&gt;&lt;li&gt;Notification common content (available to notification, and other communication channels e.g. slack, va)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;app-studio-enhancements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#app-studio-enhancements&quot; class=&quot;heading-anchor&quot;&gt;App Studio enhancements&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Some store apps can be customized (depends on app author’s settings in app)&lt;/li&gt;&lt;li&gt;Some ServiceNow apps can also be customized (depends same as above)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;dev-@-scale&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#dev-@-scale&quot; class=&quot;heading-anchor&quot;&gt;Dev @ Scale&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;APIs to install modify and rollback your changes&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;script-tracer&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#script-tracer&quot; class=&quot;heading-anchor&quot;&gt;Script Tracer&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Server side script debugging improvements&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;instance-scan&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-quebec-review/#instance-scan&quot; class=&quot;heading-anchor&quot;&gt;Instance Scan&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Scan your instance for problems with code/configuration&lt;/li&gt;&lt;li&gt;Been in the works since 2012&lt;/li&gt;&lt;li&gt;Allows for custom checks to be added&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>What is the Catalog Builder from Quebec</title>
      <link href="https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/" />
      <updated>2021-01-23T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/</id>
      <content type="html">
				&lt;h1 id=&quot;tl;dr&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#tl;dr&quot; class=&quot;heading-anchor&quot;&gt;TL;DR&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I had a stream ad-hoc with Druhv about this. It’s way longer than I had hoped but there’s just so many ways to set up this and I didn’t even hit all the features.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;This feature will save me time.&lt;br&gt;This will take work out of my backlog and enable non-admins to create catalog items for predefined templates.&lt;/li&gt;&lt;li&gt;Creating the templates takes some thought ahead of time. Thankfully, I’ve thought about this a lot in the past. See&amp;nbsp;&lt;a href=&quot;https://youtu.be/wyVLCxOtZl8?t=1059&quot; rel=&quot;noopener&quot;&gt;“The Nine Standard Workflows”&lt;/a&gt;&amp;nbsp;from Robert Fedoruk’s Titans of Now series.&lt;/li&gt;&lt;li&gt;This utility doesn’t do anything special with update sets or scopes. Do you have to have the “Catalog Builders” build in dev? No. Should you? I’m not sure.&lt;/li&gt;&lt;li&gt;There didnt appear to be any approval process to get these items published.&lt;/li&gt;&lt;li&gt;This has some limitations, but they seemed pretty minor to me.&lt;/li&gt;&lt;/ol&gt;&lt;h1 id=&quot;getting-started&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#getting-started&quot; class=&quot;heading-anchor&quot;&gt;Getting started&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I jumped in without looking at the docs and didn’t seem to have much trouble, there’s a lot here. I’ll lay out the logical steps here.&lt;/p&gt;&lt;p&gt;Before you can even try this as a “Catalog Builder”, you need a template. This isn’t the templates I’m used to in ServiceNow. This template lets users control most options about the item. Here’s the link to&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/quebec-servicenow-platform/page/product/service-catalog-management/concept/catalog-builder.html#:~:text=Limitations&quot; rel=&quot;noopener&quot;&gt;limitationsits on the lower half of the page&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;limitations&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#limitations&quot; class=&quot;heading-anchor&quot;&gt;Limitations&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;“Catalog builder does not allow creation and editing of the following entities, but they can be set in Now Platform either for a draft item or a published item that has not been checked out.”&lt;br&gt;ServiceNow Docs&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Catalog Item limitations&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Can’t set meta tags&lt;/li&gt;&lt;li&gt;Can’t use execution plans&lt;/li&gt;&lt;li&gt;Can’t deal with prices&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Variable limitations&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Can’t set Help Text&lt;/li&gt;&lt;li&gt;Can’t set default value&lt;/li&gt;&lt;li&gt;Not all variable types are available here. Most are, but some are not, notible, List Collectors, and Macros are missing.&lt;/li&gt;&lt;li&gt;Doesn’t allow editing variables with two levels of containers.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Logic limitations&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Catalog Client Scripts are not available.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Data lookup rules (maybe ref. qualifier)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Catalog UI policy (Source: AAtrey)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;On Load field (defaults to true)&lt;/li&gt;&lt;li&gt;Script field. When a catalog UI policy has a script, it does not show up in the question’s behavior settings list in the catalog builder.&lt;/li&gt;&lt;li&gt;Reverse if false field. By default, it is set to true.&lt;/li&gt;&lt;li&gt;Multiple actions. When a catalog UI policy has multiple actions, it does not show up in the question’s behavior settings list in the catalog builder.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;creating-a-template&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#creating-a-template&quot; class=&quot;heading-anchor&quot;&gt;Creating a template&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A heads up, all the choices here can be overridden on a granular basis. So you’ll probably want to be more permissive then restrictive here.&lt;/p&gt;&lt;p&gt;There’s 8 sections to these templates. Here’s the&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/quebec-servicenow-platform/page/product/service-catalog-management/task/create-cat-item-template-cat-builder.html&quot; rel=&quot;noopener&quot;&gt;official docs&lt;/a&gt;&amp;nbsp;on this, but I’ll spell it out here too.&lt;/p&gt;&lt;h3 id=&quot;template-details&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#template-details&quot; class=&quot;heading-anchor&quot;&gt;Template Details&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Template name and short description are details available when looking at the templates.&lt;/p&gt;&lt;p&gt;Template available for, dictates who can use this template.&lt;/p&gt;&lt;h3 id=&quot;details&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#details&quot; class=&quot;heading-anchor&quot;&gt;Details&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Item Name, Short description, Image, and Description will be set based on these for the “Catalog Builder”. If you want the “Catalog Builder” to come up with those details, you should leave them blank.&lt;/p&gt;&lt;h3 id=&quot;location&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#location&quot; class=&quot;heading-anchor&quot;&gt;Location&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;These catalogs and categories are the items unless you allow editing this in the overrides.&lt;/p&gt;&lt;h3 id=&quot;questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#questions&quot; class=&quot;heading-anchor&quot;&gt;Questions&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Questions only allow you include variable sets. Variables added this way cannot be removed from the item. The set can be rearranged. Here is also where you can limit the kinds of variables available.&lt;/p&gt;&lt;h3 id=&quot;settings&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#settings&quot; class=&quot;heading-anchor&quot;&gt;Settings&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Settings allows you to control the “Add to cart”, “Add to wishlist”, “Quantity”, “Hide Delivery Time”, “Hide Attachment”, “Make attachment mandatory”, and the “Submit button label”.&lt;/p&gt;&lt;h3 id=&quot;access&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#access&quot; class=&quot;heading-anchor&quot;&gt;Access&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Access is controlled strictly by User Criteria. This allows for granting and limiting by User Criteria.&lt;/p&gt;&lt;h3 id=&quot;fulfillment&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#fulfillment&quot; class=&quot;heading-anchor&quot;&gt;Fulfillment&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The fulfillment can get set to a workflow or flow designer. If you want to&lt;/p&gt;&lt;h3 id=&quot;overrides&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#overrides&quot; class=&quot;heading-anchor&quot;&gt;Overrides&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is where the “Catalog builder” can override the allowed options.&lt;/p&gt;&lt;h2 id=&quot;creating-an-item&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#creating-an-item&quot; class=&quot;heading-anchor&quot;&gt;Creating an item&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;After overrides above you’re done making the template. This means the “Catalog builder” now can use the template to make an item.&lt;/p&gt;&lt;p&gt;They can pick the template you made and set the overrides you allows and also add any number of questions here.&lt;/p&gt;&lt;h3 id=&quot;problems-i-ran-into&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#problems-i-ran-into&quot; class=&quot;heading-anchor&quot;&gt;Problems I ran into&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Making available for and not available for mandatory means they will have to set at least one user criteria in each&lt;/li&gt;&lt;li&gt;They cannot edit variable sets you’ve added but they can add them themselves&lt;/li&gt;&lt;li&gt;They cannot edit the order within the variable sets&lt;/li&gt;&lt;/ul&gt;&lt;h1 id=&quot;jaces-review&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-the-catalog-builder-from-quebec/#jaces-review&quot; class=&quot;heading-anchor&quot;&gt;Jace’s review&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Will this get used? Yes. Does it meet all the problems posed? No. Does it come with guidance how to set up citizen developers to get this catalog items and flows out there? No.&lt;/p&gt;&lt;p&gt;That beign said, it’s exciting to see the current work done.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Success with Flow Designer</title>
      <link href="https://jace.pro/blog/success-with-flow-designer/" />
      <updated>2021-01-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/success-with-flow-designer/</id>
      <content type="html">
				&lt;h1 id=&quot;success-with-flow-designer&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/success-with-flow-designer/#success-with-flow-designer&quot; class=&quot;heading-anchor&quot;&gt;Success with Flow Designer&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Here’s the requirements that drove this post.&lt;/p&gt;&lt;p&gt;✅ Create a catalog item (I can do this every day)&lt;br&gt;✅ Add a MRVS (easy peasy lemon squeezy)&lt;br&gt;✅ From a service account (sure, but MRVS and the cart api might be weird)&lt;br&gt;✅ As someone else (sure,&amp;nbsp;&lt;code&gt;gs.impersontate&lt;/code&gt;&amp;nbsp;never hurt right)&lt;br&gt;🛑 Without admin role (Um, I’m not sure about the impersonate bit)&lt;/p&gt;&lt;p&gt;This seemed like something simple at first. I created a item to track my thoughts. It had one variable set on it called “Ideas”. That variable set had two variables in it&amp;nbsp;&lt;code&gt;thought&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code&gt;order&lt;/code&gt;. I’m always thinking and needed something to test against.&lt;/p&gt;&lt;p&gt;I was told the older cart api didn’t seem to work with the MRVS. I didn’t try it I went straight for&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/dev.do#!/reference/api/paris/server/sn_sc-namespace/c_CartJSScoped&quot; rel=&quot;noopener&quot;&gt;CartJS&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;First attempt was showing this is possible from a fix script like so;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; impUser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideImpersonate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
impUser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;impersonate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;someUserSysId&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; cart &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;sn_sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;CartJS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; request &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&#39;sysparm_id&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;2edaaaec2f31e090bd54d5f62799b62b&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&#39;sysparm_quantity&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&#39;variables&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&#39;ideas&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;thought&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;This is a thought&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
        &lt;span class=&quot;token literal-property property&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;100&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; cartDetails &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cart&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;orderNow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cartDetails&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That worked but, then he brought up the issue of race conditions were multiple requests would come in at the same time. Before the problem was it would submit and work, but it would checkout as the wrong person in some cases.&lt;/p&gt;&lt;p&gt;This new problem needed a new solution.&lt;/p&gt;&lt;p&gt;Generally when you have race conditions, one way to solve this is to create a queue of sorts.&lt;/p&gt;&lt;p&gt;I suggested the tried-and-true method of using event queue and script actions to deal with this. But, that seemed more complicated.&lt;/p&gt;&lt;h1 id=&quot;enter-flow-designer&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/success-with-flow-designer/#enter-flow-designer&quot; class=&quot;heading-anchor&quot;&gt;Enter Flow Designer&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I have not been a fladvocate. It’s a new year. I thought I’d give it a go and you know what. Flow Designer suprised me by how well it worked*. I’ll walk through those steps. For you professional fladvocates, this old news.&lt;/p&gt;&lt;p&gt;High level of what I did. I knew I needed a subflow so I could call it from my scripted endpoint.&lt;/p&gt;&lt;h2 id=&quot;create-flow-designer-action-impersonate-user&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/success-with-flow-designer/#create-flow-designer-action-impersonate-user&quot; class=&quot;heading-anchor&quot;&gt;Create Flow Designer Action “Impersonate User”&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You’ll need to set up the input to take a user. That’s it.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; impUser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideImpersonate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
impUser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;impersonate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inputs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;created-a-subflow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/success-with-flow-designer/#created-a-subflow&quot; class=&quot;heading-anchor&quot;&gt;Created a Subflow&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I created a subflow. This subflow, needed a input of&amp;nbsp;&lt;code&gt;user&lt;/code&gt;&amp;nbsp;and a input array for the&amp;nbsp;&lt;code&gt;multirow variable set&lt;/code&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Create the inputs and outputs&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/bcg92bJI5Y-650.webp 650w, https://jace.pro/img/bcg92bJI5Y-960.webp 960w, https://jace.pro/img/bcg92bJI5Y-1292.webp 1292w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/bcg92bJI5Y-650.jpeg&quot; alt width=&quot;1292&quot; height=&quot;619&quot; srcset=&quot;https://jace.pro/img/bcg92bJI5Y-650.jpeg 650w, https://jace.pro/img/bcg92bJI5Y-960.jpeg 960w, https://jace.pro/img/bcg92bJI5Y-1292.jpeg 1292w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Add the “Impersontate User” action.&#92;n&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Add the Create Catalog item action.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Add Assign Subflow Outputs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Connect the pills appropriately.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Publish the subflow&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/bkq5xc6W8A-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/bkq5xc6W8A-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;289&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;In the verticle elipses (aka the thin hamburger [top right of screen]), click the “Code Snippets” button. Copy that text.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;create-your-scripted-rest-api&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/success-with-flow-designer/#create-your-scripted-rest-api&quot; class=&quot;heading-anchor&quot;&gt;Create your scripted rest api&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In here you’re going to match up the data to the subflow like so.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;/*RESTAPIRequest*/&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/*RESTAPIResponse*/&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;//expect person to request for &lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//expect array for mvrs&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; thoughts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ideas&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; now &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; inputs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      inputs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// String &lt;/span&gt;
      inputs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;ideas&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; thoughts&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Array.Object &lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sn_fd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;FlowAPI&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRunner&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;subflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;global.request_item_for_person&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;inForeground&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;withInputs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inputs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; outputs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getOutputs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; request &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; outputs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;request&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// String&lt;/span&gt;
      response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;outputs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; message &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ex&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;test-the-rest&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/success-with-flow-designer/#test-the-rest&quot; class=&quot;heading-anchor&quot;&gt;Test the REST&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Testing the rest worked great. Here’s the rest body and response;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://dev16718.service-now.com/api/8821/item&quot; rel=&quot;noopener&quot;&gt;https://dev16718.service-now.com/api/8821/item&lt;/a&gt;&lt;/p&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ca826bf03710200044e0bfc8bcbe5d89&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;ideas&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;thought&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace says adios baby!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
	  &lt;span class=&quot;token property&quot;&gt;&quot;order&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;100&quot;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;result&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;request&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;RITM0010017&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;* I still think the UI is confusing but, I don’t have feedback to fix it.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>CloudFlare Pages, Netlify, Vercel, Github Pages, and Gitlab Pages. Where to host for free?</title>
      <link href="https://jace.pro/blog/cloudflare-pages-netlify-vercel-github-pages-and-gitlab-pages-where-to-host-for-free/" />
      <updated>2020-12-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/cloudflare-pages-netlify-vercel-github-pages-and-gitlab-pages-where-to-host-for-free/</id>
      <content type="html">
				&lt;h1 id=&quot;cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/cloudflare-pages-netlify-vercel-github-pages-and-gitlab-pages-where-to-host-for-free/#cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-12-17-cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host/#cloudflare-pages-netlify-zeit-github-pages-and-gitlab-pages-where-to-host&quot; rel=&quot;noopener&quot;&gt;CloudFlare Pages, Netlify, Zeit, Github Pages, and Gitlab Pages. Where to host?&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Let me know in the comments or via a&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/new&quot; rel=&quot;noopener&quot;&gt;GitHub issue&lt;/a&gt;&amp;nbsp;if I’m missing something or got something wrong.&lt;/p&gt;&lt;p&gt;I excluded AWS Amplify as they are “free for a year”. That is a while but it will cost you something every month after that year.&lt;/p&gt;&lt;div class=&quot;view-toggle&quot;&gt;&lt;button onclick=&quot;showTable()&quot; id=&quot;table-btn&quot; class=&quot;active&quot;&gt;Comparison Table&lt;/button&gt; &lt;button onclick=&quot;showCards()&quot; id=&quot;cards-btn&quot;&gt;Nutrition Labels&lt;/button&gt;&lt;/div&gt;&lt;div class=&quot;vendor-selector&quot;&gt;&lt;h3&gt;Select Vendors to Compare (max 2):&lt;/h3&gt;&lt;div class=&quot;vendor-checkboxes&quot;&gt;&lt;p&gt;&lt;label class=&quot;vendor-checkbox&quot;&gt;&lt;br&gt;&lt;input type=&quot;checkbox&quot; value=&quot;GitHub&quot; onchange=&quot;handleVendorSelection(this)&quot; checked&gt;&lt;br&gt;&lt;span&gt;GitHub&lt;/span&gt;&lt;br&gt;&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label class=&quot;vendor-checkbox&quot;&gt;&lt;br&gt;&lt;input type=&quot;checkbox&quot; value=&quot;GitLab&quot; onchange=&quot;handleVendorSelection(this)&quot; checked&gt;&lt;br&gt;&lt;span&gt;GitLab&lt;/span&gt;&lt;br&gt;&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label class=&quot;vendor-checkbox&quot;&gt;&lt;br&gt;&lt;input type=&quot;checkbox&quot; value=&quot;Netlify&quot; onchange=&quot;handleVendorSelection(this)&quot;&gt;&lt;br&gt;&lt;span&gt;Netlify&lt;/span&gt;&lt;br&gt;&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label class=&quot;vendor-checkbox&quot;&gt;&lt;br&gt;&lt;input type=&quot;checkbox&quot; value=&quot;Vercel&quot; onchange=&quot;handleVendorSelection(this)&quot;&gt;&lt;br&gt;&lt;span&gt;Vercel&lt;/span&gt;&lt;br&gt;&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label class=&quot;vendor-checkbox&quot;&gt;&lt;br&gt;&lt;input type=&quot;checkbox&quot; value=&quot;CloudFlare&quot; onchange=&quot;handleVendorSelection(this)&quot;&gt;&lt;br&gt;&lt;span&gt;CloudFlare&lt;/span&gt;&lt;br&gt;&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label class=&quot;vendor-checkbox&quot;&gt;&lt;br&gt;&lt;input type=&quot;checkbox&quot; value=&quot;Firebase&quot; onchange=&quot;handleVendorSelection(this)&quot;&gt;&lt;br&gt;&lt;span&gt;Firebase&lt;/span&gt;&lt;br&gt;&lt;/label&gt;&lt;/p&gt;&lt;p&gt;&lt;label class=&quot;vendor-checkbox&quot;&gt;&lt;br&gt;&lt;input type=&quot;checkbox&quot; value=&quot;Render&quot; onchange=&quot;handleVendorSelection(this)&quot;&gt;&lt;br&gt;&lt;span&gt;Render&lt;/span&gt;&lt;br&gt;&lt;/label&gt;&lt;/p&gt;&lt;/div&gt;&lt;p class=&quot;selection-hint&quot;&gt;Select up to 2 vendors for focused comparison&lt;/p&gt;&lt;/div&gt;&lt;div id=&quot;comparison-table&quot; class=&quot;comparison-table&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;GitHub&lt;/th&gt;&lt;th&gt;GitLab&lt;/th&gt;&lt;th&gt;Netlify&lt;/th&gt;&lt;th&gt;Vercel&lt;/th&gt;&lt;th&gt;CloudFlare&lt;/th&gt;&lt;th&gt;Firebase&lt;/th&gt;&lt;th&gt;Render&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Build Limit&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages sites have a soft limit of 10 builds per hour.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;10/hour&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;GitLab limits builds and other CI/CD to Pipeline Minutes. 400 Minutes are free. No Build Limit beyond that.&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;None&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Buried in the Terms of Service&quot; href=&quot;https://www.netlify.com/tos#:~:text=3%20deploys/minute&quot;&gt;3/Minute&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;You are able to build 32 Deployments every 3600 seconds (1 hour)&quot; href=&quot;https://vercel.com/docs/platform/limits#builds-per-hour-(free)&quot;&gt;32/hour&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;You can deploy up to 500 times per month on the free plan&quot; href=&quot;https://developers.cloudflare.com/pages/platform/limits#builds&quot;&gt;500/month&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Build Time to Error&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;I couldn&#39;t find a quantity of builds can happen at once on GitHub pages.&quot; href=&quot;https://github.community/t/page-build-timed-out/10476/7&quot;&gt;10 minutes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Jobs handled by the shared runners on GitLab.com, time out after 3 hours, regardless of the timeout configured in a project.&quot; href=&quot;https://docs.gitlab.com/ee/user/gitlab_com/index.html#shared-runners&quot;&gt;3 Hours&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;You should count on your builds having only 15 minutes to complete their build command.&quot; href=&quot;https://answers.netlify.com/t/support-guide-how-long-should-netlify-builds-take/151/7&quot;&gt;15 minutes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;A build can last for 30 minutes. If the build exceeds this time, the deployment will error.&quot; href=&quot;https://vercel.com/docs/build-step#maximum-build-duration&quot;&gt;30 minutes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;All builds currently have a timeout of 120 minutes.&quot; href=&quot;https://community.render.com/t/is-there-a-limit-for-how-long-a-build-is-allowed-to-take/175/3&quot;&gt;120 minutes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Build Time per Month&lt;/th&gt;&lt;td&gt;&lt;p&gt;NA&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;400 Minutes are free&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;400 Minutes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;300 minutes /month(then $7 per 500)&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;300 Minutes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;On the Fair Use Policy Page, it reads, Up to 100 Hrs.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;6000 Minutes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Concurrent Builds&lt;/th&gt;&lt;td&gt;&lt;p&gt;🤷‍♂️&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;For each runner a concurrent job can execute.&quot; href=&quot;https://docs.gitlab.com/ee/ci/pipelines/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;One Concurrent build&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Hobby is allotted One (1) build concurrently.&quot; href=&quot;https://vercel.com/knowledge/why-are-my-vercel-builds-queued&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;On the Plans page it says, &#39;1 build at a time&#39;&quot; href=&quot;https://pages.cloudflare.com/#plans&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Deploy Limits&lt;/th&gt;&lt;td&gt;&lt;p&gt;NA&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;100/Day&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;I coudn&#39;t find any &#39;Deploy limits&#39; but this is probably controlled via the builds. I asked on twitter&quot; href=&quot;https://twitter.com/jacebenson/status/1339791209942949889&quot;&gt;Unlisted&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Deploy Previews&lt;/th&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Deploy a live shareable preview of your production URL or any individual branch that is not your production branch.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;On the pages site it shows &#39;Preview early, preview often&#39; and &#39;Preview control&#39; showing builds on commit, and control to who sees it.&quot; href=&quot;https://pages.cloudflare.com&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/docs/hosting/test-preview-deploy&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://render.com/docs/pull-request-previews&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Serverless Functions&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;There&#39;s no native serverless function on GitHub, you can make an action to make a function on AWS.&quot; href=&quot;https://github.com/serverless/github-action&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;You can have a runner build a AWS Lambda function.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/clusters/serverless/aws.html&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;These are great but keep in mind they are isolated from eachother, meaning you can&#39;t share a common file among them.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Vercel has Serverless Functions. Not sure who hosts them but they have differnt limits.  12/per deployment.&quot; href=&quot;https://vercel.com/docs/serverless-functions/introduction&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare has workers to do serverless stuff. This is a feature they&#39;ve offered for years now.&quot; href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Looks like they have this requested, but its not there yet, for $7 you could use https://www.openfaas.com/ on render.&quot; href=&quot;https://feedback.render.com/features/p/support-for-serverless-scripts&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Invocations/Month&lt;/th&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;125k per site /month($25+ when exceeded)&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;125k/per site/mo&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Vercel&#39;s Serverless functions usage is measured not in requests but in GB hours. I found this on the Fair Use Page.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;100GB hours/mo&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;100,000 / day, 1000 / minute.&quot; href=&quot;https://developers.cloudflare.com/workers/platform/limits&quot;&gt;100k/day&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;125k/mo&quot; href=&quot;https://firebase.google.com/docs/functions/quotas&quot;&gt;125k/mo&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Duration Allowed&lt;/th&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;10 second execution limit for synchronous serverless functions&quot; href=&quot;https://docs.netlify.com/functions/overview/#default-deployment-options&quot;&gt;10s&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;On the limits page, they state it&#39;s 10 seconds.&quot; href=&quot;https://vercel.com/docs/platform/limits#serverless-function-execution-timeout&quot;&gt;10s&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;10ms. Wait what? How can anything happen in 10ms? I guess they are fast, always on, and has storage&quot; href=&quot;https://developers.cloudflare.com/workers/platform/limits&quot;&gt;10ms&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;540s wow!&quot; href=&quot;https://firebase.google.com/docs/functions/quotas&quot;&gt;540s&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;DNS Management&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;You can create a CNAME file for the DNS, but no way to dicate other subdomains from the Repo.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;GitLab doesn&#39;t manage your domains. You configure TXT Records to verify the domain.&quot; href=&quot;https://about.gitlab.com/handbook/support/workflows/verify_pages_domain.html&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Netlify offers the option to handle DNS management for you.&quot; href=&quot;https://docs.netlify.com/domains-https/netlify-dns/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Vercel allows you to manage DNS Records on their site at noted on &#39;How can I manage my Vercel DNS records&#39;&quot; href=&quot;https://vercel.com/knowledge/how-to-manage-vercel-dns-records&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;CloudFlare has a huge offering for DNS management&quot; href=&quot;https://www.cloudflare.com/dns/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;No&quot; href=&quot;https://firebase.google.com/docs/hosting/custom-domain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/docs/custom-domains#adding-a-custom-domain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;HTTPS Available&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;GitHub serves their sites over HTTPS, if you use your own domain, you need a certificate.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/securing-your-github-pages-site-with-https&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;GitLab has a integration with Let&#39;s Encrypt to automatically do this.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.html&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Netlify offers free HTTPS on all sites, including automatic certificate creation and renewal.&quot; href=&quot;https://docs.netlify.com/domains-https/https-ssl/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Vercel automatically adds SSL from Let&#39;s Encrypt.&quot; href=&quot;https://vercel.com/blog/automatic-ssl-with-vercel-lets-encrypt&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Yes, this is something they offer&quot; href=&quot;https://support.cloudflare.com/hc/en-us/articles/360024787372-End-to-end-HTTPS-with-Cloudflare-Part-1-conceptual-overview&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Automatic SSL certificate issuance and renewal using Let’s Encrypt.&quot; href=&quot;https://render.com/docs/static-sites&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Bandwidth/Month&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages sites have a soft bandwidth limit of 100GB per month.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;GitLab doesn&#39;t set a max bandwidth for pages.&quot; href=&quot;https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6&quot;&gt;No limit&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Network Bandwidth: 100GB/month — Soft&quot; href=&quot;https://www.netlify.com/tos/#for-free-accounts&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Vercel limits bandwidth to 100GB&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;On the Plans page it says, &#39;Unlimited bandwidth&#39;&quot; href=&quot;https://pages.cloudflare.com/#plans&quot;&gt;No Limit&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting/usage-quotas-pricing&quot;&gt;10GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;We do not have any request size restrictions. Just note that we do charge for bandwidth that exceeds 100GB in a month.&quot; href=&quot;https://community.render.com/t/request-size-limits/552&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Site Limit&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Published GitHub Pages sites may be no larger than 1 GB.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;1GB&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;The only limitations are &lt; 10GB repository size and available pipeline minutes.&quot; href=&quot;https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6&quot;&gt;10GB&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Storage: 100GB / Soft&quot; href=&quot;https://www.netlify.com/tos/#for-free-accounts&quot;&gt;100GB&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Vercel has a limit on files quantity, it&#39;s 12.5k pre build.&quot; href=&quot;https://vercel.com/docs/platform/limits#files&quot;&gt;12.5K Files&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare limits site to 20k files&quot; href=&quot;https://developers.cloudflare.com/pages/platform/limits#files&quot;&gt;20K Files&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;10GB&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;10GB&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/docs/static-sites&quot;&gt;None listed&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Default URL&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;You can host your site on GitHub&#39;s github.io domain or your own custom domain.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#about-github-pages&quot;&gt;github.io&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a href=&quot;http://gitlab.io&quot; rel=&quot;noopener&quot;&gt;gitlab.io&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;netlify.app&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Vercel defaults to .vercel.app&quot; href=&quot;https://vercel.com/docs/custom-domains&quot;&gt;vercel.app&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare is using pages.dev for the domain.&quot; href=&quot;https://developers.cloudflare.com/pages/getting-started#add-a-custom-cname-record&quot;&gt;pages.dev&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting&quot;&gt;web.app and firebaseapp.com&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Every web service and static site on Render automatically gets a free onrender.com address which does not change.&quot; href=&quot;https://render.com/docs/custom-domains&quot;&gt;onrender.com&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;# of Team Members&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;How long will GitHub Free allow unlimited collaborators? Forever! This change is permanent.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/faq-about-changes-to-githubs-plans#how-long-will-github-free-allow-unlimited-collaborators&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Unlimited as it says on their pricing page.&quot; href=&quot;https://about.gitlab.com/pricing/&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;For free you get... one team member so for free... No team.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;For free Vercel doesn&#39;t give you access to Teams (CTRL+f teams )&quot; href=&quot;https://vercel.com/docs/platform/limits&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Unlimited seats for free: additional collaborators shouldn’t break the bank. With Pages, you can add them all for free.&quot; href=&quot;https://pages.cloudflare.com/&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Render allows you to share your site with other Render users for free so they can help you manage it through their own Render account.&quot; href=&quot;https://render.com/docs/static-sites#unlimited-collaborators&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Team SSO Available&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;If you&#39;re using GitHub as a organization, you can set up SAML single sign-on&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/about-authentication-with-saml-single-sign-on&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Looks like there&#39;s integrations with Okta, so I assume you can do this with other SAML providers.&quot; href=&quot;https://about.gitlab.com/handbook/business-ops/okta/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Team Owners can allow team members to log in to Netlify through their company&#39;s SAML signle sign on.&quot; href=&quot;https://docs.netlify.com/accounts-and-billing/team-management/saml-single-sign-on/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Vercel has this, but its only for &#39;teams&#39;&quot; href=&quot;https://vercel.com/docs/platform/projects#sso-protection&quot;&gt;Not for Free&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;# of Users&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;You can point users to use GitHub&#39;s OAuth Service. I&#39;m not sure how that would work, but it&#39;s an option.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/developers/apps/authorizing-oauth-apps&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Like GitHub, GitLab offers itself as a OAuth2 provider.&quot; href=&quot;https://docs.gitlab.com/ee/integration/oauth_provider.html&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Here&#39;s the link to the Netlify Identity details.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-identity&quot;&gt;1000/site/month&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Vercel lists solutions for Identity, but tehy don&#39;t have one with their offereings&quot; href=&quot;https://vercel.com/docs/solutions/authentication&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Workers has this, but that only shows how to do user auth with Auth0.&quot; href=&quot;https://developers.cloudflare.com/workers/tutorials/authorize-users-with-auth0&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;This idea may not be excatly this, but it&#39;s like it.&quot; href=&quot;https://feedback.render.com/features/p/password-protection-for-static-sites&quot;&gt;Planned&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;User SSO Available&lt;/th&gt;&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Again, like GitHub, GitLab offers SAML SSO for GitLab.com groups.&quot; href=&quot;https://docs.gitlab.com/ee/user/group/saml_sso/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Here SAML-SSO lists as ❌ for free, and ✔ for Level 2.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-identity&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Looks like they have this&quot; href=&quot;https://firebase.google.com/docs/auth/where-to-start&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Form Submissions/Month&lt;/th&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;100 submissions a month, and up to 10MB of uploads a month.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-forms&quot;&gt;100&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Yes and No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;This feels like cheating, but /shrug, it works.&quot; href=&quot;https://feedback.render.com/features/p/render-form-submissions&quot;&gt;Yes - via Formspree integration&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Analytics&lt;/th&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Today GitLab does not provide any analytics, but being open source, there&#39;s an issue for Server-side analtyics.&quot; href=&quot;https://gitlab.com/gitlab-org/gitlab-pages/-/issues/384&quot;&gt;Not Yet&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Analytics are available for $9 a month per site.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-analytics&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Vercel offers Analtyics. It can run on any host but they are limited to 1 day for free.&quot; href=&quot;https://vercel.com/docs/analytics#limits&quot;&gt;Free is only good for 1 day&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Split A/B Testing&lt;/th&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Netlify Split Testing lets your divide your traffic to your site between different deploys.&quot; href=&quot;https://docs.netlify.com/site-deploys/split-testing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;I could find A / B testing for workers. Not for pages.&quot; href=&quot;https://developers.cloudflare.com/workers/examples/ab-testing&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Allowed for Business Use&lt;/th&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages is not intended for or allowed to be used as a free web hosting service to run your online business, e-commerce site, or any other website that is primarily directed at either facilitating commercial transactions or providing commercial software as a service (SaaS).&quot; href=&quot;https://docs.github.com/en/github/working-with-github-pages/about-github-pages#prohibited-uses&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;With GitLab Pages, you can publish static websites directly from a repository in GitLab.  Use for any personal or business website.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/pages/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do.&quot; href=&quot;https://answers.netlify.com/t/is-the-free-tier-safe-for-client-projects/13535&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Hobby accounts are restricted to non-commercial personal use only.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy#commercial-usage&quot;&gt;No for hobby&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do.&quot; href=&quot;https://pages.cloudflare.com/#pricing&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title=&quot;Acceptable use has some simple things you agree not to&quot; href=&quot;https://cloud.google.com/terms/aup&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/acceptable-use&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div id=&quot;vendor-cards&quot; style=&quot;display: none&quot; class=&quot;vendor-cards&quot;&gt;&lt;div class=&quot;vendor-card&quot;&gt;&lt;h3&gt;GitHub&lt;/h3&gt;&lt;div class=&quot;nutrition-facts&quot;&gt;&lt;h4&gt;Hosting Facts&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Build &amp;amp; Deploy&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages sites have a soft limit of 10 builds per hour.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;10/hour&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I couldn&#39;t find a quantity of builds can happen at once on GitHub pages.&quot; href=&quot;https://github.community/t/page-build-timed-out/10476/7&quot;&gt;10 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NA&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;🤷‍♂️&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NA&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Core Features&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages sites have a soft limit of 10 builds per hour.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;10/hour&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I couldn&#39;t find a quantity of builds can happen at once on GitHub pages.&quot; href=&quot;https://github.community/t/page-build-timed-out/10476/7&quot;&gt;10 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NA&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;🤷‍♂️&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NA&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;There&#39;s no native serverless function on GitHub, you can make an action to make a function on AWS.&quot; href=&quot;https://github.com/serverless/github-action&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can create a CNAME file for the DNS, but no way to dicate other subdomains from the Repo.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub serves their sites over HTTPS, if you use your own domain, you need a certificate.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/securing-your-github-pages-site-with-https&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages sites have a soft bandwidth limit of 100GB per month.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Published GitHub Pages sites may be no larger than 1 GB.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;1GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can host your site on GitHub&#39;s github.io domain or your own custom domain.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#about-github-pages&quot;&gt;github.io&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;How long will GitHub Free allow unlimited collaborators? Forever! This change is permanent.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/faq-about-changes-to-githubs-plans#how-long-will-github-free-allow-unlimited-collaborators&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;If you&#39;re using GitHub as a organization, you can set up SAML single sign-on&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/about-authentication-with-saml-single-sign-on&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can point users to use GitHub&#39;s OAuth Service. I&#39;m not sure how that would work, but it&#39;s an option.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/developers/apps/authorizing-oauth-apps&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages is not intended for or allowed to be used as a free web hosting service to run your online business, e-commerce site, or any other website that is primarily directed at either facilitating commercial transactions or providing commercial software as a service (SaaS).&quot; href=&quot;https://docs.github.com/en/github/working-with-github-pages/about-github-pages#prohibited-uses&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Usage Limits&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages sites have a soft limit of 10 builds per hour.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;10/hour&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I couldn&#39;t find a quantity of builds can happen at once on GitHub pages.&quot; href=&quot;https://github.community/t/page-build-timed-out/10476/7&quot;&gt;10 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NA&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;🤷‍♂️&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NA&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;There&#39;s no native serverless function on GitHub, you can make an action to make a function on AWS.&quot; href=&quot;https://github.com/serverless/github-action&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can create a CNAME file for the DNS, but no way to dicate other subdomains from the Repo.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub serves their sites over HTTPS, if you use your own domain, you need a certificate.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/securing-your-github-pages-site-with-https&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages sites have a soft bandwidth limit of 100GB per month.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Published GitHub Pages sites may be no larger than 1 GB.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;1GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can host your site on GitHub&#39;s github.io domain or your own custom domain.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#about-github-pages&quot;&gt;github.io&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;How long will GitHub Free allow unlimited collaborators? Forever! This change is permanent.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/faq-about-changes-to-githubs-plans#how-long-will-github-free-allow-unlimited-collaborators&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;If you&#39;re using GitHub as a organization, you can set up SAML single sign-on&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/about-authentication-with-saml-single-sign-on&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can point users to use GitHub&#39;s OAuth Service. I&#39;m not sure how that would work, but it&#39;s an option.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/developers/apps/authorizing-oauth-apps&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages is not intended for or allowed to be used as a free web hosting service to run your online business, e-commerce site, or any other website that is primarily directed at either facilitating commercial transactions or providing commercial software as a service (SaaS).&quot; href=&quot;https://docs.github.com/en/github/working-with-github-pages/about-github-pages#prohibited-uses&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Collaboration&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages sites have a soft limit of 10 builds per hour.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;10/hour&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I couldn&#39;t find a quantity of builds can happen at once on GitHub pages.&quot; href=&quot;https://github.community/t/page-build-timed-out/10476/7&quot;&gt;10 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NA&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;🤷‍♂️&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NA&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;There&#39;s no native serverless function on GitHub, you can make an action to make a function on AWS.&quot; href=&quot;https://github.com/serverless/github-action&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can create a CNAME file for the DNS, but no way to dicate other subdomains from the Repo.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub serves their sites over HTTPS, if you use your own domain, you need a certificate.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/securing-your-github-pages-site-with-https&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages sites have a soft bandwidth limit of 100GB per month.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Published GitHub Pages sites may be no larger than 1 GB.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;1GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can host your site on GitHub&#39;s github.io domain or your own custom domain.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#about-github-pages&quot;&gt;github.io&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;How long will GitHub Free allow unlimited collaborators? Forever! This change is permanent.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/faq-about-changes-to-githubs-plans#how-long-will-github-free-allow-unlimited-collaborators&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;If you&#39;re using GitHub as a organization, you can set up SAML single sign-on&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/about-authentication-with-saml-single-sign-on&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can point users to use GitHub&#39;s OAuth Service. I&#39;m not sure how that would work, but it&#39;s an option.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/developers/apps/authorizing-oauth-apps&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages is not intended for or allowed to be used as a free web hosting service to run your online business, e-commerce site, or any other website that is primarily directed at either facilitating commercial transactions or providing commercial software as a service (SaaS).&quot; href=&quot;https://docs.github.com/en/github/working-with-github-pages/about-github-pages#prohibited-uses&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Extras&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages sites have a soft limit of 10 builds per hour.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;10/hour&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I couldn&#39;t find a quantity of builds can happen at once on GitHub pages.&quot; href=&quot;https://github.community/t/page-build-timed-out/10476/7&quot;&gt;10 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NA&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;🤷‍♂️&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;NA&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;There&#39;s no native serverless function on GitHub, you can make an action to make a function on AWS.&quot; href=&quot;https://github.com/serverless/github-action&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can create a CNAME file for the DNS, but no way to dicate other subdomains from the Repo.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub serves their sites over HTTPS, if you use your own domain, you need a certificate.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/securing-your-github-pages-site-with-https&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages sites have a soft bandwidth limit of 100GB per month.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Published GitHub Pages sites may be no larger than 1 GB.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#usage-limits&quot;&gt;1GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can host your site on GitHub&#39;s github.io domain or your own custom domain.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/about-github-pages#about-github-pages&quot;&gt;github.io&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;How long will GitHub Free allow unlimited collaborators? Forever! This change is permanent.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/faq-about-changes-to-githubs-plans#how-long-will-github-free-allow-unlimited-collaborators&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;If you&#39;re using GitHub as a organization, you can set up SAML single sign-on&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/about-authentication-with-saml-single-sign-on&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can point users to use GitHub&#39;s OAuth Service. I&#39;m not sure how that would work, but it&#39;s an option.&quot; href=&quot;https://docs.github.com/en/free-pro-team@latest/developers/apps/authorizing-oauth-apps&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitHub Pages is not intended for or allowed to be used as a free web hosting service to run your online business, e-commerce site, or any other website that is primarily directed at either facilitating commercial transactions or providing commercial software as a service (SaaS).&quot; href=&quot;https://docs.github.com/en/github/working-with-github-pages/about-github-pages#prohibited-uses&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;vendor-card&quot;&gt;&lt;h3&gt;GitLab&lt;/h3&gt;&lt;div class=&quot;nutrition-facts&quot;&gt;&lt;h4&gt;Hosting Facts&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Build &amp;amp; Deploy&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab limits builds and other CI/CD to Pipeline Minutes. 400 Minutes are free. No Build Limit beyond that.&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;None&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Jobs handled by the shared runners on GitLab.com, time out after 3 hours, regardless of the timeout configured in a project.&quot; href=&quot;https://docs.gitlab.com/ee/user/gitlab_com/index.html#shared-runners&quot;&gt;3 Hours&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;400 Minutes are free&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;400 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For each runner a concurrent job can execute.&quot; href=&quot;https://docs.gitlab.com/ee/ci/pipelines/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Core Features&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab limits builds and other CI/CD to Pipeline Minutes. 400 Minutes are free. No Build Limit beyond that.&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;None&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Jobs handled by the shared runners on GitLab.com, time out after 3 hours, regardless of the timeout configured in a project.&quot; href=&quot;https://docs.gitlab.com/ee/user/gitlab_com/index.html#shared-runners&quot;&gt;3 Hours&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;400 Minutes are free&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;400 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For each runner a concurrent job can execute.&quot; href=&quot;https://docs.gitlab.com/ee/ci/pipelines/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can have a runner build a AWS Lambda function.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/clusters/serverless/aws.html&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab doesn&#39;t manage your domains. You configure TXT Records to verify the domain.&quot; href=&quot;https://about.gitlab.com/handbook/support/workflows/verify_pages_domain.html&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab has a integration with Let&#39;s Encrypt to automatically do this.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.html&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab doesn&#39;t set a max bandwidth for pages.&quot; href=&quot;https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6&quot;&gt;No limit&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;The only limitations are &lt; 10GB repository size and available pipeline minutes.&quot; href=&quot;https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6&quot;&gt;10GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;gitlab.io&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Unlimited as it says on their pricing page.&quot; href=&quot;https://about.gitlab.com/pricing/&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like there&#39;s integrations with Okta, so I assume you can do this with other SAML providers.&quot; href=&quot;https://about.gitlab.com/handbook/business-ops/okta/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Like GitHub, GitLab offers itself as a OAuth2 provider.&quot; href=&quot;https://docs.gitlab.com/ee/integration/oauth_provider.html&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Again, like GitHub, GitLab offers SAML SSO for GitLab.com groups.&quot; href=&quot;https://docs.gitlab.com/ee/user/group/saml_sso/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Today GitLab does not provide any analytics, but being open source, there&#39;s an issue for Server-side analtyics.&quot; href=&quot;https://gitlab.com/gitlab-org/gitlab-pages/-/issues/384&quot;&gt;Not Yet&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;With GitLab Pages, you can publish static websites directly from a repository in GitLab.  Use for any personal or business website.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/pages/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Usage Limits&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab limits builds and other CI/CD to Pipeline Minutes. 400 Minutes are free. No Build Limit beyond that.&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;None&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Jobs handled by the shared runners on GitLab.com, time out after 3 hours, regardless of the timeout configured in a project.&quot; href=&quot;https://docs.gitlab.com/ee/user/gitlab_com/index.html#shared-runners&quot;&gt;3 Hours&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;400 Minutes are free&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;400 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For each runner a concurrent job can execute.&quot; href=&quot;https://docs.gitlab.com/ee/ci/pipelines/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can have a runner build a AWS Lambda function.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/clusters/serverless/aws.html&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab doesn&#39;t manage your domains. You configure TXT Records to verify the domain.&quot; href=&quot;https://about.gitlab.com/handbook/support/workflows/verify_pages_domain.html&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab has a integration with Let&#39;s Encrypt to automatically do this.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.html&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab doesn&#39;t set a max bandwidth for pages.&quot; href=&quot;https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6&quot;&gt;No limit&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;The only limitations are &lt; 10GB repository size and available pipeline minutes.&quot; href=&quot;https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6&quot;&gt;10GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;gitlab.io&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Unlimited as it says on their pricing page.&quot; href=&quot;https://about.gitlab.com/pricing/&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like there&#39;s integrations with Okta, so I assume you can do this with other SAML providers.&quot; href=&quot;https://about.gitlab.com/handbook/business-ops/okta/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Like GitHub, GitLab offers itself as a OAuth2 provider.&quot; href=&quot;https://docs.gitlab.com/ee/integration/oauth_provider.html&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Again, like GitHub, GitLab offers SAML SSO for GitLab.com groups.&quot; href=&quot;https://docs.gitlab.com/ee/user/group/saml_sso/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Today GitLab does not provide any analytics, but being open source, there&#39;s an issue for Server-side analtyics.&quot; href=&quot;https://gitlab.com/gitlab-org/gitlab-pages/-/issues/384&quot;&gt;Not Yet&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;With GitLab Pages, you can publish static websites directly from a repository in GitLab.  Use for any personal or business website.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/pages/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Collaboration&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab limits builds and other CI/CD to Pipeline Minutes. 400 Minutes are free. No Build Limit beyond that.&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;None&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Jobs handled by the shared runners on GitLab.com, time out after 3 hours, regardless of the timeout configured in a project.&quot; href=&quot;https://docs.gitlab.com/ee/user/gitlab_com/index.html#shared-runners&quot;&gt;3 Hours&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;400 Minutes are free&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;400 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For each runner a concurrent job can execute.&quot; href=&quot;https://docs.gitlab.com/ee/ci/pipelines/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can have a runner build a AWS Lambda function.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/clusters/serverless/aws.html&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab doesn&#39;t manage your domains. You configure TXT Records to verify the domain.&quot; href=&quot;https://about.gitlab.com/handbook/support/workflows/verify_pages_domain.html&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab has a integration with Let&#39;s Encrypt to automatically do this.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.html&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab doesn&#39;t set a max bandwidth for pages.&quot; href=&quot;https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6&quot;&gt;No limit&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;The only limitations are &lt; 10GB repository size and available pipeline minutes.&quot; href=&quot;https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6&quot;&gt;10GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;gitlab.io&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Unlimited as it says on their pricing page.&quot; href=&quot;https://about.gitlab.com/pricing/&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like there&#39;s integrations with Okta, so I assume you can do this with other SAML providers.&quot; href=&quot;https://about.gitlab.com/handbook/business-ops/okta/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Like GitHub, GitLab offers itself as a OAuth2 provider.&quot; href=&quot;https://docs.gitlab.com/ee/integration/oauth_provider.html&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Again, like GitHub, GitLab offers SAML SSO for GitLab.com groups.&quot; href=&quot;https://docs.gitlab.com/ee/user/group/saml_sso/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Today GitLab does not provide any analytics, but being open source, there&#39;s an issue for Server-side analtyics.&quot; href=&quot;https://gitlab.com/gitlab-org/gitlab-pages/-/issues/384&quot;&gt;Not Yet&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;With GitLab Pages, you can publish static websites directly from a repository in GitLab.  Use for any personal or business website.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/pages/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Extras&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab limits builds and other CI/CD to Pipeline Minutes. 400 Minutes are free. No Build Limit beyond that.&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;None&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Jobs handled by the shared runners on GitLab.com, time out after 3 hours, regardless of the timeout configured in a project.&quot; href=&quot;https://docs.gitlab.com/ee/user/gitlab_com/index.html#shared-runners&quot;&gt;3 Hours&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;400 Minutes are free&quot; href=&quot;https://about.gitlab.com/releases/2020/09/01/ci-minutes-update-free-users/&quot;&gt;400 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For each runner a concurrent job can execute.&quot; href=&quot;https://docs.gitlab.com/ee/ci/pipelines/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can have a runner build a AWS Lambda function.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/clusters/serverless/aws.html&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab doesn&#39;t manage your domains. You configure TXT Records to verify the domain.&quot; href=&quot;https://about.gitlab.com/handbook/support/workflows/verify_pages_domain.html&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab has a integration with Let&#39;s Encrypt to automatically do this.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.html&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;GitLab doesn&#39;t set a max bandwidth for pages.&quot; href=&quot;https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6&quot;&gt;No limit&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;The only limitations are &lt; 10GB repository size and available pipeline minutes.&quot; href=&quot;https://forum.gitlab.com/t/what-are-the-restrictions-for-gitlab-pages-sites/15067/6&quot;&gt;10GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;gitlab.io&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Unlimited as it says on their pricing page.&quot; href=&quot;https://about.gitlab.com/pricing/&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like there&#39;s integrations with Okta, so I assume you can do this with other SAML providers.&quot; href=&quot;https://about.gitlab.com/handbook/business-ops/okta/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Like GitHub, GitLab offers itself as a OAuth2 provider.&quot; href=&quot;https://docs.gitlab.com/ee/integration/oauth_provider.html&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Again, like GitHub, GitLab offers SAML SSO for GitLab.com groups.&quot; href=&quot;https://docs.gitlab.com/ee/user/group/saml_sso/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Today GitLab does not provide any analytics, but being open source, there&#39;s an issue for Server-side analtyics.&quot; href=&quot;https://gitlab.com/gitlab-org/gitlab-pages/-/issues/384&quot;&gt;Not Yet&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;With GitLab Pages, you can publish static websites directly from a repository in GitLab.  Use for any personal or business website.&quot; href=&quot;https://docs.gitlab.com/ee/user/project/pages/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;vendor-card&quot;&gt;&lt;h3&gt;Netlify&lt;/h3&gt;&lt;div class=&quot;nutrition-facts&quot;&gt;&lt;h4&gt;Hosting Facts&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Build &amp;amp; Deploy&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Buried in the Terms of Service&quot; href=&quot;https://www.netlify.com/tos#:~:text=3%20deploys/minute&quot;&gt;3/Minute&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You should count on your builds having only 15 minutes to complete their build command.&quot; href=&quot;https://answers.netlify.com/t/support-guide-how-long-should-netlify-builds-take/151/7&quot;&gt;15 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;300 minutes /month(then $7 per 500)&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;300 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;One Concurrent build&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Core Features&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Buried in the Terms of Service&quot; href=&quot;https://www.netlify.com/tos#:~:text=3%20deploys/minute&quot;&gt;3/Minute&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You should count on your builds having only 15 minutes to complete their build command.&quot; href=&quot;https://answers.netlify.com/t/support-guide-how-long-should-netlify-builds-take/151/7&quot;&gt;15 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;300 minutes /month(then $7 per 500)&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;300 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;One Concurrent build&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Deploy a live shareable preview of your production URL or any individual branch that is not your production branch.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;These are great but keep in mind they are isolated from eachother, meaning you can&#39;t share a common file among them.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;125k per site /month($25+ when exceeded)&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;125k/per site/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10 second execution limit for synchronous serverless functions&quot; href=&quot;https://docs.netlify.com/functions/overview/#default-deployment-options&quot;&gt;10s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify offers the option to handle DNS management for you.&quot; href=&quot;https://docs.netlify.com/domains-https/netlify-dns/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify offers free HTTPS on all sites, including automatic certificate creation and renewal.&quot; href=&quot;https://docs.netlify.com/domains-https/https-ssl/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Network Bandwidth: 100GB/month — Soft&quot; href=&quot;https://www.netlify.com/tos/#for-free-accounts&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Storage: 100GB / Soft&quot; href=&quot;https://www.netlify.com/tos/#for-free-accounts&quot;&gt;100GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;netlify.app&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For free you get... one team member so for free... No team.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Team Owners can allow team members to log in to Netlify through their company&#39;s SAML signle sign on.&quot; href=&quot;https://docs.netlify.com/accounts-and-billing/team-management/saml-single-sign-on/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Here&#39;s the link to the Netlify Identity details.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-identity&quot;&gt;1000/site/month&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Here SAML-SSO lists as ❌ for free, and ✔ for Level 2.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-identity&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;100 submissions a month, and up to 10MB of uploads a month.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-forms&quot;&gt;100&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Analytics are available for $9 a month per site.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-analytics&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify Split Testing lets your divide your traffic to your site between different deploys.&quot; href=&quot;https://docs.netlify.com/site-deploys/split-testing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do.&quot; href=&quot;https://answers.netlify.com/t/is-the-free-tier-safe-for-client-projects/13535&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Usage Limits&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Buried in the Terms of Service&quot; href=&quot;https://www.netlify.com/tos#:~:text=3%20deploys/minute&quot;&gt;3/Minute&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You should count on your builds having only 15 minutes to complete their build command.&quot; href=&quot;https://answers.netlify.com/t/support-guide-how-long-should-netlify-builds-take/151/7&quot;&gt;15 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;300 minutes /month(then $7 per 500)&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;300 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;One Concurrent build&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Deploy a live shareable preview of your production URL or any individual branch that is not your production branch.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;These are great but keep in mind they are isolated from eachother, meaning you can&#39;t share a common file among them.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;125k per site /month($25+ when exceeded)&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;125k/per site/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10 second execution limit for synchronous serverless functions&quot; href=&quot;https://docs.netlify.com/functions/overview/#default-deployment-options&quot;&gt;10s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify offers the option to handle DNS management for you.&quot; href=&quot;https://docs.netlify.com/domains-https/netlify-dns/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify offers free HTTPS on all sites, including automatic certificate creation and renewal.&quot; href=&quot;https://docs.netlify.com/domains-https/https-ssl/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Network Bandwidth: 100GB/month — Soft&quot; href=&quot;https://www.netlify.com/tos/#for-free-accounts&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Storage: 100GB / Soft&quot; href=&quot;https://www.netlify.com/tos/#for-free-accounts&quot;&gt;100GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;netlify.app&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For free you get... one team member so for free... No team.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Team Owners can allow team members to log in to Netlify through their company&#39;s SAML signle sign on.&quot; href=&quot;https://docs.netlify.com/accounts-and-billing/team-management/saml-single-sign-on/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Here&#39;s the link to the Netlify Identity details.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-identity&quot;&gt;1000/site/month&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Here SAML-SSO lists as ❌ for free, and ✔ for Level 2.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-identity&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;100 submissions a month, and up to 10MB of uploads a month.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-forms&quot;&gt;100&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Analytics are available for $9 a month per site.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-analytics&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify Split Testing lets your divide your traffic to your site between different deploys.&quot; href=&quot;https://docs.netlify.com/site-deploys/split-testing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do.&quot; href=&quot;https://answers.netlify.com/t/is-the-free-tier-safe-for-client-projects/13535&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Collaboration&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Buried in the Terms of Service&quot; href=&quot;https://www.netlify.com/tos#:~:text=3%20deploys/minute&quot;&gt;3/Minute&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You should count on your builds having only 15 minutes to complete their build command.&quot; href=&quot;https://answers.netlify.com/t/support-guide-how-long-should-netlify-builds-take/151/7&quot;&gt;15 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;300 minutes /month(then $7 per 500)&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;300 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;One Concurrent build&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Deploy a live shareable preview of your production URL or any individual branch that is not your production branch.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;These are great but keep in mind they are isolated from eachother, meaning you can&#39;t share a common file among them.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;125k per site /month($25+ when exceeded)&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;125k/per site/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10 second execution limit for synchronous serverless functions&quot; href=&quot;https://docs.netlify.com/functions/overview/#default-deployment-options&quot;&gt;10s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify offers the option to handle DNS management for you.&quot; href=&quot;https://docs.netlify.com/domains-https/netlify-dns/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify offers free HTTPS on all sites, including automatic certificate creation and renewal.&quot; href=&quot;https://docs.netlify.com/domains-https/https-ssl/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Network Bandwidth: 100GB/month — Soft&quot; href=&quot;https://www.netlify.com/tos/#for-free-accounts&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Storage: 100GB / Soft&quot; href=&quot;https://www.netlify.com/tos/#for-free-accounts&quot;&gt;100GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;netlify.app&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For free you get... one team member so for free... No team.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Team Owners can allow team members to log in to Netlify through their company&#39;s SAML signle sign on.&quot; href=&quot;https://docs.netlify.com/accounts-and-billing/team-management/saml-single-sign-on/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Here&#39;s the link to the Netlify Identity details.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-identity&quot;&gt;1000/site/month&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Here SAML-SSO lists as ❌ for free, and ✔ for Level 2.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-identity&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;100 submissions a month, and up to 10MB of uploads a month.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-forms&quot;&gt;100&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Analytics are available for $9 a month per site.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-analytics&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify Split Testing lets your divide your traffic to your site between different deploys.&quot; href=&quot;https://docs.netlify.com/site-deploys/split-testing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do.&quot; href=&quot;https://answers.netlify.com/t/is-the-free-tier-safe-for-client-projects/13535&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Extras&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Buried in the Terms of Service&quot; href=&quot;https://www.netlify.com/tos#:~:text=3%20deploys/minute&quot;&gt;3/Minute&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You should count on your builds having only 15 minutes to complete their build command.&quot; href=&quot;https://answers.netlify.com/t/support-guide-how-long-should-netlify-builds-take/151/7&quot;&gt;15 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;300 minutes /month(then $7 per 500)&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;300 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;One Concurrent build&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Deploy a live shareable preview of your production URL or any individual branch that is not your production branch.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;These are great but keep in mind they are isolated from eachother, meaning you can&#39;t share a common file among them.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;125k per site /month($25+ when exceeded)&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;125k/per site/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10 second execution limit for synchronous serverless functions&quot; href=&quot;https://docs.netlify.com/functions/overview/#default-deployment-options&quot;&gt;10s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify offers the option to handle DNS management for you.&quot; href=&quot;https://docs.netlify.com/domains-https/netlify-dns/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify offers free HTTPS on all sites, including automatic certificate creation and renewal.&quot; href=&quot;https://docs.netlify.com/domains-https/https-ssl/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Network Bandwidth: 100GB/month — Soft&quot; href=&quot;https://www.netlify.com/tos/#for-free-accounts&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Storage: 100GB / Soft&quot; href=&quot;https://www.netlify.com/tos/#for-free-accounts&quot;&gt;100GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;netlify.app&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For free you get... one team member so for free... No team.&quot; href=&quot;https://www.netlify.com/pricing/#features&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Team Owners can allow team members to log in to Netlify through their company&#39;s SAML signle sign on.&quot; href=&quot;https://docs.netlify.com/accounts-and-billing/team-management/saml-single-sign-on/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Here&#39;s the link to the Netlify Identity details.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-identity&quot;&gt;1000/site/month&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Here SAML-SSO lists as ❌ for free, and ✔ for Level 2.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-identity&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;100 submissions a month, and up to 10MB of uploads a month.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-forms&quot;&gt;100&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Analytics are available for $9 a month per site.&quot; href=&quot;https://www.netlify.com/pricing/#add-ons-analytics&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Netlify Split Testing lets your divide your traffic to your site between different deploys.&quot; href=&quot;https://docs.netlify.com/site-deploys/split-testing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do.&quot; href=&quot;https://answers.netlify.com/t/is-the-free-tier-safe-for-client-projects/13535&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;vendor-card&quot;&gt;&lt;h3&gt;Vercel&lt;/h3&gt;&lt;div class=&quot;nutrition-facts&quot;&gt;&lt;h4&gt;Hosting Facts&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Build &amp;amp; Deploy&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You are able to build 32 Deployments every 3600 seconds (1 hour)&quot; href=&quot;https://vercel.com/docs/platform/limits#builds-per-hour-(free)&quot;&gt;32/hour&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;A build can last for 30 minutes. If the build exceeds this time, the deployment will error.&quot; href=&quot;https://vercel.com/docs/build-step#maximum-build-duration&quot;&gt;30 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Fair Use Policy Page, it reads, Up to 100 Hrs.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;6000 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Hobby is allotted One (1) build concurrently.&quot; href=&quot;https://vercel.com/knowledge/why-are-my-vercel-builds-queued&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;100/Day&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Core Features&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You are able to build 32 Deployments every 3600 seconds (1 hour)&quot; href=&quot;https://vercel.com/docs/platform/limits#builds-per-hour-(free)&quot;&gt;32/hour&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;A build can last for 30 minutes. If the build exceeds this time, the deployment will error.&quot; href=&quot;https://vercel.com/docs/build-step#maximum-build-duration&quot;&gt;30 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Fair Use Policy Page, it reads, Up to 100 Hrs.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;6000 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Hobby is allotted One (1) build concurrently.&quot; href=&quot;https://vercel.com/knowledge/why-are-my-vercel-builds-queued&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;100/Day&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has Serverless Functions. Not sure who hosts them but they have differnt limits.  12/per deployment.&quot; href=&quot;https://vercel.com/docs/serverless-functions/introduction&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel&#39;s Serverless functions usage is measured not in requests but in GB hours. I found this on the Fair Use Page.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;100GB hours/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the limits page, they state it&#39;s 10 seconds.&quot; href=&quot;https://vercel.com/docs/platform/limits#serverless-function-execution-timeout&quot;&gt;10s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel allows you to manage DNS Records on their site at noted on &#39;How can I manage my Vercel DNS records&#39;&quot; href=&quot;https://vercel.com/knowledge/how-to-manage-vercel-dns-records&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel automatically adds SSL from Let&#39;s Encrypt.&quot; href=&quot;https://vercel.com/blog/automatic-ssl-with-vercel-lets-encrypt&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel limits bandwidth to 100GB&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has a limit on files quantity, it&#39;s 12.5k pre build.&quot; href=&quot;https://vercel.com/docs/platform/limits#files&quot;&gt;12.5K Files&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel defaults to .vercel.app&quot; href=&quot;https://vercel.com/docs/custom-domains&quot;&gt;vercel.app&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For free Vercel doesn&#39;t give you access to Teams (CTRL+f teams )&quot; href=&quot;https://vercel.com/docs/platform/limits&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has this, but its only for &#39;teams&#39;&quot; href=&quot;https://vercel.com/docs/platform/projects#sso-protection&quot;&gt;Not for Free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel lists solutions for Identity, but tehy don&#39;t have one with their offereings&quot; href=&quot;https://vercel.com/docs/solutions/authentication&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel offers Analtyics. It can run on any host but they are limited to 1 day for free.&quot; href=&quot;https://vercel.com/docs/analytics#limits&quot;&gt;Free is only good for 1 day&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Hobby accounts are restricted to non-commercial personal use only.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy#commercial-usage&quot;&gt;No for hobby&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Usage Limits&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You are able to build 32 Deployments every 3600 seconds (1 hour)&quot; href=&quot;https://vercel.com/docs/platform/limits#builds-per-hour-(free)&quot;&gt;32/hour&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;A build can last for 30 minutes. If the build exceeds this time, the deployment will error.&quot; href=&quot;https://vercel.com/docs/build-step#maximum-build-duration&quot;&gt;30 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Fair Use Policy Page, it reads, Up to 100 Hrs.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;6000 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Hobby is allotted One (1) build concurrently.&quot; href=&quot;https://vercel.com/knowledge/why-are-my-vercel-builds-queued&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;100/Day&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has Serverless Functions. Not sure who hosts them but they have differnt limits.  12/per deployment.&quot; href=&quot;https://vercel.com/docs/serverless-functions/introduction&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel&#39;s Serverless functions usage is measured not in requests but in GB hours. I found this on the Fair Use Page.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;100GB hours/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the limits page, they state it&#39;s 10 seconds.&quot; href=&quot;https://vercel.com/docs/platform/limits#serverless-function-execution-timeout&quot;&gt;10s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel allows you to manage DNS Records on their site at noted on &#39;How can I manage my Vercel DNS records&#39;&quot; href=&quot;https://vercel.com/knowledge/how-to-manage-vercel-dns-records&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel automatically adds SSL from Let&#39;s Encrypt.&quot; href=&quot;https://vercel.com/blog/automatic-ssl-with-vercel-lets-encrypt&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel limits bandwidth to 100GB&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has a limit on files quantity, it&#39;s 12.5k pre build.&quot; href=&quot;https://vercel.com/docs/platform/limits#files&quot;&gt;12.5K Files&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel defaults to .vercel.app&quot; href=&quot;https://vercel.com/docs/custom-domains&quot;&gt;vercel.app&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For free Vercel doesn&#39;t give you access to Teams (CTRL+f teams )&quot; href=&quot;https://vercel.com/docs/platform/limits&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has this, but its only for &#39;teams&#39;&quot; href=&quot;https://vercel.com/docs/platform/projects#sso-protection&quot;&gt;Not for Free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel lists solutions for Identity, but tehy don&#39;t have one with their offereings&quot; href=&quot;https://vercel.com/docs/solutions/authentication&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel offers Analtyics. It can run on any host but they are limited to 1 day for free.&quot; href=&quot;https://vercel.com/docs/analytics#limits&quot;&gt;Free is only good for 1 day&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Hobby accounts are restricted to non-commercial personal use only.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy#commercial-usage&quot;&gt;No for hobby&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Collaboration&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You are able to build 32 Deployments every 3600 seconds (1 hour)&quot; href=&quot;https://vercel.com/docs/platform/limits#builds-per-hour-(free)&quot;&gt;32/hour&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;A build can last for 30 minutes. If the build exceeds this time, the deployment will error.&quot; href=&quot;https://vercel.com/docs/build-step#maximum-build-duration&quot;&gt;30 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Fair Use Policy Page, it reads, Up to 100 Hrs.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;6000 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Hobby is allotted One (1) build concurrently.&quot; href=&quot;https://vercel.com/knowledge/why-are-my-vercel-builds-queued&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;100/Day&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has Serverless Functions. Not sure who hosts them but they have differnt limits.  12/per deployment.&quot; href=&quot;https://vercel.com/docs/serverless-functions/introduction&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel&#39;s Serverless functions usage is measured not in requests but in GB hours. I found this on the Fair Use Page.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;100GB hours/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the limits page, they state it&#39;s 10 seconds.&quot; href=&quot;https://vercel.com/docs/platform/limits#serverless-function-execution-timeout&quot;&gt;10s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel allows you to manage DNS Records on their site at noted on &#39;How can I manage my Vercel DNS records&#39;&quot; href=&quot;https://vercel.com/knowledge/how-to-manage-vercel-dns-records&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel automatically adds SSL from Let&#39;s Encrypt.&quot; href=&quot;https://vercel.com/blog/automatic-ssl-with-vercel-lets-encrypt&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel limits bandwidth to 100GB&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has a limit on files quantity, it&#39;s 12.5k pre build.&quot; href=&quot;https://vercel.com/docs/platform/limits#files&quot;&gt;12.5K Files&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel defaults to .vercel.app&quot; href=&quot;https://vercel.com/docs/custom-domains&quot;&gt;vercel.app&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For free Vercel doesn&#39;t give you access to Teams (CTRL+f teams )&quot; href=&quot;https://vercel.com/docs/platform/limits&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has this, but its only for &#39;teams&#39;&quot; href=&quot;https://vercel.com/docs/platform/projects#sso-protection&quot;&gt;Not for Free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel lists solutions for Identity, but tehy don&#39;t have one with their offereings&quot; href=&quot;https://vercel.com/docs/solutions/authentication&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel offers Analtyics. It can run on any host but they are limited to 1 day for free.&quot; href=&quot;https://vercel.com/docs/analytics#limits&quot;&gt;Free is only good for 1 day&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Hobby accounts are restricted to non-commercial personal use only.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy#commercial-usage&quot;&gt;No for hobby&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Extras&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You are able to build 32 Deployments every 3600 seconds (1 hour)&quot; href=&quot;https://vercel.com/docs/platform/limits#builds-per-hour-(free)&quot;&gt;32/hour&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;A build can last for 30 minutes. If the build exceeds this time, the deployment will error.&quot; href=&quot;https://vercel.com/docs/build-step#maximum-build-duration&quot;&gt;30 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Fair Use Policy Page, it reads, Up to 100 Hrs.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;6000 Minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Hobby is allotted One (1) build concurrently.&quot; href=&quot;https://vercel.com/knowledge/why-are-my-vercel-builds-queued&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;100/Day&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has Serverless Functions. Not sure who hosts them but they have differnt limits.  12/per deployment.&quot; href=&quot;https://vercel.com/docs/serverless-functions/introduction&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel&#39;s Serverless functions usage is measured not in requests but in GB hours. I found this on the Fair Use Page.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;100GB hours/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the limits page, they state it&#39;s 10 seconds.&quot; href=&quot;https://vercel.com/docs/platform/limits#serverless-function-execution-timeout&quot;&gt;10s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel allows you to manage DNS Records on their site at noted on &#39;How can I manage my Vercel DNS records&#39;&quot; href=&quot;https://vercel.com/knowledge/how-to-manage-vercel-dns-records&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel automatically adds SSL from Let&#39;s Encrypt.&quot; href=&quot;https://vercel.com/blog/automatic-ssl-with-vercel-lets-encrypt&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel limits bandwidth to 100GB&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has a limit on files quantity, it&#39;s 12.5k pre build.&quot; href=&quot;https://vercel.com/docs/platform/limits#files&quot;&gt;12.5K Files&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel defaults to .vercel.app&quot; href=&quot;https://vercel.com/docs/custom-domains&quot;&gt;vercel.app&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;For free Vercel doesn&#39;t give you access to Teams (CTRL+f teams )&quot; href=&quot;https://vercel.com/docs/platform/limits&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel has this, but its only for &#39;teams&#39;&quot; href=&quot;https://vercel.com/docs/platform/projects#sso-protection&quot;&gt;Not for Free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel lists solutions for Identity, but tehy don&#39;t have one with their offereings&quot; href=&quot;https://vercel.com/docs/solutions/authentication&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Vercel offers Analtyics. It can run on any host but they are limited to 1 day for free.&quot; href=&quot;https://vercel.com/docs/analytics#limits&quot;&gt;Free is only good for 1 day&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Hobby accounts are restricted to non-commercial personal use only.&quot; href=&quot;https://vercel.com/docs/platform/fair-use-policy#commercial-usage&quot;&gt;No for hobby&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;vendor-card&quot;&gt;&lt;h3&gt;CloudFlare&lt;/h3&gt;&lt;div class=&quot;nutrition-facts&quot;&gt;&lt;h4&gt;Hosting Facts&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Build &amp;amp; Deploy&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can deploy up to 500 times per month on the free plan&quot; href=&quot;https://developers.cloudflare.com/pages/platform/limits#builds&quot;&gt;500/month&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Plans page it says, &#39;1 build at a time&#39;&quot; href=&quot;https://pages.cloudflare.com/#plans&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I coudn&#39;t find any &#39;Deploy limits&#39; but this is probably controlled via the builds. I asked on twitter&quot; href=&quot;https://twitter.com/jacebenson/status/1339791209942949889&quot;&gt;Unlisted&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Core Features&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can deploy up to 500 times per month on the free plan&quot; href=&quot;https://developers.cloudflare.com/pages/platform/limits#builds&quot;&gt;500/month&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Plans page it says, &#39;1 build at a time&#39;&quot; href=&quot;https://pages.cloudflare.com/#plans&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I coudn&#39;t find any &#39;Deploy limits&#39; but this is probably controlled via the builds. I asked on twitter&quot; href=&quot;https://twitter.com/jacebenson/status/1339791209942949889&quot;&gt;Unlisted&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the pages site it shows &#39;Preview early, preview often&#39; and &#39;Preview control&#39; showing builds on commit, and control to who sees it.&quot; href=&quot;https://pages.cloudflare.com&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare has workers to do serverless stuff. This is a feature they&#39;ve offered for years now.&quot; href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;100,000 / day, 1000 / minute.&quot; href=&quot;https://developers.cloudflare.com/workers/platform/limits&quot;&gt;100k/day&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10ms. Wait what? How can anything happen in 10ms? I guess they are fast, always on, and has storage&quot; href=&quot;https://developers.cloudflare.com/workers/platform/limits&quot;&gt;10ms&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;CloudFlare has a huge offering for DNS management&quot; href=&quot;https://www.cloudflare.com/dns/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes, this is something they offer&quot; href=&quot;https://support.cloudflare.com/hc/en-us/articles/360024787372-End-to-end-HTTPS-with-Cloudflare-Part-1-conceptual-overview&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Plans page it says, &#39;Unlimited bandwidth&#39;&quot; href=&quot;https://pages.cloudflare.com/#plans&quot;&gt;No Limit&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare limits site to 20k files&quot; href=&quot;https://developers.cloudflare.com/pages/platform/limits#files&quot;&gt;20K Files&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare is using pages.dev for the domain.&quot; href=&quot;https://developers.cloudflare.com/pages/getting-started#add-a-custom-cname-record&quot;&gt;pages.dev&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Unlimited seats for free: additional collaborators shouldn’t break the bank. With Pages, you can add them all for free.&quot; href=&quot;https://pages.cloudflare.com/&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Workers has this, but that only shows how to do user auth with Auth0.&quot; href=&quot;https://developers.cloudflare.com/workers/tutorials/authorize-users-with-auth0&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes and No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I could find A / B testing for workers. Not for pages.&quot; href=&quot;https://developers.cloudflare.com/workers/examples/ab-testing&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do.&quot; href=&quot;https://pages.cloudflare.com/#pricing&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Usage Limits&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can deploy up to 500 times per month on the free plan&quot; href=&quot;https://developers.cloudflare.com/pages/platform/limits#builds&quot;&gt;500/month&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Plans page it says, &#39;1 build at a time&#39;&quot; href=&quot;https://pages.cloudflare.com/#plans&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I coudn&#39;t find any &#39;Deploy limits&#39; but this is probably controlled via the builds. I asked on twitter&quot; href=&quot;https://twitter.com/jacebenson/status/1339791209942949889&quot;&gt;Unlisted&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the pages site it shows &#39;Preview early, preview often&#39; and &#39;Preview control&#39; showing builds on commit, and control to who sees it.&quot; href=&quot;https://pages.cloudflare.com&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare has workers to do serverless stuff. This is a feature they&#39;ve offered for years now.&quot; href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;100,000 / day, 1000 / minute.&quot; href=&quot;https://developers.cloudflare.com/workers/platform/limits&quot;&gt;100k/day&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10ms. Wait what? How can anything happen in 10ms? I guess they are fast, always on, and has storage&quot; href=&quot;https://developers.cloudflare.com/workers/platform/limits&quot;&gt;10ms&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;CloudFlare has a huge offering for DNS management&quot; href=&quot;https://www.cloudflare.com/dns/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes, this is something they offer&quot; href=&quot;https://support.cloudflare.com/hc/en-us/articles/360024787372-End-to-end-HTTPS-with-Cloudflare-Part-1-conceptual-overview&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Plans page it says, &#39;Unlimited bandwidth&#39;&quot; href=&quot;https://pages.cloudflare.com/#plans&quot;&gt;No Limit&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare limits site to 20k files&quot; href=&quot;https://developers.cloudflare.com/pages/platform/limits#files&quot;&gt;20K Files&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare is using pages.dev for the domain.&quot; href=&quot;https://developers.cloudflare.com/pages/getting-started#add-a-custom-cname-record&quot;&gt;pages.dev&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Unlimited seats for free: additional collaborators shouldn’t break the bank. With Pages, you can add them all for free.&quot; href=&quot;https://pages.cloudflare.com/&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Workers has this, but that only shows how to do user auth with Auth0.&quot; href=&quot;https://developers.cloudflare.com/workers/tutorials/authorize-users-with-auth0&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes and No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I could find A / B testing for workers. Not for pages.&quot; href=&quot;https://developers.cloudflare.com/workers/examples/ab-testing&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do.&quot; href=&quot;https://pages.cloudflare.com/#pricing&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Collaboration&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can deploy up to 500 times per month on the free plan&quot; href=&quot;https://developers.cloudflare.com/pages/platform/limits#builds&quot;&gt;500/month&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Plans page it says, &#39;1 build at a time&#39;&quot; href=&quot;https://pages.cloudflare.com/#plans&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I coudn&#39;t find any &#39;Deploy limits&#39; but this is probably controlled via the builds. I asked on twitter&quot; href=&quot;https://twitter.com/jacebenson/status/1339791209942949889&quot;&gt;Unlisted&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the pages site it shows &#39;Preview early, preview often&#39; and &#39;Preview control&#39; showing builds on commit, and control to who sees it.&quot; href=&quot;https://pages.cloudflare.com&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare has workers to do serverless stuff. This is a feature they&#39;ve offered for years now.&quot; href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;100,000 / day, 1000 / minute.&quot; href=&quot;https://developers.cloudflare.com/workers/platform/limits&quot;&gt;100k/day&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10ms. Wait what? How can anything happen in 10ms? I guess they are fast, always on, and has storage&quot; href=&quot;https://developers.cloudflare.com/workers/platform/limits&quot;&gt;10ms&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;CloudFlare has a huge offering for DNS management&quot; href=&quot;https://www.cloudflare.com/dns/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes, this is something they offer&quot; href=&quot;https://support.cloudflare.com/hc/en-us/articles/360024787372-End-to-end-HTTPS-with-Cloudflare-Part-1-conceptual-overview&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Plans page it says, &#39;Unlimited bandwidth&#39;&quot; href=&quot;https://pages.cloudflare.com/#plans&quot;&gt;No Limit&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare limits site to 20k files&quot; href=&quot;https://developers.cloudflare.com/pages/platform/limits#files&quot;&gt;20K Files&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare is using pages.dev for the domain.&quot; href=&quot;https://developers.cloudflare.com/pages/getting-started#add-a-custom-cname-record&quot;&gt;pages.dev&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Unlimited seats for free: additional collaborators shouldn’t break the bank. With Pages, you can add them all for free.&quot; href=&quot;https://pages.cloudflare.com/&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Workers has this, but that only shows how to do user auth with Auth0.&quot; href=&quot;https://developers.cloudflare.com/workers/tutorials/authorize-users-with-auth0&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes and No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I could find A / B testing for workers. Not for pages.&quot; href=&quot;https://developers.cloudflare.com/workers/examples/ab-testing&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do.&quot; href=&quot;https://pages.cloudflare.com/#pricing&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Extras&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;You can deploy up to 500 times per month on the free plan&quot; href=&quot;https://developers.cloudflare.com/pages/platform/limits#builds&quot;&gt;500/month&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Plans page it says, &#39;1 build at a time&#39;&quot; href=&quot;https://pages.cloudflare.com/#plans&quot;&gt;One&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I coudn&#39;t find any &#39;Deploy limits&#39; but this is probably controlled via the builds. I asked on twitter&quot; href=&quot;https://twitter.com/jacebenson/status/1339791209942949889&quot;&gt;Unlisted&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the pages site it shows &#39;Preview early, preview often&#39; and &#39;Preview control&#39; showing builds on commit, and control to who sees it.&quot; href=&quot;https://pages.cloudflare.com&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare has workers to do serverless stuff. This is a feature they&#39;ve offered for years now.&quot; href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;100,000 / day, 1000 / minute.&quot; href=&quot;https://developers.cloudflare.com/workers/platform/limits&quot;&gt;100k/day&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10ms. Wait what? How can anything happen in 10ms? I guess they are fast, always on, and has storage&quot; href=&quot;https://developers.cloudflare.com/workers/platform/limits&quot;&gt;10ms&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;CloudFlare has a huge offering for DNS management&quot; href=&quot;https://www.cloudflare.com/dns/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes, this is something they offer&quot; href=&quot;https://support.cloudflare.com/hc/en-us/articles/360024787372-End-to-end-HTTPS-with-Cloudflare-Part-1-conceptual-overview&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;On the Plans page it says, &#39;Unlimited bandwidth&#39;&quot; href=&quot;https://pages.cloudflare.com/#plans&quot;&gt;No Limit&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare limits site to 20k files&quot; href=&quot;https://developers.cloudflare.com/pages/platform/limits#files&quot;&gt;20K Files&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Cloudflare is using pages.dev for the domain.&quot; href=&quot;https://developers.cloudflare.com/pages/getting-started#add-a-custom-cname-record&quot;&gt;pages.dev&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Unlimited seats for free: additional collaborators shouldn’t break the bank. With Pages, you can add them all for free.&quot; href=&quot;https://pages.cloudflare.com/&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Workers has this, but that only shows how to do user auth with Auth0.&quot; href=&quot;https://developers.cloudflare.com/workers/tutorials/authorize-users-with-auth0&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes and No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I could find A / B testing for workers. Not for pages.&quot; href=&quot;https://developers.cloudflare.com/workers/examples/ab-testing&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;I looked and nothing says you can or cannot use for any personal or business website, however, their offerings do.&quot; href=&quot;https://pages.cloudflare.com/#pricing&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;vendor-card&quot;&gt;&lt;h3&gt;Firebase&lt;/h3&gt;&lt;div class=&quot;nutrition-facts&quot;&gt;&lt;h4&gt;Hosting Facts&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Build &amp;amp; Deploy&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Core Features&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/docs/hosting/test-preview-deploy&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;125k/mo&quot; href=&quot;https://firebase.google.com/docs/functions/quotas&quot;&gt;125k/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;540s wow!&quot; href=&quot;https://firebase.google.com/docs/functions/quotas&quot;&gt;540s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;No&quot; href=&quot;https://firebase.google.com/docs/hosting/custom-domain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting/usage-quotas-pricing&quot;&gt;10GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10GB&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;10GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting&quot;&gt;web.app and firebaseapp.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like they have this&quot; href=&quot;https://firebase.google.com/docs/auth/where-to-start&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Acceptable use has some simple things you agree not to&quot; href=&quot;https://cloud.google.com/terms/aup&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Usage Limits&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/docs/hosting/test-preview-deploy&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;125k/mo&quot; href=&quot;https://firebase.google.com/docs/functions/quotas&quot;&gt;125k/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;540s wow!&quot; href=&quot;https://firebase.google.com/docs/functions/quotas&quot;&gt;540s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;No&quot; href=&quot;https://firebase.google.com/docs/hosting/custom-domain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting/usage-quotas-pricing&quot;&gt;10GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10GB&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;10GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting&quot;&gt;web.app and firebaseapp.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like they have this&quot; href=&quot;https://firebase.google.com/docs/auth/where-to-start&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Acceptable use has some simple things you agree not to&quot; href=&quot;https://cloud.google.com/terms/aup&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Collaboration&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/docs/hosting/test-preview-deploy&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;125k/mo&quot; href=&quot;https://firebase.google.com/docs/functions/quotas&quot;&gt;125k/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;540s wow!&quot; href=&quot;https://firebase.google.com/docs/functions/quotas&quot;&gt;540s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;No&quot; href=&quot;https://firebase.google.com/docs/hosting/custom-domain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting/usage-quotas-pricing&quot;&gt;10GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10GB&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;10GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting&quot;&gt;web.app and firebaseapp.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like they have this&quot; href=&quot;https://firebase.google.com/docs/auth/where-to-start&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Acceptable use has some simple things you agree not to&quot; href=&quot;https://cloud.google.com/terms/aup&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Extras&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Not Applicable&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/docs/hosting/test-preview-deploy&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;125k/mo&quot; href=&quot;https://firebase.google.com/docs/functions/quotas&quot;&gt;125k/mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;540s wow!&quot; href=&quot;https://firebase.google.com/docs/functions/quotas&quot;&gt;540s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;No&quot; href=&quot;https://firebase.google.com/docs/hosting/custom-domain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting/usage-quotas-pricing&quot;&gt;10GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;10GB&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;10GB&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://firebase.google.com/docs/hosting&quot;&gt;web.app and firebaseapp.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like they have this&quot; href=&quot;https://firebase.google.com/docs/auth/where-to-start&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://firebase.google.com/pricing/&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Acceptable use has some simple things you agree not to&quot; href=&quot;https://cloud.google.com/terms/aup&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;vendor-card&quot;&gt;&lt;h3&gt;Render&lt;/h3&gt;&lt;div class=&quot;nutrition-facts&quot;&gt;&lt;h4&gt;Hosting Facts&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Build &amp;amp; Deploy&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;All builds currently have a timeout of 120 minutes.&quot; href=&quot;https://community.render.com/t/is-there-a-limit-for-how-long-a-build-is-allowed-to-take/175/3&quot;&gt;120 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Core Features&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;All builds currently have a timeout of 120 minutes.&quot; href=&quot;https://community.render.com/t/is-there-a-limit-for-how-long-a-build-is-allowed-to-take/175/3&quot;&gt;120 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://render.com/docs/pull-request-previews&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like they have this requested, but its not there yet, for $7 you could use https://www.openfaas.com/ on render.&quot; href=&quot;https://feedback.render.com/features/p/support-for-serverless-scripts&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/docs/custom-domains#adding-a-custom-domain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Automatic SSL certificate issuance and renewal using Let’s Encrypt.&quot; href=&quot;https://render.com/docs/static-sites&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;We do not have any request size restrictions. Just note that we do charge for bandwidth that exceeds 100GB in a month.&quot; href=&quot;https://community.render.com/t/request-size-limits/552&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/docs/static-sites&quot;&gt;None listed&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Every web service and static site on Render automatically gets a free onrender.com address which does not change.&quot; href=&quot;https://render.com/docs/custom-domains&quot;&gt;onrender.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Render allows you to share your site with other Render users for free so they can help you manage it through their own Render account.&quot; href=&quot;https://render.com/docs/static-sites#unlimited-collaborators&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;This idea may not be excatly this, but it&#39;s like it.&quot; href=&quot;https://feedback.render.com/features/p/password-protection-for-static-sites&quot;&gt;Planned&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;This feels like cheating, but /shrug, it works.&quot; href=&quot;https://feedback.render.com/features/p/render-form-submissions&quot;&gt;Yes - via Formspree integration&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/acceptable-use&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Usage Limits&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;All builds currently have a timeout of 120 minutes.&quot; href=&quot;https://community.render.com/t/is-there-a-limit-for-how-long-a-build-is-allowed-to-take/175/3&quot;&gt;120 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://render.com/docs/pull-request-previews&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like they have this requested, but its not there yet, for $7 you could use https://www.openfaas.com/ on render.&quot; href=&quot;https://feedback.render.com/features/p/support-for-serverless-scripts&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/docs/custom-domains#adding-a-custom-domain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Automatic SSL certificate issuance and renewal using Let’s Encrypt.&quot; href=&quot;https://render.com/docs/static-sites&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;We do not have any request size restrictions. Just note that we do charge for bandwidth that exceeds 100GB in a month.&quot; href=&quot;https://community.render.com/t/request-size-limits/552&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/docs/static-sites&quot;&gt;None listed&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Every web service and static site on Render automatically gets a free onrender.com address which does not change.&quot; href=&quot;https://render.com/docs/custom-domains&quot;&gt;onrender.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Render allows you to share your site with other Render users for free so they can help you manage it through their own Render account.&quot; href=&quot;https://render.com/docs/static-sites#unlimited-collaborators&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;This idea may not be excatly this, but it&#39;s like it.&quot; href=&quot;https://feedback.render.com/features/p/password-protection-for-static-sites&quot;&gt;Planned&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;This feels like cheating, but /shrug, it works.&quot; href=&quot;https://feedback.render.com/features/p/render-form-submissions&quot;&gt;Yes - via Formspree integration&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/acceptable-use&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Collaboration&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;All builds currently have a timeout of 120 minutes.&quot; href=&quot;https://community.render.com/t/is-there-a-limit-for-how-long-a-build-is-allowed-to-take/175/3&quot;&gt;120 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://render.com/docs/pull-request-previews&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like they have this requested, but its not there yet, for $7 you could use https://www.openfaas.com/ on render.&quot; href=&quot;https://feedback.render.com/features/p/support-for-serverless-scripts&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/docs/custom-domains#adding-a-custom-domain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Automatic SSL certificate issuance and renewal using Let’s Encrypt.&quot; href=&quot;https://render.com/docs/static-sites&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;We do not have any request size restrictions. Just note that we do charge for bandwidth that exceeds 100GB in a month.&quot; href=&quot;https://community.render.com/t/request-size-limits/552&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/docs/static-sites&quot;&gt;None listed&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Every web service and static site on Render automatically gets a free onrender.com address which does not change.&quot; href=&quot;https://render.com/docs/custom-domains&quot;&gt;onrender.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Render allows you to share your site with other Render users for free so they can help you manage it through their own Render account.&quot; href=&quot;https://render.com/docs/static-sites#unlimited-collaborators&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;This idea may not be excatly this, but it&#39;s like it.&quot; href=&quot;https://feedback.render.com/features/p/password-protection-for-static-sites&quot;&gt;Planned&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;This feels like cheating, but /shrug, it works.&quot; href=&quot;https://feedback.render.com/features/p/render-form-submissions&quot;&gt;Yes - via Formspree integration&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/acceptable-use&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-group&quot;&gt;&lt;br&gt;&lt;h5&gt;Extras&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time to Error&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;All builds currently have a timeout of 120 minutes.&quot; href=&quot;https://community.render.com/t/is-there-a-limit-for-how-long-a-build-is-allowed-to-take/175/3&quot;&gt;120 minutes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Build Time per Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Concurrent Builds&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Limits&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Unlisted&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Deploy Previews&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Yes&quot; href=&quot;https://render.com/docs/pull-request-previews&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Serverless Functions&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Looks like they have this requested, but its not there yet, for $7 you could use https://www.openfaas.com/ on render.&quot; href=&quot;https://feedback.render.com/features/p/support-for-serverless-scripts&quot;&gt;Not for free&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Invocations/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Duration Allowed&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;DNS Management&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/docs/custom-domains#adding-a-custom-domain&quot;&gt;No&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;HTTPS Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Automatic SSL certificate issuance and renewal using Let’s Encrypt.&quot; href=&quot;https://render.com/docs/static-sites&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Bandwidth/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;We do not have any request size restrictions. Just note that we do charge for bandwidth that exceeds 100GB in a month.&quot; href=&quot;https://community.render.com/t/request-size-limits/552&quot;&gt;100GB/Mo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Site Limit&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/docs/static-sites&quot;&gt;None listed&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Default URL&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Every web service and static site on Render automatically gets a free onrender.com address which does not change.&quot; href=&quot;https://render.com/docs/custom-domains&quot;&gt;onrender.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Team Members&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Render allows you to share your site with other Render users for free so they can help you manage it through their own Render account.&quot; href=&quot;https://render.com/docs/static-sites#unlimited-collaborators&quot;&gt;Unlimited&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Team SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;# of Users&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;This idea may not be excatly this, but it&#39;s like it.&quot; href=&quot;https://feedback.render.com/features/p/password-protection-for-static-sites&quot;&gt;Planned&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;User SSO Available&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Form Submissions/Month&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;This feels like cheating, but /shrug, it works.&quot; href=&quot;https://feedback.render.com/features/p/render-form-submissions&quot;&gt;Yes - via Formspree integration&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Analytics&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Split A/B Testing&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;No&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;feature[0] in&lt;br&gt;&lt;/p&gt;&lt;div class=&quot;feature-item critical-feature&quot;&gt;&lt;br&gt;&lt;div class=&quot;feature-label&quot;&gt;Allowed for Business Use&lt;/div&gt;&lt;br&gt;&lt;div class=&quot;feature-value&quot;&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a title href=&quot;https://render.com/acceptable-use&quot;&gt;Yes&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;script&gt;let selectedVendors = [];
const maxVendors = 2;

function showTable() {
  document.getElementById(&#39;comparison-table&#39;).style.display = &#39;block&#39;;
  document.getElementById(&#39;vendor-cards&#39;).style.display = &#39;none&#39;;
  document.getElementById(&#39;table-btn&#39;).classList.add(&#39;active&#39;);
  document.getElementById(&#39;cards-btn&#39;).classList.remove(&#39;active&#39;);
  updateTableVisibility();
}

function showCards() {
  document.getElementById(&#39;comparison-table&#39;).style.display = &#39;none&#39;;
  document.getElementById(&#39;vendor-cards&#39;).style.display = &#39;grid&#39;;
  document.getElementById(&#39;table-btn&#39;).classList.remove(&#39;active&#39;);
  document.getElementById(&#39;cards-btn&#39;).classList.add(&#39;active&#39;);
  updateCardVisibility();
}

function handleVendorSelection(checkbox) {
  const vendor = checkbox.value;
  const isChecked = checkbox.checked;
  
  if (isChecked) {
    if (selectedVendors.length &gt;= maxVendors) {
      // If we&#39;re at the limit, uncheck this box and show a message
      checkbox.checked = false;
      alert(`You can only select up to ${maxVendors} vendors for comparison.`);
      return;
    }
    selectedVendors.push(vendor);
  } else {
    selectedVendors = selectedVendors.filter(v =&gt; v !== vendor);
  }
  
  // Update visual state
  updateCheckboxStyles();
  
  // Update the displayed content based on current view
  const isTableView = document.getElementById(&#39;table-btn&#39;).classList.contains(&#39;active&#39;);
  if (isTableView) {
    updateTableVisibility();
  } else {
    updateCardVisibility();
  }
}

function updateCheckboxStyles() {
  const checkboxes = document.querySelectorAll(&#39;.vendor-checkbox&#39;);
  checkboxes.forEach(label =&gt; {
    const checkbox = label.querySelector(&#39;input[type=&quot;checkbox&quot;]&#39;);
    if (checkbox.checked) {
      label.classList.add(&#39;checked&#39;);
    } else {
      label.classList.remove(&#39;checked&#39;);
    }
  });
}

function updateTableVisibility() {
  const table = document.querySelector(&#39;#comparison-table table&#39;);
  if (!table) return;
  
  const headers = table.querySelectorAll(&#39;thead th&#39;);
  const rows = table.querySelectorAll(&#39;tbody tr&#39;);
  
  // Show/hide columns based on selected vendors
  headers.forEach((header, index) =&gt; {
    if (index === 0) return; // Always show the &quot;Feature&quot; column
    
    const vendorName = header.textContent.trim();
    const shouldShow = selectedVendors.length === 0 || selectedVendors.includes(vendorName);
    header.style.display = shouldShow ? &#39;&#39; : &#39;none&#39;;
  });
  
  // Show/hide corresponding cells in each row
  rows.forEach(row =&gt; {
    const cells = row.querySelectorAll(&#39;td, th&#39;);
    cells.forEach((cell, index) =&gt; {
      if (index === 0) return; // Always show the feature name column
      
      const headers = table.querySelectorAll(&#39;thead th&#39;);
      const vendorName = headers[index] ? headers[index].textContent.trim() : &#39;&#39;;
      const shouldShow = selectedVendors.length === 0 || selectedVendors.includes(vendorName);
      cell.style.display = shouldShow ? &#39;&#39; : &#39;none&#39;;
    });
  });
}

function updateCardVisibility() {
  const cards = document.querySelectorAll(&#39;.vendor-card&#39;);
  cards.forEach(card =&gt; {
    const vendorName = card.querySelector(&#39;h3&#39;).textContent.trim();
    const shouldShow = selectedVendors.length === 0 || selectedVendors.includes(vendorName);
    card.style.display = shouldShow ? &#39;block&#39; : &#39;none&#39;;
  });
}

// Initialize with first 2 vendors selected
document.addEventListener(&#39;DOMContentLoaded&#39;, function() {
  const checkboxes = document.querySelectorAll(&#39;.vendor-checkbox input[type=&quot;checkbox&quot;]&#39;);
  checkboxes.forEach((checkbox, index) =&gt; {
    if (index &lt; maxVendors &amp;&amp; checkbox.checked) {
      selectedVendors.push(checkbox.value);
    }
  });
  updateCheckboxStyles();
  updateTableVisibility();
});&lt;/script&gt;&lt;h2 id=&quot;comments&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/cloudflare-pages-netlify-vercel-github-pages-and-gitlab-pages-where-to-host-for-free/#comments&quot; class=&quot;heading-anchor&quot;&gt;Comments&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/yashwanth2804&quot; rel=&quot;noopener&quot;&gt;yashwanth2804&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/260#issuecomment-873416684&quot; rel=&quot;noopener&quot;&gt;on Jul 3, 2021&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Great JOB, please also include the if the free tire allows to have commercial website&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/260#issuecomment-875032990&quot; rel=&quot;noopener&quot;&gt;on Jul 6, 2021&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/yashwanth2804&quot; rel=&quot;noopener&quot;&gt;@yashwanth2804&lt;/a&gt;&amp;nbsp;I thought I did include that… Allowed for Business Use is the label.&lt;/p&gt;&lt;p&gt;I can relabel it or you can make a PR.&lt;/p&gt;&lt;p&gt;Just modify this file as needed.&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/blob/master/src/_data/ssg.js&quot; rel=&quot;noopener&quot;&gt;https://github.com/jacebenson/jace.pro/blob/master/src/_data/ssg.js&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/fmartins-andre&quot; rel=&quot;noopener&quot;&gt;fmartins-andre&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/260#issuecomment-901362924&quot; rel=&quot;noopener&quot;&gt;on Aug 18, 2021&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Vercel free tier is not allowed to business use! Netlify and CloudFlare Pages are.&lt;br&gt;These I checked.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/260#issuecomment-901602297&quot; rel=&quot;noopener&quot;&gt;on Aug 18, 2021&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Thanks I’ll update the page&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/260#issuecomment-901962252&quot; rel=&quot;noopener&quot;&gt;on Aug 19, 2021&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Can you share your sources for this?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/fmartins-andre&quot; rel=&quot;noopener&quot;&gt;fmartins-andre&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/260#issuecomment-902107504&quot; rel=&quot;noopener&quot;&gt;on Aug 19, 2021&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://vercel.com/docs/platform/fair-use-policy#commercial-usage&quot; rel=&quot;noopener&quot;&gt;https://vercel.com/docs/platform/fair-use-policy#commercial-usage&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Here, mate.&lt;br&gt;I didn’t find anything like this in Netlify or Cloudflare Pages.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/260#issuecomment-902182720&quot; rel=&quot;noopener&quot;&gt;on Aug 19, 2021&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For Vercel, I didn’t see that when I looked before.&lt;br&gt;I’ve updated it.&lt;/p&gt;&lt;p&gt;I looked again for Cloudflare, they dont say aynthing one way or the other. Where as Github explicitly says you can’t. So I’m making an assumption. Below the table I add a comment to each element.&lt;/p&gt;&lt;p&gt;I looked again at Netlify and like you said it’s not explicitly stated, but they also don’t say you cannot. There’s a post about it on their answers site here where they say, don’t&amp;nbsp;&lt;a href=&quot;https://answers.netlify.com/t/is-the-free-tier-safe-for-client-projects/13535&quot; rel=&quot;noopener&quot;&gt;break the TOS and you wont have an issue&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/fmartins-andre&quot; rel=&quot;noopener&quot;&gt;fmartins-andre&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/260#issuecomment-902190872&quot; rel=&quot;noopener&quot;&gt;on Aug 19, 2021&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I think it’s secure to assume that if they say nothing, you can use it for business purposes. But it seems to these free tier solutions are all under the same kind of discretion about the termination of the offer. Vercel also has some statements about this:&lt;/p&gt;&lt;blockquote&gt;&lt;ol start=&quot;4&quot;&gt;&lt;li&gt;Hobby Plan. We offer a free hobby plan at our sole discretion. We may change the terms and conditions applicable to the hobby plan or discontinue offering the hobby plan at any time. We reserve the right to disable or remove any project or website deployment on the hobby plan with or without notice at our sole discretion. We may shut down and terminate projects or deployments using the hobby plan without notice for any reason or no reason.(…)&lt;br&gt;–(&lt;a href=&quot;https://vercel.com/legal/terms&quot; rel=&quot;noopener&quot;&gt;https://vercel.com/legal/terms&lt;/a&gt;)&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/dacog&quot; rel=&quot;noopener&quot;&gt;dacog&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/260#issuecomment-948915832&quot; rel=&quot;noopener&quot;&gt;on Oct 21, 2021&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Great comparison! Thank you!&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>New ServiceNow CLI</title>
      <link href="https://jace.pro/blog/new-servicenow-cli/" />
      <updated>2020-11-20T00:00:00Z</updated>
      <id>https://jace.pro/blog/new-servicenow-cli/</id>
      <content type="html">
				&lt;p&gt;Tonight I popped in the latest Let’s Code Happy Hour on ServiceNow’s Youtube channel. They were going to “Enhance the Karaoke App” that Chuck Tomasi maintains.&lt;br&gt;It’s great fun. The technology they choose to preview is not available yet. It’s neat. I wanted to write about it before I forget since&amp;nbsp;&lt;strong&gt;THIS IS NOT DOCUMENTED ANYWHERE YET&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;At&amp;nbsp;&lt;a href=&quot;https://youtu.be/3tXqzXyyvxY?t=547&quot; rel=&quot;noopener&quot;&gt;9:07 on the stream&lt;/a&gt;&amp;nbsp;Chuck starts summarizing what this is. Below I have that quote;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;We are going to be using the new cli.&lt;br&gt;Which will be coming out shortly.&lt;br&gt;This is a preview.&lt;br&gt;I did ask our product people,&amp;nbsp;&lt;em&gt;“Can I show this &#39;cause its not publicly available yet?”&lt;/em&gt;&amp;nbsp;It will be available in the store, you install the plugin, or the module, or whataver it is.&lt;br&gt;And you will be able to configure endpoints.&lt;br&gt;&lt;strong&gt;Think of it as a custom curl if you will, but you dont have to specify the full url or your credentials and all the stuff to be able to run macros.&lt;/strong&gt;&lt;br&gt;From a command line (linux mac windows) you could automate some more stuff and integrate with scripted rest apis or the table apis or any of the built in apis to be able to carry out actions&lt;br&gt;and trigger them in the instance from a command line.&lt;br&gt;Chuck Tomasi&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This seems pretty sweet. During the stream I was thinking about some possible use cases;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Start up script on a server to check in with ServiceNow&lt;/li&gt;&lt;li&gt;Generate Release Notes for ServiceNow Releases&lt;/li&gt;&lt;li&gt;Create a task (change request, item, incident)&lt;/li&gt;&lt;li&gt;Update a record&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That all seems … powerful.&lt;/p&gt;&lt;p&gt;I can see this getting some good usage.&lt;/p&gt;&lt;p&gt;I asked “where do I get this?”. It’s not out yet and will be release&amp;nbsp;&lt;em&gt;soon&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://youtu.be/3tXqzXyyvxY?t=1937&quot; rel=&quot;noopener&quot;&gt;One other thing mentioned&lt;/a&gt;&amp;nbsp;about how to get new commands&amp;nbsp;&lt;code&gt;snc&lt;/code&gt;;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Yea and so what that does right is that&lt;br&gt;connects to the instance and goes and&lt;br&gt;you know introspects those table in which&lt;br&gt;you were editing those records and pulls&lt;br&gt;down any new command so that you can engage&lt;br&gt;with them here.&lt;br&gt;Andrew Barnes&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;what-does-this-look-like-on-the-terminal&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/new-servicenow-cli/#what-does-this-look-like-on-the-terminal&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-11-20-sn-cli-preview/#what-does-this-look-like-on-the-terminal&quot; rel=&quot;noopener&quot;&gt;What does this look like on the terminal?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I typed out what was on his terminal below.&lt;/p&gt;--&amp;gt; --&amp;gt; --&amp;gt;&lt;h2 id=&quot;this-new-thing-uses-three-tables&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/new-servicenow-cli/#this-new-thing-uses-three-tables&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-11-20-sn-cli-preview/#this-new-thing-uses-three-tables&quot; rel=&quot;noopener&quot;&gt;This new thing uses three tables&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;End Points [&lt;code&gt;sn_cli_metadata_end_point&lt;/code&gt;]&lt;/li&gt;&lt;li&gt;Command Groups [&lt;code&gt;sn_cli_metadata_command_group&lt;/code&gt;]&lt;/li&gt;&lt;li&gt;Commands [&lt;code&gt;sn_cli_metadata_command&lt;/code&gt;]&lt;/li&gt;&lt;/ul&gt;--&amp;gt; --&amp;gt; --&amp;gt; --&amp;gt;&lt;h2 id=&quot;what-are-my-thoughts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/new-servicenow-cli/#what-are-my-thoughts&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-11-20-sn-cli-preview/#what-are-my-thoughts&quot; rel=&quot;noopener&quot;&gt;What are my thoughts?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Well this is cool. I wish I could play with it. I hope it isn’t attached to some random SKU.&lt;/p&gt;&lt;p&gt;This&amp;nbsp;&lt;em&gt;might&lt;/em&gt;&amp;nbsp;get some serious usage if non-admins get permissions to use it.&lt;/p&gt;&lt;p&gt;Could I have used this in the past. Yes.&lt;/p&gt;&lt;p&gt;In the past when I’ve needed to connect to ServiceNow send up data to the instance. In those cases, this could have been helpful.&lt;/p&gt;&lt;p&gt;The ServiceNow CLI looks cool. It’s a new feature I will mess with.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Listacle of interesting posts</title>
      <link href="https://jace.pro/blog/listacle-of-interesting-posts/" />
      <updated>2020-10-23T00:00:00Z</updated>
      <id>https://jace.pro/blog/listacle-of-interesting-posts/</id>
      <content type="html">
				&lt;p&gt;I think I’m going to start some sort of review of the content from my news aggregater.&lt;/p&gt;&lt;p&gt;I’m not sure what format this will end up in but I’ll start here in written form.&lt;/p&gt;&lt;p&gt;Let’s dig in.&lt;/p&gt;&lt;p&gt;There’s some great content for the Creatorcon 2020 event. So far&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:CC20-CCB1010&quot; rel=&quot;noopener&quot;&gt;Prosenjit Sengupta - UI Builder: Build a Space App dashboard for Mars Rovers, Astro Images and NEOs&lt;/a&gt;&lt;br&gt;This is great. He shows a lot of the functionality of the Now Components and Experience with the builder. It’s 22 minutes, or 11 if you can run at doublespeed.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FU04cqUXIko&quot; rel=&quot;noopener&quot;&gt;TechNow Ep 80 - Process Automation Designer/Playbook Part 1&lt;/a&gt;&lt;br&gt;If you’re curious about how the PAD system will look and work, this should meet the need.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/blog.do?p=/post/paris-graphql-framework/&quot; rel=&quot;noopener&quot;&gt;Brad Titlon - Paris - GraphQL API Framework&lt;/a&gt;&lt;br&gt;Brad went deep in here to help share this understanding of graphQL. If you don’t get it. I’d look here.&lt;/li&gt;&lt;li&gt;Travis Toulson has been doing some live streams to tackle the Salary Survey he ran through. It’s not&amp;nbsp;&lt;em&gt;on&lt;/em&gt;&amp;nbsp;ServiceNow but it’s related.&lt;br&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Lag14qxWYdU&quot; rel=&quot;noopener&quot;&gt;Part 1&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=BUWNPJfMGgU&quot; rel=&quot;noopener&quot;&gt;Part 2&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=g1lHRMfZEMY&quot; rel=&quot;noopener&quot;&gt;Part 3&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=wHzt7dECCdg&quot; rel=&quot;noopener&quot;&gt;Part 4&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Mark Roethof dives deep into&amp;nbsp;&lt;code&gt;g_form.setValue&lt;/code&gt;&amp;nbsp;I love these smaller scoped topics.&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=e047d880db8c245466f1d9d968961994&quot; rel=&quot;noopener&quot;&gt;Check it out here.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=b222ee63db7fd454a08a1ea668961933&quot; rel=&quot;noopener&quot;&gt;Madison writes about “Storing And Using System Properties As Objects”&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Mike Moody has been putting out the kind of content I want to see at K21. Recently,&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_video&amp;amp;sys_id=a47f4af3db37d05466f1d9d968961901&quot; rel=&quot;noopener&quot;&gt;Triggering client-side UI Notifications on Async API response or long running job completion.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Nia McCash is killing it with her posts about Now Components.&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=e85238cedb7f989066f1d9d968961995&quot; rel=&quot;noopener&quot;&gt;How I’m Learning to Build Now Components&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=a4485f701b402410305fea89bd4bcba6&quot; rel=&quot;noopener&quot;&gt;Demistifying Now Components Slots - Named vs Default (Unnamed)&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=8015b4a7dbb79854fb115583ca96198b&quot; rel=&quot;noopener&quot;&gt;How to idenfity which Now Component Button was clicked&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Oh and if you want to hear some tough times Fedoruk and CJ went through their most recent pod about the&amp;nbsp;&lt;a href=&quot;https://share.transistor.fm/s/3889310f&quot; rel=&quot;noopener&quot;&gt;worst things they’ve seen&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>How to override a UI Action</title>
      <link href="https://jace.pro/blog/how-to-override-a-ui-action/" />
      <updated>2020-10-13T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-override-a-ui-action/</id>
      <content type="html">
				&lt;p&gt;Someone asked the other day, how to override the “Submit” ui action for incident.&lt;/p&gt;&lt;p&gt;Let me start with why you shouldn’t change the oob “Submit” ui action. There is no specific “Submit” ui action for incident. So if you change the one on “global”, it will change it for all tables. That is not the desired outcome.&lt;/p&gt;&lt;p&gt;Instead you should create a new UI action against the table you want with the same “Action Name”. The new UI action should be all set then.&lt;/p&gt;&lt;p&gt;Chuck Tomasi discusses this on a stream&amp;nbsp;&lt;a href=&quot;https://youtu.be/_G8X9bi8spE?t=2496&quot; rel=&quot;noopener&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Hacktoberfest 2020 - lets get started</title>
      <link href="https://jace.pro/blog/hacktoberfest-2020-lets-get-started/" />
      <updated>2020-09-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/hacktoberfest-2020-lets-get-started/</id>
      <content type="html">
				&lt;p&gt;I was thinking something about your past experience and why you think people should participate, but it could really be whatever you want.&lt;br&gt;What is it, why do you think it’s worth participating, how did you get started, what does it typically look like, what is a quality pull request, then how do they get started at the end.&lt;/p&gt;&lt;h1 id=&quot;what-is-hacktoberfest&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/hacktoberfest-2020-lets-get-started/#what-is-hacktoberfest&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-09-29-hacktoberfest-2020/#what-is-hacktoberfest&quot; rel=&quot;noopener&quot;&gt;What is Hacktoberfest&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://hacktoberfest.digitalocean.com/&quot; title=&quot;Hacktoberfest&quot; rel=&quot;noopener&quot;&gt;Hacktoberfest&lt;/a&gt;&amp;nbsp;is a event run by stewards of open source to encourage contributing to projects that are also open source.&lt;/p&gt;&lt;h1 id=&quot;why-participate-in-hactoberfest&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/hacktoberfest-2020-lets-get-started/#why-participate-in-hactoberfest&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-09-29-hacktoberfest-2020/#why-participate-in-hactoberfest&quot; rel=&quot;noopener&quot;&gt;Why participate in Hactoberfest&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;The more able you have your community, the more that community can contribute.&lt;/li&gt;&lt;li&gt;When you have that, you can help any number of open source projects.&lt;/li&gt;&lt;li&gt;There’s a free t-shirt. We’re all very&amp;nbsp;&lt;a href=&quot;https://codecreative.io/blog/service-now-salary-influence-survey-2020/&quot; rel=&quot;noopener&quot;&gt;well paid&lt;/a&gt;,&lt;br&gt;but this shirt will convince most of you.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Okay now that your convinced (if you’re not see the third bullet, it’s, um enticing).&lt;br&gt;What kinds of contributions do you have to make for this?&lt;br&gt;GitHub focuses on “Quality contributions”.&lt;br&gt;What does that mean? Does this solve a problem or issue on the project, sounds good to me.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Quantity is fun, quality is key&quot; - Hacktoberfests Value #2&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;what-is-a-quality-pull-request&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/hacktoberfest-2020-lets-get-started/#what-is-a-quality-pull-request&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-09-29-hacktoberfest-2020/#what-is-a-quality-pull-request&quot; rel=&quot;noopener&quot;&gt;What is a quality pull request&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I’d wager anything is meaningful.&lt;br&gt;That could be something as simple as cleaning up the&amp;nbsp;&lt;a href=&quot;http://contributors.md/&quot; rel=&quot;noopener&quot;&gt;CONTRIBUTORS.md&lt;/a&gt;&amp;nbsp;file to something as complex as adding an integration to read the public Known Errors out of ServiceNow.&lt;/p&gt;&lt;h1 id=&quot;how-did-i-get-started&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/hacktoberfest-2020-lets-get-started/#how-did-i-get-started&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-09-29-hacktoberfest-2020/#how-did-i-get-started&quot; rel=&quot;noopener&quot;&gt;How did I get started&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Why did I start doing the Hacktoberfest events? For me, it’s all about doing something, anything.&lt;br&gt;Hacktoberfest started in 2013. I didn’t know about it until 2016. I’m pretty sure I got the shirt that year, but I can’t find the evidence.&lt;/p&gt;&lt;p&gt;Do you want get more familiar with git? Do you want to learn something new? Great, nothing like Hacktoberfest to push you into something. That’s my take on it.&lt;br&gt;Git can be confusing. Heck, I still have problems. I’d never had done it without something to do.&lt;/p&gt;&lt;p&gt;I try learn something every October with this event. This year my focus is Now Components.&lt;/p&gt;&lt;h1 id=&quot;how-do-you-get-started&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/hacktoberfest-2020-lets-get-started/#how-do-you-get-started&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-09-29-hacktoberfest-2020/#how-do-you-get-started&quot; rel=&quot;noopener&quot;&gt;How do you get started?&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Find a open source project you’d like to contribute to.&lt;br&gt;I know I’ve had some.&lt;/p&gt;&lt;p&gt;Here’s a short list of projects I’d suggest looking at;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/ServiceNowDevProgram/sn-slack-points-thing/&quot; rel=&quot;noopener&quot;&gt;Slacker&lt;/a&gt;&amp;nbsp;on&amp;nbsp;&lt;a href=&quot;https://sndevs.slack.com/&quot; rel=&quot;noopener&quot;&gt;SNDevs&lt;/a&gt;, you know you want to make this better.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/j4rodm/sn-libra/&quot; rel=&quot;noopener&quot;&gt;Libra&lt;/a&gt;&amp;nbsp;is a toolkit of utilies to use on development instances.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/NowComponents/nowcomponents.github.io/&quot; rel=&quot;noopener&quot;&gt;NowComponents&lt;/a&gt;&amp;nbsp;Catalog of open source Now Components for the Now Experience.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/jacebenson/cajunbot&quot; rel=&quot;noopener&quot;&gt;Cajunbot&lt;/a&gt;&amp;nbsp;on Discord (used on the&amp;nbsp;&lt;a href=&quot;https://discord.gg/QaMwnGd&quot; rel=&quot;noopener&quot;&gt;unoffical ServiceNow Discord&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/jacebenson/news-api&quot; rel=&quot;noopener&quot;&gt;ServiceNow News Aggregetor&lt;/a&gt;&amp;nbsp;See it in action here&amp;nbsp;&lt;a href=&quot;https://news.jace.pro/&quot; rel=&quot;noopener&quot;&gt;news.jace.pro&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/jacebenson/sndocs&quot; rel=&quot;noopener&quot;&gt;ServiceNow Version Tracker&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/jacebenson/workflow&quot; rel=&quot;noopener&quot;&gt;Workflow&lt;/a&gt;&amp;nbsp;is tool to visualize diagrams in a markdown like text where there’s also some standard flows&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If none of those stand out, here’s the&amp;nbsp;&lt;a href=&quot;https://github.com/search?q=label%3Ahacktoberfest+state%3Aopen+no%3Aassignee+is%3Aissue&amp;amp;type=Issues&quot; rel=&quot;noopener&quot;&gt;link to issues from the official site&lt;/a&gt;&lt;/p&gt;&lt;h1 id=&quot;what-does-it-typically-look-like&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/hacktoberfest-2020-lets-get-started/#what-does-it-typically-look-like&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-09-29-hacktoberfest-2020/#what-does-it-typically-look-like&quot; rel=&quot;noopener&quot;&gt;What does it typically look like&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Most projects follow the “&lt;a href=&quot;https://guides.github.com/introduction/flow/&quot; title=&quot;GitHub Flow&quot; rel=&quot;noopener&quot;&gt;GitHub Flow&lt;/a&gt;”.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Find an issue, comment on it to claim it.&lt;/li&gt;&lt;li&gt;Fork the repository&lt;/li&gt;&lt;li&gt;Clone the repository&lt;/li&gt;&lt;li&gt;Create a branch&lt;/li&gt;&lt;li&gt;Make the changes to address the issue&lt;/li&gt;&lt;li&gt;Commit the changes to your fork’s branch&lt;/li&gt;&lt;li&gt;Push your changes to your fork’s branch&lt;/li&gt;&lt;li&gt;Open a Pull Request&lt;/li&gt;&lt;li&gt;Answer questions by the project maintainer and help where you can to get the work accepted&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That seems like a lot but really it isn’t that much. Generally that’s as complicated as it gets.&lt;/p&gt;&lt;p&gt;I’d love to see more folks contribute in the groups I watch. (I’m looking at 8000 strong from SNDevs Slack, and you smaller Discord community).&lt;/p&gt;&lt;p&gt;There’s great content on&amp;nbsp;&lt;a href=&quot;https://dev.to/tcgronk/beginners-guide-to-hacktoberfest-3m0m&quot; title=&quot;Beginners Guide to Hacktoberfest&quot; rel=&quot;noopener&quot;&gt;Dev.to&lt;/a&gt;&amp;nbsp;about starting from nothing.&lt;/p&gt;&lt;h1 id=&quot;go-contribute&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/hacktoberfest-2020-lets-get-started/#go-contribute&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-09-29-hacktoberfest-2020/#go-contribute&quot; rel=&quot;noopener&quot;&gt;Go contribute&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Add text here about contributing or creating a project.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>GraphQL in a way I understand</title>
      <link href="https://jace.pro/blog/graphql-in-a-way-i-understand/" />
      <updated>2020-09-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/graphql-in-a-way-i-understand/</id>
      <content type="html">
				&lt;p&gt;I have been dabbling with GraphQL for some time now but I still don’t know much about it. Now that we, ServiceNow Developers, have to make the definitions for them we need to know a lot more. I was going to try to write a post about all that but Marcus Reinhardt has an amazing resource.&amp;nbsp;&lt;a href=&quot;https://github.com/noxify/ServiceNow-GraphQL-Example&quot; rel=&quot;noopener&quot;&gt;https://github.com/noxify/ServiceNow-GraphQL-Example&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This is a short post and something so I can find it easily but again thank you Marcus!&lt;/p&gt;&lt;p&gt;Other Resources&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-application-development/page/integrate/graphql/concept/scripted-graph-ql.html&quot; rel=&quot;noopener&quot;&gt;Paris Concept Docs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://servicenowthink.wordpress.com/2019/09/10/how-servicenow-is-updating-its-tech-stack-and-using-graphql/&quot; rel=&quot;noopener&quot;&gt;Undocumented GraphQL thing&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Undocumented - Setting User Preferences via URL</title>
      <link href="https://jace.pro/blog/undocumented-setting-user-preferences-via-url/" />
      <updated>2020-09-03T00:00:00Z</updated>
      <id>https://jace.pro/blog/undocumented-setting-user-preferences-via-url/</id>
      <content type="html">
				&lt;p&gt;The other day on slack I read that you can set any user preference via URL by using this parameter scheme;&lt;/p&gt;&lt;p&gt;&lt;code&gt;https://hi.service-now.com/incident_list.do?sysparm_userpref_literally_anything=whatever&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Just replace&amp;nbsp;&lt;code&gt;literally_anything&lt;/code&gt;&amp;nbsp;with the preference name, and the&amp;nbsp;&lt;code&gt;whatever&lt;/code&gt;&amp;nbsp;with the value you want.&lt;/p&gt;&lt;p&gt;This seems like something you could use to possibly change language, timezone, update set, row limits. With that being said, anyone can do this so be careful.&lt;/p&gt;&lt;p&gt;I don’t know that I trust anyone’s links but I will take more care to look at them now. I am not sure if this works with the&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-platform-user-interface/page/use/navigation/task/t_EnableTinyURLSupport.html&quot; rel=&quot;noopener&quot;&gt;tiny url support&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I did a quick search on the docs site for&amp;nbsp;&lt;code&gt;sysparm_userpref&lt;/code&gt;&amp;nbsp;and you can see it’s used in a number of pages but not really clear what it’s doing. According to the&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/geneva-release-notes/page/release-notes/r_Geneva-Patch-6.html&quot; rel=&quot;noopener&quot;&gt;Genava Patch 6 page&lt;/a&gt;&amp;nbsp;it can disable concourse which goes to show you, it does in fact set prefrences.&lt;/p&gt;&lt;p&gt;The more you know!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Careful with reserved words</title>
      <link href="https://jace.pro/blog/careful-with-reserved-words/" />
      <updated>2020-09-03T00:00:00Z</updated>
      <id>https://jace.pro/blog/careful-with-reserved-words/</id>
      <content type="html">
				&lt;p&gt;If you have a variable say “class” or “package” when calling them via a script you will get weird results. I’d advise to avoid this list of names for columns.&lt;/p&gt;&lt;h2 id=&quot;javascript-reserved-words&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/careful-with-reserved-words/#javascript-reserved-words&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-09-03-reserved-words/#javascript-reserved-words&quot; rel=&quot;noopener&quot;&gt;Javascript Reserved Words&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;abstract&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;arguments&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;await&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;break&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;byte&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;case&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;catch&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;char&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;class&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;const&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;continue&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;debugger&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;default&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;delete&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;do&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;double&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;else&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;enum&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;eval&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;export&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;extends&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;final&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;finally&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;for&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;function&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;goto&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;if&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;implements&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;import&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;in&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;instanceof&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;int&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;interface&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;let&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;long&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;native&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;new&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;package&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;private&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;protected&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;public&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;return&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;short&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;static&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;super&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;switch&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;synchronized&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;this&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;throw&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;throws&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;transient&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;try&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;typeof&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;var&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;void&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;volatile&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;while&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;with&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;yield&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Try it out. make a catalog item. make a variable, call it “class”, try to use that variable in a refernce qualifer and observe weird things.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-application-development/page/script/topic/c_Script.html&quot; rel=&quot;noopener&quot;&gt;The docs also say, “you cannot use reserved words”&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Other’s have had issues using these terms for column names. If you can, avoid that so you don’t have the&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=fddbba91dbbf48945129a851ca961933&quot; rel=&quot;noopener&quot;&gt;same problem here as Detlef&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;mysql-reserved-words&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/careful-with-reserved-words/#mysql-reserved-words&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-09-03-reserved-words/#mysql-reserved-words&quot; rel=&quot;noopener&quot;&gt;MysQL Reserved Words&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-platform-administration/page/use/reporting/concept/c_DatabaseViews.html#d771413e105&quot; rel=&quot;noopener&quot;&gt;Database view reserved words&lt;/a&gt;&amp;nbsp;seems to be different and dependent on&amp;nbsp;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/keywords.html&quot; rel=&quot;noopener&quot;&gt;MysQL’s list&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>State of Ideas</title>
      <link href="https://jace.pro/blog/state-of-ideas/" />
      <updated>2020-08-18T00:00:00Z</updated>
      <id>https://jace.pro/blog/state-of-ideas/</id>
      <content type="html">
				&lt;p&gt;The Idea portal is great in that we can share these … what were enhancements on HI with eachother. However, it still feels like a black box of not happening. Most ideas aren’t actioned on and the ones that are, are confusing. Here’s a list of ones I’ve been tracking. There is no way to comment on a idea once closed so no way to add context or respond. This is frustrating when it’s closed without handling the specifics the original question or ask.&lt;/p&gt;&lt;p&gt;At&amp;nbsp;&lt;strong&gt;417&lt;/strong&gt;&amp;nbsp;upvotes, and submitted 10 months ago by me. Now in “Under Review”,&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=view_idea&amp;amp;sysparm_idea_id=d60a8d46db6c04500be6a345ca961996&amp;amp;sysparm_idea_table=x_snc_com_ideation_idea&amp;amp;sysparm_module_id=enhancement_requests&quot; rel=&quot;noopener&quot;&gt;Create a public ROADMAP of features/plugins for upcoming releases&lt;/a&gt;. This is still outstanding. According to the Idea Portal page, things in this state should be dispositioned in 6 weeks.&lt;/p&gt;&lt;p&gt;At&amp;nbsp;&lt;strong&gt;285&lt;/strong&gt;&amp;nbsp;upvotes, and submitted 10 months ago by Matt Warwick. Sometime in June, it was closed with&amp;nbsp;&lt;strong&gt;“Unlikely to implement”&lt;/strong&gt;, “&lt;a href=&quot;https://community.servicenow.com/community?id=view_idea&amp;amp;sysparm_idea_id=fba89402dbe0801014d6fb2439961936&amp;amp;sysparm_idea_table=x_snc_com_ideation_idea&amp;amp;sysparm_module_id=enhancement_requests&quot; rel=&quot;noopener&quot;&gt;Improve WYSIWYG HTML Editor/TinyMCE&lt;/a&gt;”. This is long overdue. Paris release notes have some TinyMCE enhancements but also the comment says, “This feature has been added in the Paris release.”. Which is it? I asked on&amp;nbsp;&lt;a href=&quot;https://twitter.com/jacebenson/status/1283980567915253762?s=20&quot; rel=&quot;noopener&quot;&gt;Twitter&lt;/a&gt;. It’s still unclear.&lt;/p&gt;&lt;p&gt;At&amp;nbsp;&lt;strong&gt;184&lt;/strong&gt;&amp;nbsp;upvotes, and submitted 10 months ago by Alexander. On 2020-08-18 it was changed to “In Consideration”, &quot;&lt;br&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=view_idea&amp;amp;sysparm_idea_id=7ef66823dbacc0d014d6fb24399619c1&amp;amp;sysparm_idea_table=x_snc_com_ideation_idea&amp;amp;sysparm_module_id=enhancement_requests&quot; rel=&quot;noopener&quot;&gt;Copy / Paste images and attachments from clipboard&lt;/a&gt;&quot;. This idea is not new. I am actually suprised it’s not already done yet. The change is not large to do it. I’ve two posts for implementing it but we shouldn’t have to do this. It should be standard.&lt;/p&gt;&lt;p&gt;At 80 upvotes, and submitted 9 months ago by Drew. On 2020-08-12 it wsa changed to&amp;nbsp;&lt;strong&gt;“Unlikely to implement”&lt;/strong&gt;, “&lt;a href=&quot;https://community.servicenow.com/community?id=view_idea&amp;amp;sysparm_idea_id=d63d3faa1b45c050ada243f6fe4bcba7&amp;amp;sysparm_idea_table=x_snc_com_ideation_idea&amp;amp;sysparm_module_id=enhancement_requests&quot; rel=&quot;noopener&quot;&gt;Document all of the ServicePortal directives…&lt;/a&gt;”. This is truely unfortunate. As developers knowing what we have access to use is critical. When we have to interrogate directives that are there, but just not documented means we have to explore. Yansa has made one of their products a well made, maintainted and documented set of components for service portal their deal. We should have that kind of experience with all directives in Service Portal. Not just the ones ServiceNow deems are important. I’m unsuprised by this as it’s my opinion that Service Portal will see less and less updates as the Seismic framework gets more time.&lt;/p&gt;&lt;p&gt;At 40 upvotes, and submitted 11 months ago by Hatmaker. Now “In Consideration”, “&lt;a href=&quot;https://community.servicenow.com/community?id=view_idea&amp;amp;sysparm_idea_id=75aa3202db0080d44819fb24399619f0&amp;amp;sysparm_idea_table=x_snc_com_ideation_idea&amp;amp;sysparm_module_id=enhancement_requests&quot; rel=&quot;noopener&quot;&gt;Make the HealthScan (ACEReport) available to customer within the tool&lt;/a&gt;”. This was listed as a feature for a hot minute with either Madrid or Orlando but was pulled from the PTR notes. I’m not sure why but if the feature was nearly ready with one of theose two releases this should have been a fast one to get out. I’m glad its in consideration, but I wish it were here now.&lt;/p&gt;&lt;p&gt;At 39 upvotes, and submitted 10 months ago by Marco. Sometime in June, it was closed with&amp;nbsp;&lt;strong&gt;“Unlikely to implement”&lt;/strong&gt;, “&lt;a href=&quot;https://community.servicenow.com/community?id=view_idea&amp;amp;sysparm_idea_id=4686654fdbe4c0140be6a345ca9619f4&amp;amp;sysparm_idea_table=x_snc_com_ideation_idea&amp;amp;sysparm_module_id=enhancement_requests&quot; rel=&quot;noopener&quot;&gt;Pre- &amp;amp; Post-script for update set&lt;/a&gt;”. This is available with plugins you can see it in the messages when installing something. We should have the same tools that available to plugins authors. As an administrator of ServiceNow, it’s&amp;nbsp;&lt;strong&gt;OFTEN&lt;/strong&gt;&amp;nbsp;I have to write a piece of code to fix data as part of a release for an update set. This is unfortunate ServiceNow wont give us the tools we are asking for.&lt;/p&gt;&lt;p&gt;At 38 upvotes, and submitted 10 months ago by Blake. Sometime in June, it was closed with&amp;nbsp;&lt;strong&gt;“Unlikely to implement”&lt;/strong&gt;, “&lt;a href=&quot;https://community.servicenow.com/community?id=view_idea&amp;amp;sysparm_idea_id=e3cd61d7dba88890d82ffb24399619d1&amp;amp;sysparm_idea_table=x_snc_com_ideation_idea&amp;amp;sysparm_module_id=enhancement_requests&quot; rel=&quot;noopener&quot;&gt;Allow Multi-Row Variable Sets to be ‘Global’&lt;/a&gt;”. This is also terribly sad. As folks want to use Multi-Row Variable Sets, this is just another reason not to. What does this actually mean? Well in Workflow, to show variables on catalog tasks, you must checkout the workflow and add each variable on to each task manually, or… set the variable to Global. This is a convience method that worked for all things up until Multi-Row Variable Sets. The fact it’s now caveated makes them worse. Also the answer here doesn’t even address the problem described which is the use of Multi-Row Variable sets on Workflow.&lt;/p&gt;&lt;p&gt;At 6 upvotes, and submitted 5 months ago by Ian Mildon. Sometime in June, it was changed to “In Consideration”, “&lt;a href=&quot;https://community.servicenow.com/community?id=view_idea&amp;amp;sysparm_idea_id=8be7d184db2340d06064eeb5ca9619a7&amp;amp;sysparm_idea_table=x_snc_com_ideation_idea&amp;amp;sysparm_module_id=enhancement_requests&quot; rel=&quot;noopener&quot;&gt;Add Business Calendars (Fiscal Calendars) to reporting tools&lt;/a&gt;”. This should not need to be asked for. Anything you can do on a list filter, you should be able to do on a standard report. Anything you can do on a report, you should be able to do on list. I was going to leave that alone but I went ahead and made the idea for that.&lt;/p&gt;&lt;p&gt;At 1 upvote, and submitted moments ago by me.&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=view_idea&amp;amp;sysparm_idea_id=f8e34f0c1b7a5010d2ccea89bd4bcb07&amp;amp;sysparm_idea_table=x_snc_com_ideation_idea&amp;amp;sysparm_module_id=enhancement_requests&quot; rel=&quot;noopener&quot;&gt;Lists filters and Report Filters should have feature parity&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Opportunity is out there</title>
      <link href="https://jace.pro/blog/opportunity-is-out-there/" />
      <updated>2020-07-30T00:00:00Z</updated>
      <id>https://jace.pro/blog/opportunity-is-out-there/</id>
      <content type="html">
				&lt;p&gt;The other day I was on my computer when I got a message.&lt;/p&gt;&lt;p&gt;“Hey Jace, Do you have any thoughts on getting a job working on ServiceNow during these times?” (I wasn’t asked this specifically but the conversation went down that way)&lt;/p&gt;&lt;p&gt;Oof, when asked this the first thing I do is consider myself losing my employment. I cannot begin to know the worry they have.&lt;/p&gt;&lt;p&gt;These are terrible times. I wish you all best, but every time I try to get involved getting someone a gig or job things go sideways fast. So I stopped doing that. Now I just tell people… the stuff below. That’s why I’m writing this. So I can share it use it to cover all the things.&lt;/p&gt;&lt;p&gt;Since March I’ve been watching&amp;nbsp;&lt;a href=&quot;https://sndevs.com/&quot; rel=&quot;noopener&quot;&gt;slack&lt;/a&gt;&amp;nbsp;cautiously. Reading about lay offs and furloughs.&lt;/p&gt;&lt;p&gt;I encourage everyone in this space to listen to&amp;nbsp;&lt;a href=&quot;https://share.transistor.fm/s/bfec71fc&quot; rel=&quot;noopener&quot;&gt;Robert Fedoruk and CJ Wesley’s podcast featuring Kyle Carson&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;thoughts-on-getting-a-job-working-on-servicenow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/opportunity-is-out-there/#thoughts-on-getting-a-job-working-on-servicenow&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-30-opportunity-is-out-there/#thoughts-on-getting-a-job-working-on-servicenow&quot; rel=&quot;noopener&quot;&gt;Thoughts on getting a job working on ServiceNow&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;First you need to land an interview. To do that, make an amazing resume. Some say a resume isn’t important, some say it is. I like my resume and trying to make it look good, but it’s a weird thing. A piece of paper listing skills, history, accomplisments and why you want to work there.&lt;/p&gt;&lt;h3 id=&quot;resumes-are-the-tickets-to-interviews&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/opportunity-is-out-there/#resumes-are-the-tickets-to-interviews&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-30-opportunity-is-out-there/#resumes-are-the-tickets-to-interviews&quot; rel=&quot;noopener&quot;&gt;Resumes are the tickets to interviews&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;There’s lots of things online about resumes. I don’t have concrete evidence on what works and what doesn’t, so I’ll share my thoughts from my experience.&lt;/p&gt;&lt;p&gt;I have a “Base” resume I keep up to date with all my experience and such, and I make copies of it tailored to companies needs.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1.&amp;nbsp;&lt;strong&gt;Keep it current.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Update that resume anytime you get a job with the tasks or skills they list.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.&amp;nbsp;&lt;strong&gt;Don’t lie.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;It’s easy to lie, not so easy to get away with it. I wouldn’t want to hire a liar.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3.&amp;nbsp;&lt;strong&gt;Describe creatively.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;“Handled integrations.” becomes, “Saved 5 hours per week per person automating ServiceNow to Payroll feeds.”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4.&amp;nbsp;&lt;strong&gt;Know your skills.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;An admin and a developer can look the same on paper.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5.&amp;nbsp;&lt;strong&gt;Clean up your social media.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;If they look you up, you don’t want controversial things coming up.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.&amp;nbsp;&lt;strong&gt;Know your resume.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;BE READY TO SPEAK ON EVERY THING YOU PUT ON THE RESUME.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7.&amp;nbsp;&lt;strong&gt;Make it personal.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Tailor the resume to the job. Use their lingo from their job posting.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.&amp;nbsp;&lt;strong&gt;Quantify your successes.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Numbers will find attention.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9.&amp;nbsp;&lt;strong&gt;Enlist your community.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Share the details where you help others and they help you.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10.&amp;nbsp;&lt;strong&gt;Pair your resume down.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Be concise. This isn’t an biography.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;You&amp;nbsp;&lt;em&gt;should&lt;/em&gt;&amp;nbsp;update your resume per position applied. Show your best sides to the potential employer. I’ve done this but not every time.&lt;/p&gt;&lt;h3 id=&quot;interviews-are-just-conversations-to-give-and-get-information&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/opportunity-is-out-there/#interviews-are-just-conversations-to-give-and-get-information&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-30-opportunity-is-out-there/#interviews-are-just-conversations-to-give-and-get-information&quot; rel=&quot;noopener&quot;&gt;Interviews are just conversations to give and get information&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;So since I’m still loving Hamilton I’m going to try something new;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;One&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;two&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;three&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;four&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;five&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;six&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;seven&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;eight&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;nine&lt;/strong&gt;… It’s the&amp;nbsp;&lt;strong&gt;ten&lt;/strong&gt;&amp;nbsp;jobby commandments.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1.&amp;nbsp;&lt;strong&gt;Focus and elevate.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Know your worth and expect it.(I read&amp;nbsp;&lt;a href=&quot;https://www.kalzumeus.com/2012/01/23/salary-negotiation&quot; rel=&quot;noopener&quot;&gt;this&lt;/a&gt;&amp;nbsp;to get there.&amp;nbsp;&lt;strong&gt;Every&lt;/strong&gt;.&amp;nbsp;&lt;strong&gt;Single&lt;/strong&gt;.&amp;nbsp;&lt;strong&gt;Time&lt;/strong&gt;).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.&amp;nbsp;&lt;strong&gt;Ready questions for people.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Screening call: benefits, culture, company expectations. Interview: team, and technical specifics.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3.&amp;nbsp;&lt;strong&gt;Apply to at least three places.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;One you don’t want work at, and the rest you do. Practice with the “don’t” place.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4.&amp;nbsp;&lt;strong&gt;Take notes.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Write down notes during the all interview steps. You won’t regret it, and then you’ll have it to reference later.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5.&amp;nbsp;&lt;strong&gt;Research. Research. Research.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Understand the goals of each company. What their lines of business are, and consider would you fit in there.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.&amp;nbsp;&lt;strong&gt;Never give a number first.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Goal: Verify you&amp;nbsp;&lt;strong&gt;want&lt;/strong&gt;&amp;nbsp;to work here and if they&amp;nbsp;&lt;strong&gt;want&lt;/strong&gt;&amp;nbsp;to hire you a lot. When that’s true, numbers are flexible.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7.&amp;nbsp;&lt;strong&gt;Listen and repeat.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Use keywords from the job posting, and use them where appropriate.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.&amp;nbsp;&lt;strong&gt;Money isn’t everything.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;It’s important. Some places can’t offer you what you need. Consider negotiating extra time off then.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9.&amp;nbsp;&lt;strong&gt;“Interesting” is a great word.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Them: We can offer you 80k. You: 80k is interesting. It’s not quite where we need this.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10.&amp;nbsp;&lt;strong&gt;Defer to a EXTERNAL_AUTHORTY.&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;This gives you a scapegoat for refusing a request while not being guilty of the refusal yourself.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>TechNow Ep77 | Review of Paris Features</title>
      <link href="https://jace.pro/blog/technow-ep77-or-review-of-paris-features/" />
      <updated>2020-07-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/technow-ep77-or-review-of-paris-features/</id>
      <content type="html">
				&lt;h2 id=&quot;the-topics-from-the-registration-page;&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#the-topics-from-the-registration-page;&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#the-topics-from-the-registration-page&quot; rel=&quot;noopener&quot;&gt;The Topics from the Registration page;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;On the registration page they mention;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;OpenID SSO&lt;/li&gt;&lt;li&gt;Flow Designer&lt;/li&gt;&lt;li&gt;Integration Hub&lt;/li&gt;&lt;li&gt;Source Control&lt;/li&gt;&lt;li&gt;Instance Data Replication&lt;/li&gt;&lt;li&gt;Automated Test Framework&lt;/li&gt;&lt;/ul&gt;--&amp;gt;&lt;p&gt;So I watched the “TechNow Tuesday: Discover the Paris Platform features Review”&lt;/p&gt;&lt;p&gt;They hit a lot of things. Here’s what I noted from the video.&lt;/p&gt;&lt;h2 id=&quot;atf&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#atf&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#atf&quot; rel=&quot;noopener&quot;&gt;ATF&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-application-development/page/administer/auto-test-framework/concept/custom-ui-test-steps.html#d1612322e757&quot; rel=&quot;noopener&quot;&gt;Custom UI versioning support&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;This is to version the Custom UI stuff like flows and workflows. You may want to update old tests for that version if you make tests&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-application-development/page/administer/auto-test-framework/concept/atf-page-inspector.html#d1172595e127&quot; rel=&quot;noopener&quot;&gt;Improved indexing&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Similiar elements are not easily identified&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-application-development/page/administer/auto-test-framework/concept/atf-page-inspector.html#d1172595e127&quot; rel=&quot;noopener&quot;&gt;Page inspector enhancements&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Better error messaging&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;authentication&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#authentication&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#authentication&quot; rel=&quot;noopener&quot;&gt;Authentication&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/integrationhub/concept/connections-dashboard.html&quot; rel=&quot;noopener&quot;&gt;Connections tab on Flow designer&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Very nice. Also, you can add child aliases.&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/integrate/single-sign-on/concept/OIDC-SSO-overview.html&quot; rel=&quot;noopener&quot;&gt;OpenID Connect SSO&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Authenticate against Google, Facebook or whatever. To do that,&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/integrate/single-sign-on/task/create-OIDC-configuration-SSO.html&quot; rel=&quot;noopener&quot;&gt;Create an OpenID Connect configuration&lt;/a&gt;.&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/build/service-portal/task/enable-self-registration.html&quot; rel=&quot;noopener&quot;&gt;External self-user registration&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;This is great - lets user self register. All you need to do is&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/integrate/authentication/concept/external-user-self-registration.html&quot; rel=&quot;noopener&quot;&gt;turn on the plugin&lt;/a&gt;&lt;/em&gt;&#92;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Once enabled create a&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/integrate/authentication/task/external-user-configuration.html&quot; rel=&quot;noopener&quot;&gt;User Registration Configuration&lt;/a&gt;&amp;nbsp;and you’ll get to set up these if you want;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Terms and conditions&lt;/li&gt;&lt;li&gt;ReCaptcha (requires&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/integrate/authentication/task/configure-recaptcha-sp.html&quot; rel=&quot;noopener&quot;&gt;Configuring Google reCCAPTCHA&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Multiple instances of this per portal&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;core-platform&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#core-platform&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#core-platform&quot; rel=&quot;noopener&quot;&gt;Core Platform&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/reference-pages/task/t_ScheduleAScriptExecution.html&quot; rel=&quot;noopener&quot;&gt;Schedule Jobs - Business Calendar offset&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;If you need to run something on a recurring basis for business offsets&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/platform-performance/concept/instance-view.html&quot; rel=&quot;noopener&quot;&gt;Performance dashboard - instance view&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Now displays for entire instance and you can turn on and off for specific nodes&lt;/em&gt;&lt;br&gt;&lt;strong&gt;Robust transform engine (RTE) wildcards&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/import-sets/concept/robust-import-set-transformers.html&quot; rel=&quot;noopener&quot;&gt;Robust transform engine (RTE) nested structure&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Previously only support flat json structures&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Scoped data administration&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;domain-separation&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#domain-separation&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#domain-separation&quot; rel=&quot;noopener&quot;&gt;Domain separation&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/company-and-domain-separation/concept/ds-application-properties.html&quot; rel=&quot;noopener&quot;&gt;Application properties&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Different value for different domains for specific applications&lt;/em&gt;&lt;br&gt;&lt;strong&gt;Scheduled jobs - Domain iterator&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;flow-designer&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#flow-designer&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#flow-designer&quot; rel=&quot;noopener&quot;&gt;Flow Designer&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/concept/flows.html#d1519792e190&quot; rel=&quot;noopener&quot;&gt;Action instance order renaming&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;No longer nested. 3.2.1 =&amp;gt; 8. Copy the flow if you’re worried before you update the flow&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/task/duplicate-action-subflow.html&quot; rel=&quot;noopener&quot;&gt;Duplicate actions instance&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;huge time saver&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-application-development/page/app-store/dev_portal/API_reference/ScriptableFlowAPI/concept/ScriptableFlowAPI.html&quot; rel=&quot;noopener&quot;&gt;FlowAPI enhancements&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Older FlowAPI calls will work but please use the new stuff&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-application-development/page/app-store/dev_portal/API_reference/FlowScript/concept/FlowScriptAPI.html&quot; rel=&quot;noopener&quot;&gt;FlowScriptAPI&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;These are used within the flow&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/concept/flow-actions.html&quot; rel=&quot;noopener&quot;&gt;Ghost actions&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Have you ever noticed in production flows fail to open if referencing missing actions&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/concept/flow-logic-make-decision.html&quot; rel=&quot;noopener&quot;&gt;Decision flow - Turn off branches&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;_This is nice&lt;br&gt;&lt;strong&gt;Decision flow - Avoid repetitive “Update record” actions by applying the answer data&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/reference/get-cat-variables-flow-designer.html&quot; rel=&quot;noopener&quot;&gt;Multi-row Variable Set (MVRS) support&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/task/create-flow-roles.html&quot; rel=&quot;noopener&quot;&gt;Run with roles&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/reference/send-sms-action.html&quot; rel=&quot;noopener&quot;&gt;Send SMS action&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/reference/submit-catalog-item-request-flow-designer.html&quot; rel=&quot;noopener&quot;&gt;Submit catalog item request action&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Another nail in the order guide coffin&lt;/em&gt;&lt;br&gt;&lt;strong&gt;Support multiple active connections&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/reference/update-multiple-records-action-designer.html&quot; rel=&quot;noopener&quot;&gt;Update and delete multiple step&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Chuck uses it as a cleanup to delete the logs&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/concept/content-filtering-flow-designer.html&quot; rel=&quot;noopener&quot;&gt;User access control criteria&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Only show actions they can use&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;integrationhub&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#integrationhub&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#integrationhub&quot; rel=&quot;noopener&quot;&gt;IntegrationHub&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/import-sets/concept/data-stream-data-source.html&quot; rel=&quot;noopener&quot;&gt;Data sources - data stream&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Objects can be flattened into import table. Or nested in a field. Pre-import script needed for this.&lt;/em&gt;&lt;br&gt;&lt;strong&gt;Dynamic object support and data stream output&lt;/strong&gt;&amp;nbsp;&lt;em&gt;This can be great to do introspection of other data&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/integrationhub/concept/data-stream-actions.html&quot; rel=&quot;noopener&quot;&gt;Data stream&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Support for outputs in script parser. You now have access to&amp;nbsp;&lt;code&gt;action_inputs&lt;/code&gt;&amp;nbsp;and action scripts&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/flow-designer/reference/json-parser-step-action-designer.html&quot; rel=&quot;noopener&quot;&gt;JSON Parser Flow Designer/IntegrationHub step&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Used live on lchh week of 7/23&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-application-development/page/app-store/dev_portal/API_reference/JSONStreamingBuilder/concept/JSONStreamingBuilderScopedAPI.html&quot; rel=&quot;noopener&quot;&gt;JSON Payload Builder&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Builds file contents for api calls&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-application-development/page/app-store/dev_portal/API_reference/XMLStreamingBuilder/concept/XMLStreamingBuilderScopedAPI.html&quot; rel=&quot;noopener&quot;&gt;XML Payload Builder&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Builds file contents for api calls&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;integration-security&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#integration-security&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#integration-security&quot; rel=&quot;noopener&quot;&gt;Integration Security&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/login/task/t_AccessControl.html&quot; rel=&quot;noopener&quot;&gt;Outbound IP access controls&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;A poor mans firewall - stops the instance and Midservers from hitting the IP.&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;platform&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#platform&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#platform&quot; rel=&quot;noopener&quot;&gt;Platform&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-application-development/page/integrate/graphql/concept/scripted-graph-ql.html&quot; rel=&quot;noopener&quot;&gt;GraphQL&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;Archiving Multi-consumer archiving&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/database-rotation/task/t_CreateADestructionRule.html&quot; rel=&quot;noopener&quot;&gt;Archiving - Destroy related records&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/database-rotation/task/t_ViewArchivedData.html#t_RestoreArchivedData&quot; rel=&quot;noopener&quot;&gt;Archiving - Restore related records&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/metricbase/task/set-up-data-monitoring.html&quot; rel=&quot;noopener&quot;&gt;MetricBase - Non&amp;nbsp;&lt;code&gt;sys_id&lt;/code&gt;&amp;nbsp;based subjects for MetricBase&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/instance-data-replication/concept/bidirectional-replication.html&quot; rel=&quot;noopener&quot;&gt;Instance data replication - bidirectional&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Now it’s bidirection by one checkbox (Technow planned in December)&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/instance-data-replication/concept/discrete-producer-replication-sets.html&quot; rel=&quot;noopener&quot;&gt;Instance data replication - discrete sets&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;notifications&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#notifications&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#notifications&quot; rel=&quot;noopener&quot;&gt;Notifications&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/notification/task/set-email-address-filters.html&quot; rel=&quot;noopener&quot;&gt;Inbound / outbound email address filters&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;platform-security&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#platform-security&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#platform-security&quot; rel=&quot;noopener&quot;&gt;Platform security&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/contextual-security/concept/explicit-roles.html&quot; rel=&quot;noopener&quot;&gt;Explicit roles&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/security/reference/explicit-role-plugin.html&quot; rel=&quot;noopener&quot;&gt;Requires HI to enable&lt;/a&gt;&lt;/em&gt;&lt;br&gt;&lt;strong&gt;Mutual exclusive roles&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;process-automation-designer&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#process-automation-designer&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#process-automation-designer&quot; rel=&quot;noopener&quot;&gt;Process Automation Designer&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/process-automation-designer/concept/process-automation-designer.html&quot; rel=&quot;noopener&quot;&gt;Process Automation Designer&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/process-automation-designer/concept/process-automation-designer-lanes-activities.html&quot; rel=&quot;noopener&quot;&gt;Playbook experience&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Visual experience for Process Automation Designer in workspace&lt;/em&gt;&#92;&lt;/p&gt;&lt;h2 id=&quot;service-portal&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#service-portal&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#service-portal&quot; rel=&quot;noopener&quot;&gt;Service Portal&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/build/service-portal/concept/portal-analyzer.html&quot; rel=&quot;noopener&quot;&gt;Portal Analyzer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;source-control&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#source-control&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#source-control&quot; rel=&quot;noopener&quot;&gt;Source control&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-application-development/page/build/applications/concept/manage_global_application_files.html&quot; rel=&quot;noopener&quot;&gt;Global support&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Set&amp;nbsp;&lt;code&gt;sn_g_app_creator.allow_global&lt;/code&gt;&amp;nbsp;property to&amp;nbsp;&lt;code&gt;true&lt;/code&gt;&amp;nbsp;allow global apps in studio.&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/search?q=Incremental+loading&quot; rel=&quot;noopener&quot;&gt;Delta loading - No good link&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;This is big. You don’t need to worry about destroying the tables and such on branch switches.&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;script-debugging-enhanced&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#script-debugging-enhanced&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#script-debugging-enhanced&quot; rel=&quot;noopener&quot;&gt;Script debugging enhanced&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-application-development/page/script/debugging/task/evaluate-expressions.html&quot; rel=&quot;noopener&quot;&gt;Console debugger&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=7gHQPk5hSXc&quot; rel=&quot;noopener&quot;&gt;Video by Brad Tilton&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://developer.servicenow.com/to.do?u=ScriptDebuggerTraining_Paris&quot; rel=&quot;noopener&quot;&gt;Training&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;upgrades&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#upgrades&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#upgrades&quot; rel=&quot;noopener&quot;&gt;Upgrades&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Skipped update records resolution tracking&lt;/strong&gt;&amp;nbsp;&lt;em&gt;You just upgraded paris those changes are now captured in update sets.&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;upgrade-center&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#upgrade-center&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#upgrade-center&quot; rel=&quot;noopener&quot;&gt;Upgrade Center&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/upgrade-center/reference/uc-previewed-changes.html#d435143e37&quot; rel=&quot;noopener&quot;&gt;Preview your upgrade&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Video coming in September on Technow.&lt;/em&gt;&lt;br&gt;&lt;strong&gt;Review completed upgrade&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;Manage skips with VTB&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;workspace&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#workspace&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#workspace&quot; rel=&quot;noopener&quot;&gt;Workspace&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Agent email client&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Recipient fields/picker. Attachments. Quick messages.&lt;/em&gt;&lt;br&gt;&lt;strong&gt;Activity stream&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Filter by conversation. Attachments. Single scrollbars - was double before.&lt;/em&gt;&lt;br&gt;&lt;strong&gt;Condition Builder&lt;/strong&gt;&lt;em&gt;Was a angular thing now its now-exp thing&lt;/em&gt;&lt;br&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-servicenow-platform/page/administer/workspace/concept/domain-selection.html&quot; rel=&quot;noopener&quot;&gt;Domain separation&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Is asked when making new records.&lt;/em&gt;&lt;br&gt;&lt;strong&gt;TinyMCE Updates&lt;/strong&gt;&amp;nbsp;&lt;em&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/workspace/concept/tinymce.html#set-dictionary-attributes-workspace&quot; rel=&quot;noopener&quot;&gt;Default toolbar&lt;/a&gt;.&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/workspace/concept/tinymce.html#change-tinymce-toolbar-specific-table&quot; rel=&quot;noopener&quot;&gt;Table specific attributes&lt;/a&gt;.&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/workspace/concept/tinymce.html#set-attributes-tinymce-dictionary&quot; rel=&quot;noopener&quot;&gt;TinyMCE plugins for specific table&lt;/a&gt;.&lt;/em&gt;&lt;br&gt;&lt;strong&gt;Lists&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Live badges with refresh icon. Column resizing.&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;question-and-answers&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#question-and-answers&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#question-and-answers&quot; rel=&quot;noopener&quot;&gt;Question and Answers&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Any recommendations for when to upgrade as a new customer? Right now, you don’t have any data.&lt;/li&gt;&lt;li&gt;Flow designer rollback - up vote the idea it’s coming&lt;/li&gt;&lt;li&gt;Lots of questions about IDR and e-bonding&lt;/li&gt;&lt;li&gt;Q’s will be answered later on the&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=130bff98db7dd090feb1a851ca9619cd&quot; rel=&quot;noopener&quot;&gt;community post for Technow ep77&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;slides&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep77-or-review-of-paris-features/#slides&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/#slides&quot; rel=&quot;noopener&quot;&gt;Slides&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-28-technow-ep77-paris-features/technowep77parisplatformfeatures202007151595891712984.pdf&quot; rel=&quot;noopener&quot;&gt;Link to the deck&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Paris feature - Requested For variable</title>
      <link href="https://jace.pro/blog/paris-feature-requested-for-variable/" />
      <updated>2020-07-27T00:00:00Z</updated>
      <id>https://jace.pro/blog/paris-feature-requested-for-variable/</id>
      <content type="html">
				&lt;p&gt;Does this sound familiar?&lt;/p&gt;&lt;p&gt;Customer: “I need a request form.”&lt;br&gt;Me: “Yea, what it’s for?”&lt;br&gt;Customer: “Access to MyAmazingApp”&lt;br&gt;Me: “Okay. No problem. It’ll have a field to say give access to this user, sound good?”&lt;br&gt;Customer: “UGH, do I have to click ‘Add to cart’ for each user then?!”&lt;br&gt;Me: “Sorry.”&lt;/p&gt;&lt;p&gt;There’s a fix for that. ServiceNow calls it a feature. I call it long over due. Requested For variable is the name of it.&lt;/p&gt;&lt;p&gt;I was reading&amp;nbsp;&lt;a href=&quot;https://news.jace.pro/?text=paris&quot; rel=&quot;noopener&quot;&gt;/news for Paris&lt;/a&gt;. This caught my attention.&amp;nbsp;&lt;a href=&quot;https://www.linkedin.com/in/jennytthu/&quot; rel=&quot;noopener&quot;&gt;Jenny Hu&lt;/a&gt;’s “&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=52c3e490db569090d5c4d9d968961951&quot; rel=&quot;noopener&quot;&gt;A Day in Paris Series: Exploring Delegated Request Experience&lt;/a&gt;”.&lt;/p&gt;&lt;p&gt;I started my work on ServiceNow in Service Catalog. This is actually one of the first problems I had to address. In this post I’m going to focus on how this works.&lt;/p&gt;&lt;h2 id=&quot;steps-to-set-up-requested-for-variable&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/paris-feature-requested-for-variable/#steps-to-set-up-requested-for-variable&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-27-paris-requested-for/#steps-to-set-up-requested-for-variable&quot; rel=&quot;noopener&quot;&gt;Steps to set up “Requested For” variable&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Add a “Requested For” variable to the catalog item.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Decide who you want to be able to pick these values (they have a field for that control)&lt;/li&gt;&lt;li&gt;Set up the reference qualifier&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;That’s it.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;limitations&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/paris-feature-requested-for-variable/#limitations&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-27-paris-requested-for/#limitations&quot; rel=&quot;noopener&quot;&gt;Limitations&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;It does come with a few limitations.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Selecting many users only appears to work in Service Portal&lt;/li&gt;&lt;li&gt;It is not available for record producers. (They added&amp;nbsp;&lt;code&gt;requested_for&lt;/code&gt;&amp;nbsp;on&amp;nbsp;&lt;code&gt;sc_req_item&lt;/code&gt;. Generally, target table will not have that.)&lt;/li&gt;&lt;li&gt;It is not available for order guides. (features for these generally take an extra release. If you want this submit an idea.)&lt;/li&gt;&lt;li&gt;It is not available for Now Mobile.&lt;/li&gt;&lt;li&gt;It is not available for Workspaces. (This surprises me. I’d thought ServiceNow would only be making net new features with Workspace support.)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;thoughts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/paris-feature-requested-for-variable/#thoughts&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-07-27-paris-requested-for/#thoughts&quot; rel=&quot;noopener&quot;&gt;Thoughts&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is amazing and here’s why. This feature reduces complexites added by;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;List Collectors&lt;/li&gt;&lt;li&gt;Multi-Row Variable Sets (MRVS)&lt;/li&gt;&lt;li&gt;2-step checkout.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;How does this reduce that need?&lt;/p&gt;&lt;ol&gt;&lt;li&gt;“Add to cart” is no longer needed as you can make the request and ServiceNow makes an item per “Requested For”. That means workflow and flows are properly followed per person.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/post/2019-11-30-list-collectors-are-the-pits/&quot; rel=&quot;noopener&quot;&gt;List collectors have their own problems&lt;/a&gt;. Generally they decide who gets access. This removes that.&lt;/li&gt;&lt;li&gt;Multi Row Variable Sets also have problem (less than List collectors). Like List Collectors a lot of the time they decide the who. This removes that need.&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>TechNow Ep76 Review of Flow Designer</title>
      <link href="https://jace.pro/blog/technow-ep76-review-of-flow-designer/" />
      <updated>2020-06-26T00:00:00Z</updated>
      <id>https://jace.pro/blog/technow-ep76-review-of-flow-designer/</id>
      <content type="html">
				&lt;p&gt;Slabodnick is amazing. A long long time ago I had the opportunity to work with him. We did some great stuff there. I’m always happy to catch a session where he’s excited about what he’s working on. It seems that this is flow designer. I still don’t use flow designer much. I should use it more.&lt;/p&gt;&lt;p&gt;Hopefully this is my turning point. This post isn’t about me and how I will start using Flow Designer. It’s about this video. They go over 5 powerful features in ServiceNow’s Flow Designer system.&lt;/p&gt;&lt;p&gt;Here’s the link to&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=4rewkjVa8PU&quot; rel=&quot;noopener&quot;&gt;TechNow Ep 76&lt;/a&gt;. I breakdown what is gone over below.&lt;/p&gt;&lt;h2 id=&quot;decision-tables&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep76-review-of-flow-designer/#decision-tables&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#decision-tables&quot; rel=&quot;noopener&quot;&gt;Decision Tables&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;When I first read about these I was really hoping they could solve a complicated problem I have and I think many share with me. How to handle the churn of groups in ServiceNow. Turns out they can probably do this but just not well with workflow. In this video Slabodnick highlights what needs to be set up and how to use them.&lt;/p&gt;&lt;p&gt;Here’s a link to the&amp;nbsp;&lt;a href=&quot;https://youtu.be/4rewkjVa8PU?t=1178&quot; rel=&quot;noopener&quot;&gt;decision tables&lt;/a&gt;&amp;nbsp;spot in the video.&lt;/p&gt;&lt;h2 id=&quot;transform-data&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep76-review-of-flow-designer/#transform-data&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#transform-data&quot; rel=&quot;noopener&quot;&gt;Transform Data&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I didn’t know there even was this feature. You can simply transform the data without writing any code. I don’t have much else to say.&lt;/p&gt;&lt;p&gt;Again, link to the&amp;nbsp;&lt;a href=&quot;https://youtu.be/4rewkjVa8PU?t=1555&quot; rel=&quot;noopener&quot;&gt;transform data&lt;/a&gt;&amp;nbsp;spot in the video.&lt;/p&gt;&lt;h2 id=&quot;dynamic-inputs&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep76-review-of-flow-designer/#dynamic-inputs&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#dynamic-inputs&quot; rel=&quot;noopener&quot;&gt;Dynamic Inputs&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is a really interesting feature. I’d like to know what have you used for dynamic inputs in flow designer that saved you amazing amount of work. Seriously. Comment below or send me a message on Twitter @jacebenson.&lt;/p&gt;&lt;p&gt;Link to the&amp;nbsp;&lt;a href=&quot;https://youtu.be/4rewkjVa8PU?t=1953&quot; rel=&quot;noopener&quot;&gt;dynamic inputs&lt;/a&gt;&amp;nbsp;section of the video.&lt;/p&gt;&lt;h2 id=&quot;power-of-sql&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep76-review-of-flow-designer/#power-of-sql&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#power-of-sql&quot; rel=&quot;noopener&quot;&gt;Power of SQL&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Doing SQL stuff without writing powershell or another local language for the midserver? Really?! Cool.&lt;/p&gt;&lt;p&gt;Check it out here:&amp;nbsp;&lt;a href=&quot;https://youtu.be/4rewkjVa8PU?t=2316&quot; rel=&quot;noopener&quot;&gt;Power of SQL&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;dynamic-subflows&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep76-review-of-flow-designer/#dynamic-subflows&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#dynamic-subflows&quot; rel=&quot;noopener&quot;&gt;Dynamic Subflows&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://youtu.be/4rewkjVa8PU?t=2572&quot; rel=&quot;noopener&quot;&gt;Dynamic Subflows&lt;/a&gt;&amp;nbsp;- You just have to see them.&lt;/p&gt;&lt;h2 id=&quot;q-and-a-had-some-great-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/technow-ep76-review-of-flow-designer/#q-and-a-had-some-great-questions&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-26-technow-ep76-review-of-flow-designer/#q-a-had-some-great-questions&quot; rel=&quot;noopener&quot;&gt;Q &amp;amp; A had some great questions&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://youtu.be/4rewkjVa8PU?t=3093&quot; rel=&quot;noopener&quot;&gt;We want a convert flow to subflow button&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://youtu.be/4rewkjVa8PU?t=3162&quot; rel=&quot;noopener&quot;&gt;Lookup Record and Lookup Records Question&lt;/a&gt;&amp;nbsp;- Flow designer stops if it fails to find Lookup Record&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://youtu.be/4rewkjVa8PU?t=3264&quot; rel=&quot;noopener&quot;&gt;Is there anyway to create a variable and update it in subsequent steps&lt;/a&gt;&amp;nbsp;- It’s “in the pipeline” #fansOfScratchpad&lt;/li&gt;&lt;li&gt;On July 28th Paris Platform Features Technow Ep79. Don’t miss it. If you miss it you wont see it until Sept for it on demand&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Form Layout vs Form Designer</title>
      <link href="https://jace.pro/blog/form-layout-vs-form-designer/" />
      <updated>2020-06-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/form-layout-vs-form-designer/</id>
      <content type="html">
				&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;Form Designer&lt;/th&gt;&lt;th&gt;Form Layout&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Creating Fields&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Creating Sections&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Creating Views&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Removing Views&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adding Related Fields&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Removing Fields&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Removing Sections&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adding Annotations&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adding Scripted Annotations&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Removing Annotations&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adding Embedded Lists&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Removing Embedded Lists&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adding Related Lists&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Removing Related lists&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Own Your Content</title>
      <link href="https://jace.pro/blog/own-your-content/" />
      <updated>2020-06-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/own-your-content/</id>
      <content type="html">
				&lt;p&gt;Have you ever had a something you made and loved? Then did you ever look for it later and find it gone?&lt;/p&gt;&lt;p&gt;I have. It’s a terrible, terrible feeling. For me it was my Geocities site. Thinking back on it now, it was my ten year old me writing my thoughts and feelings. But it was mine.&lt;/p&gt;&lt;p&gt;I know their was a project to save geocities content somehow, but for me, that site is long gone.&lt;/p&gt;&lt;p&gt;There’s other things like this. A lot of my early work on ServiceNow also is gone. Not because the code is gone. I assume those solutions are still on those instances.&lt;br&gt;But, my access to those are gone, my reasons for those solutions are gone. If I’ve learned anything about other peoples platforms, it’s that you can’t trust they will be there forever.&lt;/p&gt;&lt;p&gt;If you want that level of security, you need to&amp;nbsp;&lt;strong&gt;always own your platform&lt;/strong&gt;.&lt;/p&gt;&lt;h2 id=&quot;why-should-you-own-your-own-content&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/own-your-content/#why-should-you-own-your-own-content&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-15-own-your-content/#why-should-you-own-your-own-content&quot; rel=&quot;noopener&quot;&gt;Why should you own your own content&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Simple. When it’s yours, you have ultimate control of it’s distribution.&lt;br&gt;If you post it on Facebook, you are conceding to the fact that users have to also be on Facebook.&lt;br&gt;If you post it on ServiceNow’s community, you’re giving up things like;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://yoast.com/what-is-a-canonical-url/&quot; rel=&quot;noopener&quot;&gt;canonical URL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/essential-meta-tags-social-media/&quot; rel=&quot;noopener&quot;&gt;social media image control&lt;/a&gt;&lt;/li&gt;&lt;li&gt;the ability to see traffic via&amp;nbsp;&lt;a href=&quot;https://accounts.google.com/ServiceLogin?service=analytics&quot; rel=&quot;noopener&quot;&gt;Google Analytics&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://plausible.io/&quot; rel=&quot;noopener&quot;&gt;Plausible&lt;/a&gt;, or&amp;nbsp;&lt;a href=&quot;https://clicky.com/&quot; rel=&quot;noopener&quot;&gt;Clicky&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Don’t get me wrong. ServiceNow isn’t going away anytime soon. Since I’ve worked with them their community has had at least three versions. With each one, some things were never saved when they moved.&lt;/p&gt;&lt;p&gt;If you blog about whatever, you should host it yourself.&lt;/p&gt;&lt;p&gt;The easiest way to do that is with the&amp;nbsp;&lt;a href=&quot;https://jamstack.org/&quot; rel=&quot;noopener&quot;&gt;JAMStack&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;how-do-i-get-started&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/own-your-content/#how-do-i-get-started&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-15-own-your-content/#how-do-i-get-started&quot; rel=&quot;noopener&quot;&gt;How do I get started&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Ok Jace, I’m in, how do I get started?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Short answer:&amp;nbsp;&lt;a href=&quot;https://app.netlify.com/start/deploy?repository=https://github.com/philhawksworth/eleventyone&quot; rel=&quot;noopener&quot;&gt;click this&lt;/a&gt;&amp;nbsp;link to deploy a site to Netlify for free.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Longer answer;&lt;/p&gt;&lt;p&gt;So there is some set up, however if you’ve been doing any scoped app development, it’s literally a click away. No joke. I’m a big fan of&amp;nbsp;&lt;a href=&quot;https://www.netlify.com/&quot; rel=&quot;noopener&quot;&gt;Netlify&lt;/a&gt;. They have a site with templates and everything to get started. This site, as it is now uses&amp;nbsp;&lt;a href=&quot;https://gohugo.io/&quot; rel=&quot;noopener&quot;&gt;Hugo&lt;/a&gt;. I’m working on moving to&amp;nbsp;&lt;a href=&quot;https://www.11ty.dev/&quot; rel=&quot;noopener&quot;&gt;11ty&lt;/a&gt;. If you’re getting started, I’d go to Phil Hawksorth’s github repository for&amp;nbsp;&lt;a href=&quot;https://github.com/philhawksworth/eleventyone&quot; rel=&quot;noopener&quot;&gt;eventyone&lt;/a&gt;, and click --&amp;gt;&lt;/p&gt;&lt;h3 id=&quot;jace-i-dont-like-javascript&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/own-your-content/#jace-i-dont-like-javascript&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-15-own-your-content/#jace-i-dont-like-javascript&quot; rel=&quot;noopener&quot;&gt;Jace, I don’t like Javascript!&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Okay, okay there’s tons of generators.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://gohugo.io/&quot; rel=&quot;noopener&quot;&gt;Hugo&lt;/a&gt;&amp;nbsp;uses Go.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.gatsbyjs.org/&quot; rel=&quot;noopener&quot;&gt;Gatsby&lt;/a&gt;&amp;nbsp;uses React.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.11ty.dev/&quot; rel=&quot;noopener&quot;&gt;11ty&lt;/a&gt;&amp;nbsp;uses javascript.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Each one has it’s pros and cons. I’ve used all of these. Effectively they are the same.&lt;/p&gt;&lt;h2 id=&quot;what-else-can-i-do-with-one-of-these-sites&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/own-your-content/#what-else-can-i-do-with-one-of-these-sites&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-15-own-your-content/#what-else-can-i-do-with-one-of-these-sites&quot; rel=&quot;noopener&quot;&gt;What else can I do with one of these sites&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Lots of things. You know that&amp;nbsp;&lt;a href=&quot;https://news.jace.pro/&quot; rel=&quot;noopener&quot;&gt;news.jace.pro&lt;/a&gt;&amp;nbsp;site I have. Yep, that is actually built daily using this stuff. The code feels ugly but it works. I plan to move it around a bit, but that’s a more complicated thing you can do. Phil Hawksworth has a site showing the same kinda of stuff called&amp;nbsp;&lt;a href=&quot;https://vlolly.net/&quot; rel=&quot;noopener&quot;&gt;vlolly.net&lt;/a&gt;&amp;nbsp;working the same kind of stuff.&lt;/p&gt;&lt;h2 id=&quot;this-post-was-inspired-by-sean-blanda&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/own-your-content/#this-post-was-inspired-by-sean-blanda&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-15-own-your-content/#this-post-was-inspired-by-sean-blanda&quot; rel=&quot;noopener&quot;&gt;This post was inspired by Sean Blanda&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Thank you Sean Blanda for&amp;nbsp;&lt;a href=&quot;https://www.alwaysownyourplatform.com/&quot; rel=&quot;noopener&quot;&gt;www.alwaysownyourplatform.com&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>How to remove options from a select box</title>
      <link href="https://jace.pro/blog/how-to-remove-options-from-a-select-box/" />
      <updated>2020-06-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-remove-options-from-a-select-box/</id>
      <content type="html">
				&lt;p&gt;In the past people have asked How do I&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=1f5fb2a9db58dbc01dcaf3231f96199a&quot; rel=&quot;noopener&quot;&gt;Remove an option from select box variable in the catalog item form&lt;/a&gt;? And you’d think it would be something as simple as a&amp;nbsp;&lt;code&gt;active&lt;/code&gt;&amp;nbsp;flag. However if you look there is no&amp;nbsp;&lt;code&gt;active&lt;/code&gt;&amp;nbsp;flag on select box options. That is truly unfortunate.&lt;/p&gt;&lt;p&gt;If you delete it, the values will still hold their&amp;nbsp;&lt;code&gt;value&lt;/code&gt;&amp;nbsp;but if there was a display for the value it won’t show that.&lt;/p&gt;&lt;h2 id=&quot;how-do-i-go-forward&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-remove-options-from-a-select-box/#how-do-i-go-forward&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-15-removing-options-from-choicelists-on-catalog/#how-do-i-go-forward&quot; rel=&quot;noopener&quot;&gt;How do I go forward?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;There’s really only one way I know of. Client script and remove the option until you can safely delete it.&lt;/p&gt;&lt;p&gt;The client script would be really small&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onLoad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeOption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;duration&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;twelve_months&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Another way… that is really overkill but I think handles it the best, is to disable the item and make a new version of the item.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Deactivate the item&lt;/li&gt;&lt;li&gt;Make a Copy - this ensures all past requests work as they were intended. It’s a big change for a little bit of work I have seen this.&lt;/li&gt;&lt;li&gt;Delete the option on the new version of the item&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;related-things&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-remove-options-from-a-select-box/#related-things&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-15-removing-options-from-choicelists-on-catalog/#related-things&quot; rel=&quot;noopener&quot;&gt;Related things&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Related Question:&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=1f5fb2a9db58dbc01dcaf3231f96199a&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=1f5fb2a9db58dbc01dcaf3231f96199a&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Related Post:&amp;nbsp;&lt;a href=&quot;https://www.servicenowguru.com/scripting/client-scripts-scripting/removing-disabling-choice-list-options&quot; rel=&quot;noopener&quot;&gt;https://www.servicenowguru.com/scripting/client-scripts-scripting/removing-disabling-choice-list-options&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>K20 Weekly Review for the week ending on June 5th</title>
      <link href="https://jace.pro/blog/k20-weekly-review-for-the-week-ending-on-june-5th/" />
      <updated>2020-06-05T00:00:00Z</updated>
      <id>https://jace.pro/blog/k20-weekly-review-for-the-week-ending-on-june-5th/</id>
      <content type="html">
				&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=pPszUiwLec4&amp;amp;feature=youtu.be&quot; rel=&quot;noopener&quot;&gt;Success Meetup: Community MVP Paul Morris - Automated testing and the role of community as a guide&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;@0:00 - 21:00 History&lt;/li&gt;&lt;li&gt;@22:40 demo of submitting an item -&lt;/li&gt;&lt;li&gt;@23:00 make atf test&lt;/li&gt;&lt;li&gt;@30:00 test atf test&lt;/li&gt;&lt;li&gt;@34:00 demo of atf recorder&lt;/li&gt;&lt;li&gt;Wow… in one minute it generated 27 steps and the steps you expected&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;h2 id=&quot;theater-podcast-flow-designer-and-why-use-it-ths5022&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/k20-weekly-review-for-the-week-ending-on-june-5th/#theater-podcast-flow-designer-and-why-use-it-ths5022&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-05-k20-weekly-review/#theater-podcast-flow-designer-and-why-use-it-ths5022&quot; rel=&quot;noopener&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://static.rainfocus.com/servicenow/knowledge2020/sess/1590108630120001Ogae/relatedfiles/THS5022-%20Flow%20Designer%20and%20why%20use%20it_1590783422933001ahnF.mp3&quot; rel=&quot;noopener&quot;&gt;Theater Podcast: Flow Designer and why use it? (THS5022)&lt;/a&gt;&lt;/h2&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://static.rainfocus.com/servicenow/knowledge2020/sess/1590108811240001xQ1A/relatedfiles/THS5023%20What%27s%20New%20In%20Orlando_1590783523961001aQ68.mp3&quot; rel=&quot;noopener&quot;&gt;Theater Podcast: What’s new in Orlando (THS5023)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Always Negotiate</title>
      <link href="https://jace.pro/blog/always-negotiate/" />
      <updated>2020-06-02T00:00:00Z</updated>
      <id>https://jace.pro/blog/always-negotiate/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://www.kalzumeus.com/2012/01/23/salary-negotiation/&quot; rel=&quot;noopener&quot;&gt;Patrick McKenzie wrote a blog about this.&lt;/a&gt;&amp;nbsp;His post inspires this one. I am writing this down so those who follow me may see it.&lt;/p&gt;&lt;p&gt;For me this has always been “get my mind in the interviewing mindset” piece.&lt;/p&gt;&lt;p&gt;I’ll start this with a quote from another older post of mine;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;So interviewing is exciting.&lt;br&gt;It’s a way to get uncomfortable and see what is available in job-land.&lt;br&gt;Something to keep in mind, interviews are a way for you and your employer to find a great fit for this position.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I enjoy interviewing, and some don’t but this will help you navigate this time better.&lt;/p&gt;&lt;p&gt;If you read nothing else read this;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Salary negotiations started as soon as you applied.&lt;/li&gt;&lt;li&gt;Salary isn’t the only thing being negotiated.&lt;/li&gt;&lt;li&gt;If you don’t ask, the answer is always no.&lt;/li&gt;&lt;li&gt;Never give the number first, if pressed, deflect, if you can’t give a range.&lt;/li&gt;&lt;li&gt;Take notes when researching and interviewing.&lt;/li&gt;&lt;li&gt;Use your significant other or family to buy time and think about the offer.&lt;/li&gt;&lt;/ul&gt;&lt;h1 id=&quot;when-does-the-salary-negotiation-start&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/always-negotiate/#when-does-the-salary-negotiation-start&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-02-always-negotiate/#when-does-the-salary-negotiation-start&quot; rel=&quot;noopener&quot;&gt;When does the salary negotiation start?&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Salary negotiations&amp;nbsp;&lt;strong&gt;start the moment you apply for a job&lt;/strong&gt;. So don’t submit a number on any form when you apply. That gives them a heads up where to start.&lt;/p&gt;&lt;p&gt;You might be thinking, “Jace, they need a number on the form. What do I put in there?” Yea, they generally have that. Put $1. They know that can’t be right.&lt;br&gt;This will start the dialog. That dialog is critical.&lt;/p&gt;&lt;p&gt;You should know about what your average pay range is. Be aware of the range of pay for your skills demand.&lt;/p&gt;&lt;p&gt;At this point you might also be wondering what can you expect that conversation to go like. For me I’ve always been able to use the line from Patrick’s article, and I’m paraphrasing;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I’m more concerned at the moment with talking to you about discovering whether we’re a mutual fit.&lt;br&gt;If we’re a great fit, then I can be flexible on the numbers with you and you can be flexible on the numbers with me.&lt;/p&gt;&lt;/blockquote&gt;&lt;h1 id=&quot;why-negotiating-matters&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/always-negotiate/#why-negotiating-matters&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-02-always-negotiate/#why-negotiating-matters&quot; rel=&quot;noopener&quot;&gt;Why negotiating matters&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;My first job into tech was help desk.&lt;br&gt;They paid me a few dollars more an hour than I made as hospital clergy.&lt;br&gt;Then I got a jump on to actual tech work. I didn’t know then what I know now.&lt;br&gt;I would tell myself, “Jace, you could ask for more.&lt;br&gt;You might not want to, but if you don’t you wont know unless you get another job after.”&lt;/p&gt;&lt;p&gt;If you don’t ask the answer is always no.&lt;br&gt;That’s something I’ve come to learn over time.&lt;br&gt;This is true with negotiating.&lt;br&gt;If the salary isn’t up to your needs and you still want to spend more time checking out the offer.&lt;br&gt;Take a few hours, or a few days and think about other benefits that are negotiable. Some ideas might be;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Paid time off - Recurring expense&lt;/li&gt;&lt;li&gt;Signing Bonus - One time expense&lt;/li&gt;&lt;li&gt;Relocation Stipend - One time expense they can limit&lt;/li&gt;&lt;li&gt;Equity/Stock options - A future expense that could be reduced over time&lt;/li&gt;&lt;li&gt;Flexible work schedule - Costs nearly nothing&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I mean I never had any of success asking for these things but, you can’t get those things if you don’t ask.&lt;br&gt;If you’re walking away anyways, then ask.&lt;/p&gt;&lt;h2 id=&quot;interesting-is-a-wonderful-word&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/always-negotiate/#interesting-is-a-wonderful-word&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-02-always-negotiate/#interesting-is-a-wonderful-word&quot; rel=&quot;noopener&quot;&gt;“Interesting” is a wonderful word&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;It’s positive and non-commital. They give you a number you can tell them it’s interesting without giving the wrong impression.&lt;/p&gt;&lt;h2 id=&quot;using-a-significant-other-and-family-can-help-buy-time&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/always-negotiate/#using-a-significant-other-and-family-can-help-buy-time&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-02-always-negotiate/#using-a-significant-other-and-family-can-help-buy-time&quot; rel=&quot;noopener&quot;&gt;Using a significant other and family can help buy time&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Saying things like “This sounds great. Let me talk it over with the wife/husband.” will buy you time. Time to consider and after a call I’m generally&lt;br&gt;excited willing to agree to most things.&lt;/p&gt;&lt;h1 id=&quot;the-first-rule-is-what-everyone-has-told-you-never-give-a-number-first&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/always-negotiate/#the-first-rule-is-what-everyone-has-told-you-never-give-a-number-first&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-02-always-negotiate/#the-first-rule-is-what-everyone-has-told-you-never-give-a-number-first&quot; rel=&quot;noopener&quot;&gt;The first rule is what everyone has told you: Never give a number first&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;This is true. When forced deflect. If you can’t deflect, give a range. I don’t think I have much more to add here.&lt;/p&gt;&lt;h1 id=&quot;listen-to-what-people-tell-you-repeat-it-back-to-them&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/always-negotiate/#listen-to-what-people-tell-you-repeat-it-back-to-them&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-02-always-negotiate/#listen-to-what-people-tell-you-repeat-it-back-to-them&quot; rel=&quot;noopener&quot;&gt;Listen to what people tell you. Repeat it back to them.&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;When you see the job posting there are key phrases they use. You should note and use them with the company. See if any of those phrases jive with things you did in the past or are remotely like it, own it.&lt;/p&gt;&lt;h2 id=&quot;bring-a-notebook&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/always-negotiate/#bring-a-notebook&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-02-always-negotiate/#bring-a-notebook&quot; rel=&quot;noopener&quot;&gt;Bring a notebook&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Nothing stops you from bringing in a notebook to take notes while interviewing. Taking notes is important. I know my memory is my worst enemy. This is literally why I write this stuff down to better remember. Point is, write down the things they say that stand out. Those notes are great things to follow up on, and think about.&lt;/p&gt;&lt;h1 id=&quot;research-the-company&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/always-negotiate/#research-the-company&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-02-always-negotiate/#research-the-company&quot; rel=&quot;noopener&quot;&gt;Research the company&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Look up the company, try to figure out how their lines of business. This helps frame what will be important to the business. I like to try to find who my co-workers might be ahead of time. Some sites offer past questions asked for the employer. I’ve never had success with those but it gives you an idea of what might be asked.&lt;/p&gt;&lt;h1 id=&quot;thoughts-and-sources&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/always-negotiate/#thoughts-and-sources&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-06-02-always-negotiate/#thoughts-and-sources&quot; rel=&quot;noopener&quot;&gt;Thoughts and sources&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I just found the author at some point updated his post with a link to this great book(&lt;a href=&quot;https://amzn.to/302Czwx&quot; rel=&quot;noopener&quot;&gt;Fearless Salary Negotiation&lt;/a&gt;) and&amp;nbsp;&lt;a href=&quot;https://fearlesssalarynegotiation.com/salary-negotiation-guide/&quot; rel=&quot;noopener&quot;&gt;resource&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you’ve found this helpful, let me know.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>K20 Session Review</title>
      <link href="https://jace.pro/blog/k20-session-review/" />
      <updated>2020-05-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/k20-session-review/</id>
      <content type="html">
				&lt;p&gt;This is “Connect Week”. Here’s what I watched and my very rough notes.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-CCB3052&quot; rel=&quot;noopener&quot;&gt;GlideQuery: A modern upgrade to GlideRecord&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-CCW2583&quot; rel=&quot;noopener&quot;&gt;Lab/Workshop Advanced Scoped Development Techniques (CCW2583)&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=f89a140b1b74d4901759b8c11a4bcbd4&amp;amp;type=course&quot; rel=&quot;noopener&quot;&gt;Lab&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Guided Application Creator&lt;/li&gt;&lt;li&gt;Code Search&lt;/li&gt;&lt;li&gt;Source Control&lt;/li&gt;&lt;li&gt;Adding files to the studio project&lt;/li&gt;&lt;li&gt;Deployment Best Practices&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-KEY4943&quot; rel=&quot;noopener&quot;&gt;KEY4943&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Encourage networking&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;K20’s whole event’s objective is “focused on helping customers to achieve their business objects through digital transformation” - David Schneider&lt;/p&gt;&lt;ul&gt;&lt;li&gt;What does that really mean?&lt;/li&gt;&lt;li&gt;I mean, does that mean showing customers how others have gotten there?&lt;/li&gt;&lt;li&gt;Or does that include …&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;85-90% of the content is given by customers&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Themes for customers needs.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Customers need to be able to help themselves via on-demand resources&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Customer Success Center is a curated list of the best content based on usage and customer’s telling us.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Customers want community-based success experiences&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ServiceNow User Groups (Globally available)&lt;/li&gt;&lt;li&gt;Knowledge&lt;/li&gt;&lt;li&gt;Now Community … stats okay, its a big and busy community.&lt;/li&gt;&lt;li&gt;Success webinars&lt;/li&gt;&lt;li&gt;Success consultations&lt;/li&gt;&lt;li&gt;Genius Lounges&lt;/li&gt;&lt;li&gt;Meetups (this developer meetups?)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Wants access to access to ServiceNow experts, blueprints for success that will help them&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Sept 2019 NowLearning was released. Over 600k courses completed.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Catalog of NowLearning content is just getting added too, so the catalog is only going to get bigger and bigger as time continues.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Other Sites to help&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Developer portal&lt;/li&gt;&lt;li&gt;Product docs&lt;/li&gt;&lt;li&gt;Now support portal&lt;/li&gt;&lt;li&gt;Now support mobile app&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Calls to action&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Visit the Customer Success Center&lt;/li&gt;&lt;li&gt;Get involved of “Success experiences”&lt;/li&gt;&lt;li&gt;learn about success services&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Jace’s take. Community is big, you can get a lot from local events like the ServiceNow User Groups, and meetups. You can encourage people to use NowLearning to up their skills. However, ultimately, they recommended to buy success services from ServiceNow.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-DEM1202&quot; rel=&quot;noopener&quot;&gt;Knowledge Management&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Provide consistent resolutions for self-service&lt;/li&gt;&lt;li&gt;Encourage employees to create knowledge from their work&lt;/li&gt;&lt;li&gt;Identify gaps, curate new content, track usage, gov’, and quality trends&lt;/li&gt;&lt;li&gt;This Shows how it can be used from desktop/mobile/chat apps&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-BRE2961&quot; rel=&quot;noopener&quot;&gt;Augmented Reality for Field Service Management via CareAR&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Primary user servicing expectations&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Fast&lt;/li&gt;&lt;li&gt;Personalized&lt;/li&gt;&lt;li&gt;Consistent&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;So this is all about making video/collaborate, not using 3rd party consumer apps, aka FaceTime, Facebook messaging etc. It is pretty cool @ 18:20 you can see a demo of it.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-CCW2554&quot; rel=&quot;noopener&quot;&gt;Lab/Workshop Story Testing Scripts - Scoped Application (CCW2554)&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;This appears to be a lab to create a scoped app to build test scripts… Not sure how this is different than Test Management&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Best Practices for this* (@55:16)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Define involved users and roles of the story&lt;/li&gt;&lt;li&gt;Create a Test Script&lt;/li&gt;&lt;li&gt;Create Scenario for the Story&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-CCW1735&quot; rel=&quot;noopener&quot;&gt;Lab/Workshop Working with Remote Tables (CCW1735)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-THS3220&quot; rel=&quot;noopener&quot;&gt;Theater Generating Ideas Fast with Crazy 8’s (THS3220)&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;What are Crazy 8s&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Crazy 8’s is a brainstorming exercise that challenges people to sketch 8 distinct ideas in 8 minutes. The goal is to push beyond your first idea, and generate a wide variety of solutions to any challenge.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;When you use these? Early on in the ideation process. Or anytime you are stuck on a problem.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;At ServiceNow they typically do it here; --&amp;gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Conducting Crazy 8’s&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Pre session&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Gather Stakeholders. Anyone invested in the project. Crazy 8’s session can dbe done alone, it’s best with 3-4 people.&lt;/li&gt;&lt;li&gt;Review previous activities. A good way to get the team aligned is to review some of the projects past activities.&lt;/li&gt;&lt;li&gt;Understand the problem. Have key stakeholders deliver the problem.&lt;/li&gt;&lt;li&gt;Warm up. Allow the team to do some research and walk through existing solutions to similar problems.&lt;/li&gt;&lt;li&gt;Use Prompters. Share a few prompter ideas for people who have a hard time thinking through 8 variations.&lt;/li&gt;&lt;li&gt;Collate materials. Sheet of paper for each stake holder, pens, and a way to track time. Digitally, Video conf. with google slides.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;During the session&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Fold paper into 8 segments (first in 4 parts, then in half.)&lt;/li&gt;&lt;li&gt;Set the timer 60 seconds per segment (8 minutes total)&lt;/li&gt;&lt;li&gt;Participants sketch on the first segment until the timer dings. Then they move the next until all 8 segments have been filled.&lt;/li&gt;&lt;li&gt;Have participants Explain ideas individually.&lt;/li&gt;&lt;li&gt;Give participants a set number of votes on for things they like e.g. green dots.&lt;/li&gt;&lt;li&gt;Give participants a set number of votes on for things they dislike e.g. red dots.&lt;/li&gt;&lt;li&gt;As a team discuss where the ideas coalesced&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Post session&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Story board the workflows&lt;/li&gt;&lt;li&gt;Add more details to the better ideas&lt;/li&gt;&lt;li&gt;Build out prototypes&lt;/li&gt;&lt;li&gt;Consider a second crazy 8’s session with a different group&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=ref:K20-BRE1066&quot; rel=&quot;noopener&quot;&gt;Creating products on the Now Platform® to drive company growth&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Non SN stuff;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=snAhsXyO3Ck&quot; rel=&quot;noopener&quot;&gt;Lockdown Productivity: Spaceship You&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Glide Freaking Query Wow</title>
      <link href="https://jace.pro/blog/glide-freaking-query-wow/" />
      <updated>2020-05-24T00:00:00Z</updated>
      <id>https://jace.pro/blog/glide-freaking-query-wow/</id>
      <content type="html">
				&lt;p&gt;A month ago I&amp;nbsp;&lt;a href=&quot;https://jace.pro/post/2020-04-28-what-is-glidequery&quot; rel=&quot;noopener&quot;&gt;wrote about GlideQuery&lt;/a&gt;, asking &quot;… is GlideRecord going away? No. I don’t think so. &quot;&lt;/p&gt;&lt;p&gt;Well, I need to revise my thoughts on this. Before I go into why, lets first link to the sources and you can watch the 20+ minute video of the genius (Peter Bell) behind GlideQuery.&lt;/p&gt;&lt;p&gt;Link to that is here:&amp;nbsp;&lt;a href=&quot;https://events.servicenow.com/widget/servicenow/knowledge2020/myagenda/session/1581555110988001mNP1?sessionId=1581555110988001mNP1&quot; rel=&quot;noopener&quot;&gt;GlideQuery: A modern upgrade to GlideRecord&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Okay. Now that is out of the way lets talk about some of the major points here so if we lose the video we still have this&amp;nbsp;&lt;em&gt;somewhere&lt;/em&gt;&amp;nbsp;since as of right now this is&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/search?q=GlideQuery&quot; rel=&quot;noopener&quot;&gt;not&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/dev.do#!/search/orlando/All/GlideQuery&quot; rel=&quot;noopener&quot;&gt;documented&lt;/a&gt;&amp;nbsp;&lt;strong&gt;anywhere&lt;/strong&gt;.&lt;/p&gt;&lt;h1 id=&quot;what-does-glidequery-do-that-gliderecord-fails&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#what-does-glidequery-do-that-gliderecord-fails&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#what-does-glidequery-do-that-gliderecord-fails&quot;&gt;What does GlideQuery do that GlideRecord fails?&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;GlideQuery is a&amp;nbsp;&lt;strong&gt;server-side&lt;/strong&gt;&amp;nbsp;api for querying, updating, and deleting data. It’s in Orlando, and Paris. Behind the scenes it uses GlideRecord but with smart defaults that often will cause generally problems.&lt;/p&gt;&lt;p&gt;This api follows three guiding principals;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Fail Fast&lt;/li&gt;&lt;li&gt;Be JavaScript&lt;/li&gt;&lt;li&gt;Expressive&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Here’s some considerations;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Performance&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;failing-fast&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#failing-fast&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#failing-fast&quot;&gt;Failing Fast&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Improving the feedback loop&lt;/p&gt;&lt;h3 id=&quot;field-checking&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#field-checking&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#field-checking&quot;&gt;Field Checking&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Here’s a GlideRecord script with a problem&lt;br&gt;By default if a field name is wrong in GlideRecord, it queries&amp;nbsp;&lt;strong&gt;everything&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;In GlideQuery, this will fail and not execute on error.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;GlideRecord Example&lt;/th&gt;&lt;th&gt;GlideQuery Example&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/fieldcheckinggr.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/QNZFBNbOkT-650.webp 650w, https://jace.pro/img/QNZFBNbOkT-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/QNZFBNbOkT-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;526&quot; srcset=&quot;https://jace.pro/img/QNZFBNbOkT-650.jpeg 650w, https://jace.pro/img/QNZFBNbOkT-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/fieldcheckinggq.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/G1XkGlxrWW-650.webp 650w, https://jace.pro/img/G1XkGlxrWW-960.webp 960w, https://jace.pro/img/G1XkGlxrWW-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/G1XkGlxrWW-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;850&quot; srcset=&quot;https://jace.pro/img/G1XkGlxrWW-650.jpeg 650w, https://jace.pro/img/G1XkGlxrWW-960.jpeg 960w, https://jace.pro/img/G1XkGlxrWW-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;choice-checking&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#choice-checking&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#choice-checking&quot;&gt;Choice checking&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Here’s another example where unless you check your code you may miss it. This is because it returns no results.&lt;/p&gt;&lt;p&gt;If the api said, hey that value is not valid, that could help you faster.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;GlideRecord Example&lt;/th&gt;&lt;th&gt;GlideQuery Example&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/choicecheckinggr.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/ewgf_iFA-m-650.webp 650w, https://jace.pro/img/ewgf_iFA-m-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/ewgf_iFA-m-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;541&quot; srcset=&quot;https://jace.pro/img/ewgf_iFA-m-650.jpeg 650w, https://jace.pro/img/ewgf_iFA-m-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/choicecheckinggq.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/-WNkfj65Ll-650.webp 650w, https://jace.pro/img/-WNkfj65Ll-960.webp 960w, https://jace.pro/img/-WNkfj65Ll-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/-WNkfj65Ll-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;800&quot; srcset=&quot;https://jace.pro/img/-WNkfj65Ll-650.jpeg 650w, https://jace.pro/img/-WNkfj65Ll-960.jpeg 960w, https://jace.pro/img/-WNkfj65Ll-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;type-checking&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#type-checking&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#type-checking&quot;&gt;Type checking&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Travis Toulson wrote a whole post about&amp;nbsp;&lt;a href=&quot;https://codecreative.io/blog/is-gliderecord-getvalue-the-king-of-the-string/&quot; rel=&quot;noopener&quot;&gt;Is GlideRecord GetValue the king of the string&lt;/a&gt;… It’s great but this&amp;nbsp;&lt;strong&gt;SOLVES&lt;/strong&gt;&amp;nbsp;that whole issue.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;GlideRecord Example&lt;/th&gt;&lt;th&gt;GlideQuery Example&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/typecheckinggr.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/FrY5EKZwZT-650.webp 650w, https://jace.pro/img/FrY5EKZwZT-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/FrY5EKZwZT-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;556&quot; srcset=&quot;https://jace.pro/img/FrY5EKZwZT-650.jpeg 650w, https://jace.pro/img/FrY5EKZwZT-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/typecheckinggq.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/o1mEGz6_fT-650.webp 650w, https://jace.pro/img/o1mEGz6_fT-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/o1mEGz6_fT-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;532&quot; srcset=&quot;https://jace.pro/img/o1mEGz6_fT-650.jpeg 650w, https://jace.pro/img/o1mEGz6_fT-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/typecheckinggrupdate.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/RKkCLUTMCb-650.webp 650w, https://jace.pro/img/RKkCLUTMCb-960.webp 960w, https://jace.pro/img/RKkCLUTMCb-1294.webp 1294w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/RKkCLUTMCb-650.jpeg&quot; alt width=&quot;1294&quot; height=&quot;626&quot; srcset=&quot;https://jace.pro/img/RKkCLUTMCb-650.jpeg 650w, https://jace.pro/img/RKkCLUTMCb-960.jpeg 960w, https://jace.pro/img/RKkCLUTMCb-1294.jpeg 1294w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/typecheckinggqupdate.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/5AeXcvPVwH-650.webp 650w, https://jace.pro/img/5AeXcvPVwH-960.webp 960w, https://jace.pro/img/5AeXcvPVwH-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/5AeXcvPVwH-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;802&quot; srcset=&quot;https://jace.pro/img/5AeXcvPVwH-650.jpeg 650w, https://jace.pro/img/5AeXcvPVwH-960.jpeg 960w, https://jace.pro/img/5AeXcvPVwH-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;be-javascript&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#be-javascript&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#be-javascript&quot;&gt;Be JavaScript&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Isolation from Java&lt;/p&gt;&lt;h3 id=&quot;glidequery-should-behave-you-expect-a-regular-javascript-should-behave&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#glidequery-should-behave-you-expect-a-regular-javascript-should-behave&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#glidequery-should-behave-you-expect-a-regular-javascript-should-behave&quot;&gt;GlideQuery should behave you expect a regular JavaScript should behave.&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Type assumptions in are a real headache in ServiceNow with GlideRecord. It seems you get back a string type when you should get a number type.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;GlideRecord Example&lt;/th&gt;&lt;th&gt;GlideQuery Example&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/bejavascriptstringlytyped.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/IjCeUwyt1g-650.webp 650w, https://jace.pro/img/IjCeUwyt1g-960.webp 960w, https://jace.pro/img/IjCeUwyt1g-1262.webp 1262w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/IjCeUwyt1g-650.jpeg&quot; alt width=&quot;1262&quot; height=&quot;698&quot; srcset=&quot;https://jace.pro/img/IjCeUwyt1g-650.jpeg 650w, https://jace.pro/img/IjCeUwyt1g-960.jpeg 960w, https://jace.pro/img/IjCeUwyt1g-1262.jpeg 1262w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/bejavascriptstringlytypedgq.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/AKis7VkVbG-650.webp 650w, https://jace.pro/img/AKis7VkVbG-960.webp 960w, https://jace.pro/img/AKis7VkVbG-1262.webp 1262w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/AKis7VkVbG-650.jpeg&quot; alt width=&quot;1262&quot; height=&quot;878&quot; srcset=&quot;https://jace.pro/img/AKis7VkVbG-650.jpeg 650w, https://jace.pro/img/AKis7VkVbG-960.jpeg 960w, https://jace.pro/img/AKis7VkVbG-1262.jpeg 1262w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/bejavascriptstringlytyped2.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/loPz1usqNP-650.webp 650w, https://jace.pro/img/loPz1usqNP-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/loPz1usqNP-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;547&quot; srcset=&quot;https://jace.pro/img/loPz1usqNP-650.jpeg 650w, https://jace.pro/img/loPz1usqNP-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/bejavascriptstringlytyped3.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/NyIfIG3baa-650.webp 650w, https://jace.pro/img/NyIfIG3baa-960.webp 960w, https://jace.pro/img/NyIfIG3baa-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/NyIfIG3baa-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;606&quot; srcset=&quot;https://jace.pro/img/NyIfIG3baa-650.jpeg 650w, https://jace.pro/img/NyIfIG3baa-960.jpeg 960w, https://jace.pro/img/NyIfIG3baa-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;stacktraces&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#stacktraces&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#stacktraces&quot;&gt;Stacktraces&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;GlideRecord Example&lt;/th&gt;&lt;th&gt;GlideQuery Example&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/stacktracegr.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/sW7a-XaxCC-650.webp 650w, https://jace.pro/img/sW7a-XaxCC-960.webp 960w, https://jace.pro/img/sW7a-XaxCC-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/sW7a-XaxCC-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;516&quot; srcset=&quot;https://jace.pro/img/sW7a-XaxCC-650.jpeg 650w, https://jace.pro/img/sW7a-XaxCC-960.jpeg 960w, https://jace.pro/img/sW7a-XaxCC-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/stacktracegq.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/4e-IUNt0rH-650.webp 650w, https://jace.pro/img/4e-IUNt0rH-960.webp 960w, https://jace.pro/img/4e-IUNt0rH-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/4e-IUNt0rH-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;667&quot; srcset=&quot;https://jace.pro/img/4e-IUNt0rH-650.jpeg 650w, https://jace.pro/img/4e-IUNt0rH-960.jpeg 960w, https://jace.pro/img/4e-IUNt0rH-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;complex-queries-should-work-how-you-expect&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#complex-queries-should-work-how-you-expect&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#complex-queries-should-work-how-you-expect&quot;&gt;Complex Queries should work how you expect&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Queries that use both “AND” and “OR” logic. How is this evaluated?&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;GlideRecord Example&lt;/th&gt;&lt;th&gt;GlideQuery Example&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/complexqueriesgr.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/NMO6rBl0mZ-650.webp 650w, https://jace.pro/img/NMO6rBl0mZ-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/NMO6rBl0mZ-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;577&quot; srcset=&quot;https://jace.pro/img/NMO6rBl0mZ-650.jpeg 650w, https://jace.pro/img/NMO6rBl0mZ-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://jace.pro/static/img/complexqueriesgq.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/cxxpnk4nhh-650.webp 650w, https://jace.pro/img/cxxpnk4nhh-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/cxxpnk4nhh-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;547&quot; srcset=&quot;https://jace.pro/img/cxxpnk4nhh-650.jpeg 650w, https://jace.pro/img/cxxpnk4nhh-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;In SQL “AND” has priority over “OR”. In GlideRecord, “OR” has priority over “AND” and this causes problems. In GlideQuery they solve this by being allowing nested GlideQuery methods.&lt;/p&gt;&lt;h2 id=&quot;expressive&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#expressive&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#expressive&quot;&gt;Expressive&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Do more with less&lt;/p&gt;&lt;h3 id=&quot;returning-a-stream-or-optional&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#returning-a-stream-or-optional&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#returning-a-stream-or-optional&quot;&gt;Returning a Stream or Optional&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;When reading data with GlideQuery there are two classes used; Stream and Optional&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stream&lt;/th&gt;&lt;th&gt;Optional&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Used for reading records&lt;/td&gt;&lt;td&gt;Used for reading a single record&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Returned by&amp;nbsp;&lt;code&gt;select(1)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;“Empty” if a record isn’t found by a query&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Lazily evaluated&lt;/td&gt;&lt;td&gt;Returned by&amp;nbsp;&lt;code&gt;selectOne()&lt;/code&gt;,&amp;nbsp;&lt;code&gt;insert()&lt;/code&gt;, and&amp;nbsp;&lt;code&gt;update()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Common Stream methods: - map - flatMap - forEach - reduce - some - any&lt;/td&gt;&lt;td&gt;Common Optional methods: - get [throws if empty] - map - isEmpty - isPresent - ifPresent - orElse&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Examples;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/static/img/maponstream.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/y4wLUaMKGq-650.webp 650w, https://jace.pro/img/y4wLUaMKGq-960.webp 960w, https://jace.pro/img/y4wLUaMKGq-1294.webp 1294w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/y4wLUaMKGq-650.jpeg&quot; alt width=&quot;1294&quot; height=&quot;806&quot; srcset=&quot;https://jace.pro/img/y4wLUaMKGq-650.jpeg 650w, https://jace.pro/img/y4wLUaMKGq-960.jpeg 960w, https://jace.pro/img/y4wLUaMKGq-1294.jpeg 1294w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/static/img/someonstream.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/VLGxE4Jv0O-650.webp 650w, https://jace.pro/img/VLGxE4Jv0O-960.webp 960w, https://jace.pro/img/VLGxE4Jv0O-1346.webp 1346w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/VLGxE4Jv0O-650.jpeg&quot; alt width=&quot;1346&quot; height=&quot;518&quot; srcset=&quot;https://jace.pro/img/VLGxE4Jv0O-650.jpeg 650w, https://jace.pro/img/VLGxE4Jv0O-960.jpeg 960w, https://jace.pro/img/VLGxE4Jv0O-1346.jpeg 1346w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/static/img/everyonstream.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/FmPysj_WK8-650.webp 650w, https://jace.pro/img/FmPysj_WK8-960.webp 960w, https://jace.pro/img/FmPysj_WK8-1362.webp 1362w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/FmPysj_WK8-650.jpeg&quot; alt width=&quot;1362&quot; height=&quot;518&quot; srcset=&quot;https://jace.pro/img/FmPysj_WK8-650.jpeg 650w, https://jace.pro/img/FmPysj_WK8-960.jpeg 960w, https://jace.pro/img/FmPysj_WK8-1362.jpeg 1362w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;aggregation&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#aggregation&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#aggregation&quot;&gt;Aggregation&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Examples;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/static/img/aggregate1.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/_saCgHZrsi-650.webp 650w, https://jace.pro/img/_saCgHZrsi-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/_saCgHZrsi-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;410&quot; srcset=&quot;https://jace.pro/img/_saCgHZrsi-650.jpeg 650w, https://jace.pro/img/_saCgHZrsi-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/static/img/aggregate2.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/u_ml4LWKnl-650.webp 650w, https://jace.pro/img/u_ml4LWKnl-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/u_ml4LWKnl-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;428&quot; srcset=&quot;https://jace.pro/img/u_ml4LWKnl-650.jpeg 650w, https://jace.pro/img/u_ml4LWKnl-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/static/img/aggregate3.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/xf3ALZvQlY-650.webp 650w, https://jace.pro/img/xf3ALZvQlY-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/xf3ALZvQlY-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;1164&quot; srcset=&quot;https://jace.pro/img/xf3ALZvQlY-650.jpeg 650w, https://jace.pro/img/xf3ALZvQlY-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;insert&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#insert&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#insert&quot;&gt;Insert&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/static/img/insert.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/UwkG6sZy99-650.webp 650w, https://jace.pro/img/UwkG6sZy99-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/UwkG6sZy99-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;676&quot; srcset=&quot;https://jace.pro/img/UwkG6sZy99-650.jpeg 650w, https://jace.pro/img/UwkG6sZy99-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;delete&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#delete&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#delete&quot;&gt;Delete&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/static/img/delete.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/sA1yUZUcvP-650.webp 650w, https://jace.pro/img/sA1yUZUcvP-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/sA1yUZUcvP-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;448&quot; srcset=&quot;https://jace.pro/img/sA1yUZUcvP-650.jpeg 650w, https://jace.pro/img/sA1yUZUcvP-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;update&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#update&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#update&quot;&gt;Update&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/static/img/updateone.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/Wsm6zDeMKr-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/Wsm6zDeMKr-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;396&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/static/img/updatemultiple.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/HzyFuvyufy-650.webp 650w, https://jace.pro/img/HzyFuvyufy-856.webp 856w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/HzyFuvyufy-650.jpeg&quot; alt width=&quot;856&quot; height=&quot;482&quot; srcset=&quot;https://jace.pro/img/HzyFuvyufy-650.jpeg 650w, https://jace.pro/img/HzyFuvyufy-856.jpeg 856w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;field-flags&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#field-flags&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#field-flags&quot;&gt;Field Flags&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is important for currency and display values.&lt;/p&gt;&lt;p&gt;Flags mentioned&amp;nbsp;&lt;code&gt;$DISPLAY&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code&gt;$CURRENCY_CODE&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/static/img/flagscurrency.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/M4w9csk98A-650.webp 650w, https://jace.pro/img/M4w9csk98A-960.webp 960w, https://jace.pro/img/M4w9csk98A-1244.webp 1244w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/M4w9csk98A-650.jpeg&quot; alt width=&quot;1244&quot; height=&quot;626&quot; srcset=&quot;https://jace.pro/img/M4w9csk98A-650.jpeg 650w, https://jace.pro/img/M4w9csk98A-960.jpeg 960w, https://jace.pro/img/M4w9csk98A-1244.jpeg 1244w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;performance&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#performance&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#performance&quot;&gt;Performance&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;With business rules disabled here’s how GlideQuery stacks up to GlideRecord.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Method&lt;/th&gt;&lt;th&gt;GlideRecord&lt;/th&gt;&lt;th&gt;GlideQuery&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Insert 100 records&lt;/td&gt;&lt;td&gt;829 ms median&lt;/td&gt;&lt;td&gt;850 ms median (+2.5%)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Reading 1 record&lt;/td&gt;&lt;td&gt;2ms median&lt;/td&gt;&lt;td&gt;3ms median (+1 ms)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Reading 1,000 record&lt;/td&gt;&lt;td&gt;86.5 ms median&lt;/td&gt;&lt;td&gt;90.5 ms median (+4.62%)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Reading 10,000 record&lt;/td&gt;&lt;td&gt;842.5 ms median&lt;/td&gt;&lt;td&gt;890 ms median (+5.64%)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;It’s important to note that GlideQuery avoids common performance mistakes.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/static/img/commonperfmistakes.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/o_2LqS8NOo-650.webp 650w, https://jace.pro/img/o_2LqS8NOo-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/o_2LqS8NOo-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;627&quot; srcset=&quot;https://jace.pro/img/o_2LqS8NOo-650.jpeg 650w, https://jace.pro/img/o_2LqS8NOo-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/static/img/commonperfmistakes2.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/694Ubj7qCz-650.webp 650w, https://jace.pro/img/694Ubj7qCz-942.webp 942w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/694Ubj7qCz-650.jpeg&quot; alt width=&quot;942&quot; height=&quot;626&quot; srcset=&quot;https://jace.pro/img/694Ubj7qCz-650.jpeg 650w, https://jace.pro/img/694Ubj7qCz-942.jpeg 942w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;current-limitations-and-future-work&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#current-limitations-and-future-work&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/blog/glide-freaking-query-wow/#current-limitations-and-future-work&quot;&gt;Current Limitations and Future work&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Scoped table permission checking&lt;/li&gt;&lt;li&gt;Allow opting out of field/choice checking&lt;/li&gt;&lt;li&gt;Better join support&lt;/li&gt;&lt;li&gt;Field casting&lt;/li&gt;&lt;li&gt;Parsing encoded queries&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>What are all the shortcuts in ServiceNow?</title>
      <link href="https://jace.pro/blog/what-are-all-the-shortcuts-in-servicenow/" />
      <updated>2020-05-22T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-are-all-the-shortcuts-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;I was watching the #til channel on&amp;nbsp;&lt;a href=&quot;https://jace.pro/post/2020-05-22-all-the-shortcuts/sndevs.com&quot; rel=&quot;noopener&quot;&gt;SNDevs&lt;/a&gt;&amp;nbsp;slack. The navigation shortcut of&amp;nbsp;&lt;code&gt;table.filter&lt;/code&gt;&amp;nbsp;came up. I didn’t know about it. It’s great. Instead of writing about just that, I include all the shortcuts.&lt;/p&gt;&lt;p&gt;ServiceNow has 3 sets of shortcuts. They have UI15 Keyboard shortcuts. I’m not covering those as no one uses UI15 anymore.&lt;/p&gt;&lt;h1 id=&quot;keyboard-shortcuts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-are-all-the-shortcuts-in-servicenow/#keyboard-shortcuts&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-05-22-all-the-shortcuts/#keyboard-shortcuts&quot; rel=&quot;noopener&quot;&gt;Keyboard shortcuts&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;There’s only a few that ServieNow observes. Extensions add some too.&lt;/p&gt;&lt;h2 id=&quot;out-of-box-shortcuts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-are-all-the-shortcuts-in-servicenow/#out-of-box-shortcuts&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-05-22-all-the-shortcuts/#out-of-box-shortcuts&quot; rel=&quot;noopener&quot;&gt;Out of box shortcuts&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A thing to note,&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-platform-user-interface/page/use/navigation/task/configure-keyboard-shortcut-preferences.html&quot; rel=&quot;noopener&quot;&gt;some of these are configurable&lt;/a&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Action&lt;/th&gt;&lt;th&gt;Windows keyboard shortcut&lt;/th&gt;&lt;th&gt;Mac keyboard shortcut&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Activate global search field&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Alt&lt;/code&gt;+&lt;code&gt;G&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Opt&lt;/code&gt;+&lt;code&gt;G&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Toggle application navigator&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Alt&lt;/code&gt;+&lt;code&gt;C&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Opt&lt;/code&gt;+&lt;code&gt;C&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Activate navigation filter field&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Alt&lt;/code&gt;+&lt;code&gt;F&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Opt&lt;/code&gt;+&lt;code&gt;F&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Impersonate user&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Alt&lt;/code&gt;+&lt;code&gt;I&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Opt&lt;/code&gt;+&lt;code&gt;I&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Navigate to the main content on the page&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Alt&lt;/code&gt;+&lt;code&gt;P&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Opt&lt;/code&gt;+&lt;code&gt;P&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Javascript Executor Window&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Shift&lt;/code&gt;+&lt;code&gt;J&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Shift&lt;/code&gt;+&lt;code&gt;J&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;On Service Portal id=form Save the form&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;S&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;S&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;On Service Portal widget editor, Save&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;S&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;S&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;On script editor fields, format code&lt;/td&gt;&lt;td&gt;&lt;code&gt;Shift&lt;/code&gt;+&lt;code&gt;Tab&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Shift&lt;/code&gt;+&lt;code&gt;Tab&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;from-sn-utils&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-are-all-the-shortcuts-in-servicenow/#from-sn-utils&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-05-22-all-the-shortcuts/#from-sn-utils&quot; rel=&quot;noopener&quot;&gt;From SN Utils&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Action&lt;/th&gt;&lt;th&gt;Keyboard shortcut&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Save the current form&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;S&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Create List filter&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Left Click&lt;/code&gt;&amp;nbsp;on Field Label&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Paste screenshots&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;V&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Activate the extension&lt;/td&gt;&lt;td&gt;Configurable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pop-In/Pop-Out of&amp;nbsp;&lt;code&gt;nav_to.do&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Configurable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Show Technical Names&lt;/td&gt;&lt;td&gt;Configurable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Open slashcommand popup&lt;/td&gt;&lt;td&gt;Configurable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Open VS Code ScriptSync tab&lt;/td&gt;&lt;td&gt;Configurable&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Source:&amp;nbsp;&lt;a href=&quot;https://twitter.com/sn_utils/status/1192913388906713088&quot; rel=&quot;noopener&quot;&gt;https://twitter.com/sn_utils/status/1192913388906713088&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;navigation-shortcuts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-are-all-the-shortcuts-in-servicenow/#navigation-shortcuts&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-05-22-all-the-shortcuts/#navigation-shortcuts&quot; rel=&quot;noopener&quot;&gt;Navigation shortcuts&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow’s docs on this are… well they say this same thing. I just wish there was more to this.&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-platform-user-interface/page/administer/navigation-and-ui/task/t_NavigateDirectlyToATable.html&quot; rel=&quot;noopener&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Shortcut&lt;/th&gt;&lt;th&gt;Do I Use This&lt;/th&gt;&lt;th&gt;What does it do&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;table.config&lt;/code&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Opens a list of all things related to a table&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;table.list&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Opens the list of all records on said table in the current frame&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;table.LIST&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Opens the list of all records on said table in a new tab&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;table.do&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Opens a empty form for said table in the current frame&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;table.form&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Opens a empty form for said table in the current frame&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;table.FORM&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Opens a empty form for said table in a new tab&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;table.filter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Opens the list for a table with no records in the current frame&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;table.FILTER&lt;/code&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Opens the list for a table with no records in a new tab&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;I looked for where these are configured/built, and they are hardcoded in&amp;nbsp;&lt;a href=&quot;https://hi.service-now.com/scripts/app.magellan/directive.magellanNavigationFilter.js&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;/scripts/app.magellan/directive.magellanNavigationFilter.js&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*! RESOURCE: /scripts/app.magellan/directive.magellanNavigationFilter.js */&lt;/span&gt;
angular&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Magellan&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;directive&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;magellanNavigationFilter&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token parameter&quot;&gt;$rootScope&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    glideUrlBuilder&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    $window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    snCustomEvent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    $timeout&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    concourseNavigatorService&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;restrict&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;A&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function-variable function&quot;&gt;link&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;scope&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; selectedIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; selectedElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; shortcutCallback &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; collection &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; nav &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;$j&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#nav_west_center&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;focus&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;$timeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;clearHighlight&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        angular&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#gsft_nav a.state-active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;state-active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; _$navRoot&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;_focusFirstItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;_$navRoot&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          _$navRoot &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#gsft_nav&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;$timeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          $window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;requestAnimationFrame&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            _$navRoot&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.state-active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;state-active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $visibleItems &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _$navRoot&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;a.sn-widget-list-item:visible&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$visibleItems&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              $visibleItems&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eq&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;state-active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filterText &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;filterTextValue&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; highlightFirstItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;angular&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isDefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          concourseNavigatorService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filterTerm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filterText &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;clearShortcutPreview&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;handleNavFilterExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;handleShortcuts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;highlightFirstItem &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; highlightFirstItem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;_focusFirstItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;handleEnterKeypress&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;$event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;selectedElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; $selected &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#gsft_nav&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.state-active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$selected&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            selectedElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $selected&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;handleEnterKeypressEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;reset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;handleShortcutCallback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;DETECT_JAVASCRIPT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;^javascript:&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleEnterKeypressEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;$event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;selectedElement &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;selectedElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;DETECT_JAVASCRIPT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;selectedElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          $window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; selectedElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;navigate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;selectedElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; selectedElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;target&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          $event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleShortcutCallback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;shortcutCallback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;shortcutCallback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filterTextValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;clearShortcutPreview&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleNavFilterExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; $window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;navFilterExtension &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;function&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; $window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;navFilterExtension&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;val&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;jslog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Error in UI Script navFilterExtension - &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleShortcuts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;filterText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tooltip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        shortcutCallback &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.form&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.form&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          tooltip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Press enter to open the &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; form&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;shortcutCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;navigate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;glideUrlBuilder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getCancelableLink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.do?sys_id=-1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.list&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.list&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          tooltip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Press enter to open the &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; list&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;shortcutCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;navigate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;glideUrlBuilder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getCancelableLink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_list.do&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.config&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.config&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          tooltip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Press enter to open the &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; configuration&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;shortcutCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;navigate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;glideUrlBuilder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getCancelableLink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;buildTableConfigURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.filter&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.filter&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          tooltip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Press enter to open an empty &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; list&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;shortcutCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;navigate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;glideUrlBuilder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getCancelableLink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_list.do?sysparm_filter_only=true&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.FORM&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.FORM&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          tooltip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Press enter to open the &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; form in a new window&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;shortcutCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            $window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;glideUrlBuilder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newGlideUrl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.do?sys_id=-1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.LIST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.LIST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          tooltip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Press enter to open the &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; list in a new window&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;shortcutCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            $window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;glideUrlBuilder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newGlideUrl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_list.do&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.CONFIG&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.CONFIG&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          tooltip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Press enter to open the &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; configuration in a new window&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;shortcutCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            $window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;buildTableConfigURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.FILTER&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.FILTER&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          tooltip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Press enter to open an empty &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; list in a new window&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;shortcutCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            $window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;glideUrlBuilder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newGlideUrl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_list.do?sysparm_filter_only=true&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;_list.do&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;_list.do&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          tooltip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Press enter to open the &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; list&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;shortcutCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;navigate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_list.do&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.do&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          tooltip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Press enter to open &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;shortcutCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;navigate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        top&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;NOW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;magellan &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; top&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;NOW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;magellan&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;setNavigatingState &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; top&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;NOW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;magellan&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setNavigatingState&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tooltip &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;previewShortcut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tooltip&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;buildTableConfigURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; glideUrlBuilder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newGlideUrl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;personalize_all.do&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_rules_table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_rules_label&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;previewShortcut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; placement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dir&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;rtl&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;left&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;right&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;tooltip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;placement&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; placement&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;body&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;manual&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; title
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;tooltip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;show&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isPreviewOpen &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;clearShortcutPreview&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isPreviewOpen&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;tooltip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;destroy&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isPreviewOpen &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          shortcutCallback &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setSelected&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;index &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; selectedIndex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;selectedElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;state-active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          selectedIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; index&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          selectedElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; collection&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          element &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;selectedElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;state-active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;reset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        selectedIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;selectedElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;selectedElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;state-active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          selectedElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        collection &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      $rootScope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;applicationTree.rendered&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;reset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filteredApplications &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filteredApplications&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filterText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            collection &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#gsft_nav&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;a.sn-widget-list-item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; collection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;collection&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; collection&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;javascript:void(0)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token function&quot;&gt;setSelected&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                    nav&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;scrollTop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filterText &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;clearShortcutPreview&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.nav-body&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;click&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;a&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;href&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;#&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;reset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>How to Save Knowledge Sessions Locally</title>
      <link href="https://jace.pro/blog/how-to-save-knowledge-sessions-locally/" />
      <updated>2020-05-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-save-knowledge-sessions-locally/</id>
      <content type="html">
				&lt;p&gt;So I was in the “Automate ServiceNow CI/CD” lab and the question came up, “How long will this session be online for me to view?”. I’d link to it but the links are terrible because they change, hence this post.&lt;/p&gt;&lt;p&gt;If you don’t trust you will get to the lab/video soon, I’d encourage you to save the video locally so you KNOW you’ll have it to watch later.&lt;/p&gt;&lt;p&gt;I can hear you now, Jace, how can you do that? Well it seems the K19 and K20 both used this Brightcove video delivery system. Brightcove videos are not the simpliest to download but, you can save a video in about 5 clicks.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Right click the video being presented, open “Player Information”&lt;/li&gt;&lt;li&gt;Copy the “Video ID” into this string replacing YourVideoID&amp;nbsp;&lt;code&gt;http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=YourVideoID&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=YourVideoID&quot; rel=&quot;noopener&quot;&gt;http://players.brightcove.net/5703385908001/zKNjJ2k2DM_default/index.html?videoId=YourVideoID&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol start=&quot;3&quot;&gt;&lt;li&gt;Take that string and paste it into&amp;nbsp;&lt;a href=&quot;https://bitdownloader.com/&quot; rel=&quot;noopener&quot;&gt;bitdownloader.com&lt;/a&gt;&amp;nbsp;and click the “Download”.&lt;/li&gt;&lt;li&gt;Now at the bottom is a list of videos with resolutions, Right click the video download button at the bottom, and click Save as, give it an apt name and you’re set.&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>What is GlideQuery</title>
      <link href="https://jace.pro/blog/what-is-glidequery/" />
      <updated>2020-04-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-glidequery/</id>
      <content type="html">
				&lt;p&gt;So this is a new thing that may change how code is written for some.&lt;/p&gt;&lt;p&gt;Let me show you an example of the code and output. Then I’ll write my thoughts.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; testGlideQuery &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;first_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;last_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toArray&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;testGlideQuery: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;testGlideQuery&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*
*** Script: testGlideQuery: [
 {
  &quot;first_name&quot;: &quot;a&quot;,
  &quot;last_name&quot;: &quot;b&quot;,
  &quot;active&quot;: true,
  &quot;sys_id&quot;: &quot;9033c10d2f674c10bd54d5f62799b666&quot;
 },
 {
  &quot;first_name&quot;: &quot;Aada&quot;,
  &quot;last_name&quot;: &quot;Keranen&quot;,
  &quot;active&quot;: true,
  &quot;sys_id&quot;: &quot;15a849d32fd34810bd54d5f62799b6be&quot;
 },
 ...
*/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So, yea. That’s interesting. Before you go and look if you can use this in your instance, you probably don’t have it yet. To get it, enable the SAM and SAAS plugins.&lt;/p&gt;&lt;p&gt;The methods are exposed and is written in a interesting way. I suggest you check it out.&lt;/p&gt;&lt;p&gt;This brings up the big question, is GlideRecord going away? No. I don’t think so. This seems to be just a wrapper to allow chain-able calls to query the data. Maybe as the Now Experience comes up this will be used more in that but I don’t think so. I think this is just a wrapper some team made to make their code look one way.&lt;/p&gt;&lt;p&gt;In any case, I wanted to write this down so if anyone looks for it something comes up, because as of now, it’s not written down anywhere.&lt;/p&gt;&lt;h2 id=&quot;comments&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-glidequery/#comments&quot; class=&quot;heading-anchor&quot;&gt;Comments&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/crash180&quot; rel=&quot;noopener&quot;&gt;crash180&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/179#issuecomment-621436055&quot; rel=&quot;noopener&quot;&gt;on Apr 29, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Interesting the things you can find when you dig a little bit. I have not heard of GlideQuery either&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/nikhilkumarsrs&quot; rel=&quot;noopener&quot;&gt;nikhilkumarsrs&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/179#issuecomment-623983081&quot; rel=&quot;noopener&quot;&gt;on May 5, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Hi Jace, It says&lt;br&gt;Evaluator: org.mozilla.javascript.EcmaError: “GlideQuery” is not defined.&lt;br&gt;Caused by error in script at line&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/179#issuecomment-624658335&quot; rel=&quot;noopener&quot;&gt;on May 6, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/nikhilkumarsrs&quot; rel=&quot;noopener&quot;&gt;@nikhilkumarsrs&lt;/a&gt;&amp;nbsp;You’ll need to enable the SAM Pro plugins to use this it seems&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/nikhilkumarsrs&quot; rel=&quot;noopener&quot;&gt;nikhilkumarsrs&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/179#issuecomment-624748568&quot; rel=&quot;noopener&quot;&gt;on May 6, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;@jacebenson&lt;/a&gt;&amp;nbsp;Hi Jace, SAM pro plugin is already active and still same error.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/179#issuecomment-624893272&quot; rel=&quot;noopener&quot;&gt;on May 6, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I must have some more things on… com.sn_glidequery is what it says it’s a part of;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://user-images.githubusercontent.com/638764/81228723-2e2fef00-8fb4-11ea-87b2-c843c78fdc82.png&quot; rel=&quot;noopener&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/179#issuecomment-624894680&quot; rel=&quot;noopener&quot;&gt;on May 6, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Maybe it’s installed as part of this, but this isn’t on the production instance I have access to.&lt;br&gt;&lt;a href=&quot;https://user-images.githubusercontent.com/638764/81228899-823ad380-8fb4-11ea-9dcb-26a39e7cf15a.png&quot; rel=&quot;noopener&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I know I have this on all the environments it exists;&lt;br&gt;&lt;a href=&quot;https://user-images.githubusercontent.com/638764/81228944-a26a9280-8fb4-11ea-8245-64f6e2f56595.png&quot; rel=&quot;noopener&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;sn_sam_saa&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/nthumma&quot; rel=&quot;noopener&quot;&gt;nthumma&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/179#issuecomment-633751111&quot; rel=&quot;noopener&quot;&gt;on May 25, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Nice article Jace!&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Regress - ATF Recorder Share Review</title>
      <link href="https://jace.pro/blog/regress-atf-recorder-share-review/" />
      <updated>2020-04-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/regress-atf-recorder-share-review/</id>
      <content type="html">
				&lt;p&gt;The other day I was looking at something when I saw this post by Paul Morris called, “&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=a4398aea1bb20c18fff162c4bd4bcbc8&quot; rel=&quot;noopener&quot;&gt;Automating ATF - My Journey Building a Test Recorder&lt;/a&gt;”. I had to try it out. It’s a work in progress but it is so very promising.&lt;/p&gt;&lt;p&gt;A few things to note. As of right now it is only written to work on UI16, and there are some things that are still being worked on. Other projects like it are Jared Laethem’s&amp;nbsp;&lt;a href=&quot;https://dotwalk.io/bootstrap&quot; rel=&quot;noopener&quot;&gt;Dotwalk.io Bootstrap&lt;/a&gt;&lt;/p&gt;&lt;p&gt;When I tried Paul share out it created the steps, but a few steps weren’t created. But it got a lot of the things. I may end up installing this on a sub=prod to generate the tests and then tweak as needed.&lt;/p&gt;&lt;p&gt;In any case you all should check out this tool and give your feedback on the&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/share/contents/5672333_regress_atf_service_catalog_test_generator&quot; rel=&quot;noopener&quot;&gt;share page&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>How do you refer to ServiceNow?</title>
      <link href="https://jace.pro/blog/how-do-you-refer-to-servicenow/" />
      <updated>2020-04-27T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-do-you-refer-to-servicenow/</id>
      <content type="html">
				&lt;blockquote&gt;&lt;p&gt;Abbreviations and acronyms are shortened forms of words or phrases. An abbreviation is typically a shortened form of words used to represent the whole (such as Dr. or Prof.) while an acronym contains a set of initial letters from a phrase that usually form another word (such as radar or scuba).&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Like me, you probably have seen many refer to ServiceNow as “Snow” or “SN”.&lt;/p&gt;&lt;p&gt;Is there a right way to shorten ServiceNow?&lt;/p&gt;&lt;p&gt;As much as I want to say one way is right, and the other is wrong, by the results of the survey, really we should just use the full name.&lt;/p&gt;&lt;p&gt;What do you use when referring to ServiceNow, let me know in the comments or reply to the&amp;nbsp;&lt;a href=&quot;https://twitter.com/jacebenson/status/1254853140551069702&quot; rel=&quot;noopener&quot;&gt;survey&lt;/a&gt;&amp;nbsp;and why.&lt;/p&gt;&lt;h2 id=&quot;further-reading&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-do-you-refer-to-servicenow/#further-reading&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-04-27-why-do-some-call-servicenow-snow-and-sn/#further-reading&quot; rel=&quot;noopener&quot;&gt;Further Reading&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://abbreviations.yourdictionary.com/articles/what-is-the-difference-between-an-abbreviation-and-an-acroynm.html&quot; rel=&quot;noopener&quot;&gt;https://abbreviations.yourdictionary.com/articles/what-is-the-difference-between-an-abbreviation-and-an-acroynm.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>K20 Hackathon</title>
      <link href="https://jace.pro/blog/k20-hackathon/" />
      <updated>2020-04-23T00:00:00Z</updated>
      <id>https://jace.pro/blog/k20-hackathon/</id>
      <content type="html">
				&lt;p&gt;Last year I was pretty bitter about the hackathon. This year, I think the event will be better. Andrew Barnes and Brad Tilton are running this event. As I understand it these are the details;&lt;/p&gt;&lt;p&gt;First lets go over what you’ll get out of this.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You will learn how to build whatever it is you’re building. So if you want to try out the new now-experience, here’s your time to shine.&lt;/li&gt;&lt;li&gt;You will likely form a team and make better bonds with those on it.&lt;/li&gt;&lt;li&gt;You might win one the five categories, if you do you’ll get $500 USD, or $5,000 USD for your team.&lt;/li&gt;&lt;li&gt;ServiceNow may feature your work in some content sent out to people who want that kind of stuff.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now let’s go over the specifics.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Questions&lt;/th&gt;&lt;th&gt;Answers&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;How big can the teams be?&lt;/td&gt;&lt;td&gt;1-8 people.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;When does it start?&lt;/td&gt;&lt;td&gt;May 1st.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;When does it end?&lt;/td&gt;&lt;td&gt;May 3rd.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;How many teams will be named winners?&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;What criteria will things be judged by?&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Last year&amp;nbsp;&lt;a href=&quot;https://jace.pro/post/2019-04-22-knowledge-hackathon-past/&quot; rel=&quot;noopener&quot;&gt;I wrote up a detailed blog about winning hackathons&lt;/a&gt;&amp;nbsp;and reviewed all the past hackathons I could find (2013-2018).&lt;/p&gt;&lt;p&gt;May the odds be ever in your favor.&lt;/p&gt;&lt;h2 id=&quot;further-reading&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/k20-hackathon/#further-reading&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-04-23-k20-hackathon-see-you-there/#further-reading&quot; rel=&quot;noopener&quot;&gt;Further reading&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://finite-partners.com/preparing-for-the-k20-hackathon/&quot; rel=&quot;noopener&quot;&gt;Preparing for K20 hackathon by Jarod Mundt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/post/2019-04-22-knowledge-hackathon-past/&quot; rel=&quot;noopener&quot;&gt;2013-2018 Hackathon winners&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ctzX-ANG_Sk&amp;amp;feature=youtu.be&quot; rel=&quot;noopener&quot;&gt;Robert Fedoruk’s amazing Hackathon video&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://hacknow.service-now.com/creatorcon&quot; rel=&quot;noopener&quot;&gt;Official site&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>How Virtual Task Boards Broke Labels Tags</title>
      <link href="https://jace.pro/blog/how-virtual-task-boards-broke-labels-tags/" />
      <updated>2020-04-23T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-virtual-task-boards-broke-labels-tags/</id>
      <content type="html">
				&lt;p&gt;You might know about this&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=dhqkmbMX68I&quot; rel=&quot;noopener&quot;&gt;old feature called “labels”&lt;/a&gt;. Well, now their called “Tags” but back then they were labels. In the New York release ServiceNow broke them. Here’s the short version. Instead of giving the right users visibility to the tags, everyone can see any tag on a Virtual Task Board (VTB).&lt;/p&gt;&lt;p&gt;How can you see this problem? Take these steps;&lt;/p&gt;&lt;p&gt;Steps to reproduce&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Log in to Dev&lt;/li&gt;&lt;li&gt;Create a visual task board.&lt;/li&gt;&lt;li&gt;Add a new Label&lt;/li&gt;&lt;li&gt;Apply the label to a record on your VTB&lt;/li&gt;&lt;li&gt;Add a user on the VTB&lt;/li&gt;&lt;li&gt;Impersonate some other user (not the user in 5)&lt;/li&gt;&lt;li&gt;Go to a list and show the tags column&lt;/li&gt;&lt;li&gt;Start typing the tag name in the tag column, you’ll see the tag created in 3.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;ServiceNow did the right thing moving to a central place to deal with label/tags.&lt;br&gt;But, they should have used permissions to control who can see them based on the task board.&lt;br&gt;I opened a HI ticket ally was able for them to give me a work around.&lt;/p&gt;&lt;p&gt;I didn’t write this code, it worked for me in my tests. It’s saved some other work too, but read the code and ensure it’s doing what you think it should.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/post/2020-04-23-how-vtb-broke-labels-tags/sys_script_fix_make_vtb_labels_inactive.xml&quot; rel=&quot;noopener&quot;&gt;Fix Script &quot;Make VTB Labels Inactive&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/post/2020-04-23-how-vtb-broke-labels-tags/sys_script_make_vtb_labels_inactive.xml&quot; rel=&quot;noopener&quot;&gt;Business Rule &quot;Make VTB Labels Inactive&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/post/2020-04-23-how-vtb-broke-labels-tags/sys_script_make_non_vtb_labels_active.xml&quot; rel=&quot;noopener&quot;&gt;Business Rule &quot;Make non-VTB Labels Active&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;further-reading&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-virtual-task-boards-broke-labels-tags/#further-reading&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-04-23-how-vtb-broke-labels-tags/#further-reading&quot; rel=&quot;noopener&quot;&gt;Further Reading&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0788952&quot; rel=&quot;noopener&quot;&gt;HI KB0788952 - VTB Working as designed&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=view_idea&amp;amp;sysparm_idea_id=00d61985db960c501cd8a345ca961948&amp;amp;sysparm_idea_table=x_snc_com_ideation_idea&amp;amp;sysparm_module_id=enhancement_requests&quot; rel=&quot;noopener&quot;&gt;VTB Idea to improve tables&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Fix Scripts Can Rollback Now</title>
      <link href="https://jace.pro/blog/fix-scripts-can-rollback-now/" />
      <updated>2020-04-23T00:00:00Z</updated>
      <id>https://jace.pro/blog/fix-scripts-can-rollback-now/</id>
      <content type="html">
				&lt;p&gt;If you’ve come to here looking to undo a fix script, I have bad news for you. I cannot fix the problem you currently have, but I can show you how to save yourself in the future.&lt;/p&gt;&lt;p&gt;So the other day people were talking about what to use to fix some data in their instance. The choices were Background Scripts, and Fix Scripts.&lt;/p&gt;&lt;p&gt;So I took note about why would you ever use a background script in favor of a fix script. One thing that stood out was background scripts can “rollback” the updates.&lt;br&gt;Fix scripts don’t show a way to do that. Then a few days later 0x111 shared on Discord that in fact they can be rolled back for fix scripts, but you have to set it up.&lt;/p&gt;&lt;p&gt;What do I mean? Well according to&amp;nbsp;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0761248&quot; rel=&quot;noopener&quot;&gt;this hi article(KB0761248)&lt;/a&gt;. You have to show the “Record for rollback” field, and check it if you intend to “rollback” the updates.&lt;/p&gt;&lt;h2 id=&quot;heres-what-i-saw&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/fix-scripts-can-rollback-now/#heres-what-i-saw&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-04-23-fix-scripts-can-rollback-now/#heres-what-i-saw&quot; rel=&quot;noopener&quot;&gt;Here’s what I saw&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;Background Script&lt;/th&gt;&lt;th&gt;Fix Script&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Can choose your scope at execution&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;⛔&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=67610b29db98dbc01dcaf3231f9619a0&quot; rel=&quot;noopener&quot;&gt;Can run on application install&lt;/a&gt;&lt;/td&gt;&lt;td&gt;⛔&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Audit&lt;/td&gt;&lt;td&gt;System Log only&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Instant Return&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;When run in foreground&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Can run in the background&lt;/td&gt;&lt;td&gt;⛔&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Syntax Highlighting&lt;/td&gt;&lt;td&gt;⛔&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Intellisense&lt;/td&gt;&lt;td&gt;⛔&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Versioning&lt;/td&gt;&lt;td&gt;⛔&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Can be cancelled&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Updates can be rolled back&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;If you tell it&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;This feature is great, but why is it default unchecked? I know it’s new as of London but come on. This makes using Fix Scripts the way to do things.&lt;/p&gt;&lt;h2 id=&quot;further-reading&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/fix-scripts-can-rollback-now/#further-reading&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-04-23-fix-scripts-can-rollback-now/#further-reading&quot; rel=&quot;noopener&quot;&gt;Further Reading&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Steven Bell has a post titled, “&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=e81eae2ddbd0dbc01dcaf3231f96194f&quot; rel=&quot;noopener&quot;&gt;Two Methods for Code Development&lt;/a&gt;”&lt;/li&gt;&lt;li&gt;John Roberts writes about Fix Scripts in “&lt;a href=&quot;http://www.cavucode.com/blog/2015/4/12/fujiforty-get-your-fix&quot; rel=&quot;noopener&quot;&gt;FujiForty - Get Your Fix&lt;/a&gt;”&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;How long do these rollbacks last? Well that depends on the value of the property,&amp;nbsp;&lt;code&gt;glide.rollback.expiration_days&lt;/code&gt;. More about that here on this&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-platform-administration/page/administer/table-administration/concept/rollback-contexts.html&quot; rel=&quot;noopener&quot;&gt;rollback contexts doc&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Thanks Kalai for the information on the rollback contexts.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Now Experience Notes</title>
      <link href="https://jace.pro/blog/now-experience-notes/" />
      <updated>2020-03-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/now-experience-notes/</id>
      <content type="html">
				&lt;p&gt;I was following along with&amp;nbsp;&lt;a href=&quot;https://andrew.alburydor.com/posts/2020-03-20-nowui-part1/&quot; rel=&quot;noopener&quot;&gt;Upside-down Andrew’s posts&lt;/a&gt;&amp;nbsp;and taking notes trying to get a now-expierence component to work.&lt;/p&gt;&lt;p&gt;Here’s my notes;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Checked version of node;&amp;nbsp;&lt;code&gt;node --version&lt;/code&gt;&amp;nbsp;it’s at 12.16.1&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Checked version of npm;&amp;nbsp;&lt;code&gt;npm --version&lt;/code&gt;&amp;nbsp;it’s at 6.13.4 (howver there’s a upgrade to 6.14.4)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Checked version of now-cli;&amp;nbsp;&lt;code&gt;now-cli --version&lt;/code&gt;&amp;nbsp;it’s at 17.0.2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Created folder/repository to render a joke from&amp;nbsp;&lt;a href=&quot;http://joke.jace.pro/&quot; rel=&quot;noopener&quot;&gt;joke.jace.pro&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Created&amp;nbsp;&lt;a href=&quot;http://readme.md/&quot; rel=&quot;noopener&quot;&gt;README.md&lt;/a&gt;&amp;nbsp;file with aweseome contnet (thanks AAD)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Staged my commit of the update to&amp;nbsp;&lt;a href=&quot;http://readme.md/&quot; rel=&quot;noopener&quot;&gt;README.md&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Created Repository on Github&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/now-joke&quot; rel=&quot;noopener&quot;&gt;https://github.com/jacebenson/now-joke&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Added SSH Repository link&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ensured&amp;nbsp;&lt;code&gt;git@github.com:jacebenson/now-joke.git&lt;/code&gt;&amp;nbsp;is returned when&amp;nbsp;&lt;code&gt;git remote show origin&lt;/code&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If you don’t have SSH configured with Git, you’ll want to undo the git url and use https instead… really set up SSH&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh&quot; rel=&quot;noopener&quot;&gt;Github’s docs to do this&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Push your either by&amp;nbsp;&lt;code&gt;git push -u origin remote&lt;/code&gt;&amp;nbsp;or with buttons in VS Code. You should see the file on&amp;nbsp;&lt;a href=&quot;http://github.com/&quot; rel=&quot;noopener&quot;&gt;github.com&lt;/a&gt;&amp;nbsp;with it’s contents&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;You need an empty to build the project, so lets delete that&amp;nbsp;&lt;a href=&quot;http://readme.md/&quot; rel=&quot;noopener&quot;&gt;README.md&lt;/a&gt;… you can do that by typing&amp;nbsp;&lt;code&gt;rm README.md&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Now we can create the project, I ran&amp;nbsp;&lt;code&gt;now-cli project --name &quot;@jace/now-joke&quot; --description &quot;It&#39;s what it says on the lid&quot;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;It created the scaffolding, you’ll need to do a&amp;nbsp;&lt;code&gt;npm install&lt;/code&gt;&amp;nbsp;or&amp;nbsp;&lt;code&gt;npm i&lt;/code&gt;&amp;nbsp;to install the package.json dependencies&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;We can finally Start rendering something… run&amp;nbsp;&lt;code&gt;now-cli develop --open&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Edit the&amp;nbsp;&lt;code&gt;./src/x-1234-your-component/index.js&lt;/code&gt;&amp;nbsp;line 7 to say something, your browser should update&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Using a SP Widget on Ui16</title>
      <link href="https://jace.pro/blog/using-a-sp-widget-on-ui16/" />
      <updated>2020-03-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/using-a-sp-widget-on-ui16/</id>
      <content type="html">
				&lt;p&gt;A while ago&amp;nbsp;&lt;a href=&quot;https://medium.com/@pishchulin&quot; rel=&quot;noopener&quot;&gt;Andrew Pishchulin&lt;/a&gt;&amp;nbsp;shared a&amp;nbsp;&lt;a href=&quot;https://medium.com/@pishchulin/advanced-attachment-management-in-servicenow-f15246e7f785&quot; rel=&quot;noopener&quot;&gt;post on Medium&lt;/a&gt;&amp;nbsp;where he put a Service Portal widget on UI16. My mind was blown. How did he do it.&lt;/p&gt;&lt;p&gt;His post doesn’t go over the specifics but here’s what he said;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Service Portal widget can also be used in ServiceNow native UI, all you need to do is just to create a UI Macro/formatter which loads a service portal page with that widget&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The way to do this (again thanks to Andrew) is this;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create an empty Service Portal (I’ll name mine “widgetOnly”)&lt;/li&gt;&lt;li&gt;Create a Portal Page (I’ll name mine “pageForHelloWorld”)&lt;/li&gt;&lt;li&gt;Add your widget to the Portal Page&lt;/li&gt;&lt;li&gt;Create a UI Macro (I’ll name mine “spHelloWorld”) with this code, change height as needed&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jelly:core&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;glide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;iframe&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;widgetOnly?id=pageForHelloWorld&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;100%&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;scrolling&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;no&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;400px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;iframe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&quot;5&quot;&gt;&lt;li&gt;Create a UI Formatter with the formatter called “spHelloWorld.xml” and set the table you want.&lt;/li&gt;&lt;li&gt;Add the formatter on the form (same way you’d add a field, via form layout)&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;comments&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/using-a-sp-widget-on-ui16/#comments&quot; class=&quot;heading-anchor&quot;&gt;Comments&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/artemis15&quot; rel=&quot;noopener&quot;&gt;artemis15&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/170#issuecomment-624578049&quot; rel=&quot;noopener&quot;&gt;on May 6, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Instead to creating portal for this, you can alos use $&lt;a href=&quot;http://sp.do?id=pag&quot; rel=&quot;noopener&quot;&gt;sp.do?id=pag&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/170#issuecomment-624658706&quot; rel=&quot;noopener&quot;&gt;on May 6, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;That’s a great call out. Thanks&amp;nbsp;&lt;a href=&quot;https://github.com/artemis15&quot; rel=&quot;noopener&quot;&gt;@artemis15&lt;/a&gt;&amp;nbsp;.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/nsierraj&quot; rel=&quot;noopener&quot;&gt;nsierraj&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/170#issuecomment-627990515&quot; rel=&quot;noopener&quot;&gt;on May 13, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;And you can use “RP.getParameterValue(‘sys_id’);” to pass values to the widget to make it sensitive to the record in the form.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/meatsac&quot; rel=&quot;noopener&quot;&gt;meatsac&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/170#issuecomment-720107278&quot; rel=&quot;noopener&quot;&gt;on Nov 1, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This post suggests you can call the widget directly. I haven’t had success with this myself but would be interested to hear if this is indeed possible.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://snhackery.com/2019/04/10/portal-widgets-on-ui-pages/&quot; rel=&quot;noopener&quot;&gt;https://snhackery.com/2019/04/10/portal-widgets-on-ui-pages/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Knowledge 20 (K20) Turned Virtual</title>
      <link href="https://jace.pro/blog/knowledge-20-k20-turned-virtual/" />
      <updated>2020-03-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/knowledge-20-k20-turned-virtual/</id>
      <content type="html">
				&lt;h1 id=&quot;k20-has-gone-digital&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-20-k20-turned-virtual/#k20-has-gone-digital&quot; class=&quot;heading-anchor&quot;&gt;K20 has gone digital&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;ServiceNow just announced it has gone digital for this event. Below is the statement from&amp;nbsp;&lt;a href=&quot;https://knowledge.servicenow.com/faq.html#more_1&quot; rel=&quot;noopener&quot;&gt;https://knowledge.servicenow.com/faq.html#more_1&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Over the past few weeks, we have been closely monitoring the evolving COVID-19 pandemic. In order to protect the health and safety of our Knowledge 2020 attendees, partners, and community, we have made the decision to make Knowledge 2020 a digital community event that will launch on May 5 in place of the in-person event in Orlando, FL.&lt;/p&gt;&lt;p&gt;&lt;s&gt;As a Knowledge 2020 registrant, you will receive a full refund of your pass to the original form of payment. This will take 5-7 business days to complete and an email confirmation will be sent to you.&lt;/s&gt;&lt;/p&gt;&lt;p&gt;The Knowledge 2020 digital experience will showcase all the ways you can unlock productivity through modern digital workflows, highlight the latest customer and platform innovations, and inspire the ServiceNow community to continue to create great experiences for businesses.&lt;/p&gt;&lt;p&gt;In the coming days and weeks, we will provide details about the Knowledge 2020 digital experience. We are committed to creating a phenomenal digital experience that will engage, inspire, and connect you to the best practices from our customers around the world.&lt;/p&gt;&lt;p&gt;The global health crisis is creating new realities for all of us. Thank you for your patience as we evaluated this fluid situation and assessed the best way forward to bring the ServiceNow community together in a safe and healthy manner. We regret we won’t see you in Orlando this year, but we are excited to stay connected digitally to share and learn from each other. That’s always been the power of the ServiceNow community.&lt;/p&gt;&lt;p&gt;See you online!&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Which has a lot of details.&lt;/p&gt;&lt;h2 id=&quot;my-take-aways&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-20-k20-turned-virtual/#my-take-aways&quot; class=&quot;heading-anchor&quot;&gt;My take aways&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;It seems that ServiceNow has taken a page from Google’s book here. That’s fine. Great even. No reason to rethink some of these decisions.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Item&lt;/th&gt;&lt;th&gt;Google Cloud Next&amp;nbsp;&lt;a href=&quot;https://cloud.withgoogle.com/next/sf/faq&quot; rel=&quot;noopener&quot;&gt;FAQ&lt;/a&gt;&lt;/th&gt;&lt;th&gt;ServiceNow&amp;nbsp;&lt;a href=&quot;https://knowledge.servicenow.com/faq.html#hotel_1&quot; rel=&quot;noopener&quot;&gt;FAQ&lt;/a&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Price&lt;/td&gt;&lt;td&gt;Refunded, and waived&lt;/td&gt;&lt;td&gt;&lt;s&gt;Refunded&lt;/s&gt;&amp;nbsp;Rolled to K21&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hotel&lt;/td&gt;&lt;td&gt;Cancelled automatically&lt;/td&gt;&lt;td&gt;Cancelled automatically&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Keynotes&lt;/td&gt;&lt;td&gt;Still happening&lt;/td&gt;&lt;td&gt;Not addressed, but I imagine they will show this like they have previously&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sessions&lt;/td&gt;&lt;td&gt;Listed, not scheduled (Maybe they were scheduled, but I wasn’t watching then)&lt;/td&gt;&lt;td&gt;They were listed, not anymore, and not scheduled&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Attendance&lt;/td&gt;&lt;td&gt;Everyone can join for free&lt;/td&gt;&lt;td&gt;&lt;s&gt;Not addressed&lt;/s&gt;&amp;nbsp;Everyone can join for free&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Swag?&lt;/td&gt;&lt;td&gt;There will not be swag&lt;/td&gt;&lt;td&gt;Not addressed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Flight&lt;/td&gt;&lt;td&gt;You are on your own&lt;/td&gt;&lt;td&gt;&lt;s&gt;Not addressed&lt;/s&gt;&amp;nbsp;You are on your own&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;ul&gt;&lt;li&gt;Full refunds of your pass. If you booked a hotel through Knowledge 2020 website, the reservation will be cancelled.&lt;/li&gt;&lt;li&gt;A “digital experience” was mentioned three times in this short FAQ. It should engage, inspire, and connect individuals.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;what-can-we-expect-for-a-digital-experience&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-20-k20-turned-virtual/#what-can-we-expect-for-a-digital-experience&quot; class=&quot;heading-anchor&quot;&gt;What can we expect for a “digital experience”?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Here we get into what could be. If we look at other conferences that went digital, and ones that have always have been there seems to be some competing agendas.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Disseminating information. I assume will be done via Zoom Meetings or some other screensharing tool.&lt;/li&gt;&lt;li&gt;Connecting individuals. I assume this will be either not available, or some digital way, but in either case, it will be new and different. It will take getting used to.&lt;/li&gt;&lt;li&gt;Expo floor. I assume this will be either not available, or some digital way, but in either case, it will be new and different. It will take getting used to.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;how-can-we-capitalize-on-this-change&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-20-k20-turned-virtual/#how-can-we-capitalize-on-this-change&quot; class=&quot;heading-anchor&quot;&gt;How can we capitalize on this change?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Since everything will be digital, all streaming of ServiceNow stuff is nearly equal. If you’re a small partner, spinning up YouTube Live or Twitch, you are not much different than however ServiceNow official will handle it in my opinion. With that being said I expect to see a lot of steaming video coming up out of this.&lt;/p&gt;&lt;h1 id=&quot;changes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-20-k20-turned-virtual/#changes&quot; class=&quot;heading-anchor&quot;&gt;Changes&lt;/a&gt;&lt;/h1&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Date&lt;/th&gt;&lt;th&gt;Changed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2020-03-17&lt;/td&gt;&lt;td&gt;Passes are now stated to be rolled to K21 and not refunded unless asked.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2020-03-17&lt;/td&gt;&lt;td&gt;Digital event will be free.&amp;nbsp;&lt;a href=&quot;https://knowledge.servicenow.com/faq.html#reg_1&quot; rel=&quot;noopener&quot;&gt;https://knowledge.servicenow.com/faq.html#reg_1&lt;/a&gt; Will there be a cost for digital participation? We will not be charging for attending the Knowledge 2020 digital experience. Stay tuned for more information on how to register.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2020-03-17&lt;/td&gt;&lt;td&gt;Airfare will not be reimbursed.&amp;nbsp;&lt;a href=&quot;https://knowledge.servicenow.com/faq.html#speaker_1&quot; rel=&quot;noopener&quot;&gt;https://knowledge.servicenow.com/faq.html#speaker_1&lt;/a&gt; Will I receive reimbursement for airfare? Airfare and hotel is the sole responsibility of the individual and will not be reimbursed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2020-03-17&lt;/td&gt;&lt;td&gt;“Learn More” FAQ removed block of text regarding refunds.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Ok Orlando - Data Source Custom Load by Script</title>
      <link href="https://jace.pro/blog/ok-orlando-data-source-custom-load-by-script/" />
      <updated>2020-02-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/ok-orlando-data-source-custom-load-by-script/</id>
      <content type="html">
				&lt;p&gt;So this looks pretty neat, a way to simply load a set of data from script. This has been done previously by me with scheduled jobs and the like but now that isn’t necessary.&lt;/p&gt;&lt;p&gt;Lets look at the example provided on the&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-platform-administration/page/administer/import-sets/task/create-custom-type-data-source.html&quot; rel=&quot;noopener&quot;&gt;docs&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The data loader script has one input parameter, import_set_table, and the following methods:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Method&lt;/th&gt;&lt;th&gt;Details&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;addColumn&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Adds a string type column to the import set table.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;addJSONColumn&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Adds a JSON type column to the import set table.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;addXMLColumn&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Adds an XML type column to the import set table.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;insert&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Inserts a map (key = column name, value = column value) in the import set table.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;the-example-randomuserme&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ok-orlando-data-source-custom-load-by-script/#the-example-randomuserme&quot; class=&quot;heading-anchor&quot;&gt;The example&amp;nbsp;&lt;/a&gt;&lt;a href=&quot;http://randomuser.me&quot; rel=&quot;noopener&quot;&gt;randomuser.me&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;loadData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;import_set_table&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Add your code here to insert data to import_set_table&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; requestBody &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; restMessage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;sn_ws&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RESTMessageV2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setHttpMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;get&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setEndpoint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://randomuser.me/api/?results=100&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setRequestBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requestBody&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; error &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;haveError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getErrorCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorMsg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getErrorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; headerVal &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; headers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeaders&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; queryString &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getQueryString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; statusCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getStatusCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; responseBody &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; responseObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;responseBody&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//	gs.info(statusCode);&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//	gs.info(responseBody);&lt;/span&gt;
  responseObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; map &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;u_first&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;first&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;u_last&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;u_email&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;u_phone&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;phone
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    import_set_table&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;import_set_table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So this didn’t wrok right away, but it was only because the import set table has be exist before things can work it seems. Once that table was made it worked exactly like I thought it would.&lt;/p&gt;&lt;h2 id=&quot;comments&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ok-orlando-data-source-custom-load-by-script/#comments&quot; class=&quot;heading-anchor&quot;&gt;Comments&lt;/a&gt;&lt;/h2&gt;
 			</content>
    </entry><entry>
      <title>Ok Orlando - Automated Testing Framework changes</title>
      <link href="https://jace.pro/blog/ok-orlando-automated-testing-framework-changes/" />
      <updated>2020-02-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/ok-orlando-automated-testing-framework-changes/</id>
      <content type="html">
				&lt;h1 id=&quot;ok-orlando-a-series-of-features-worth-note&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ok-orlando-automated-testing-framework-changes/#ok-orlando-a-series-of-features-worth-note&quot; class=&quot;heading-anchor&quot;&gt;OK Orlando - A series of features worth note&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;In Orlando there’s a bunch of&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-release-notes/page/release-notes/summary/rn-summary-new-features.html&quot; rel=&quot;noopener&quot;&gt;Automated Test Framework(ATF) updates&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Lets go over them and see what we think;&lt;/p&gt;&lt;h2 id=&quot;copy-an-automated-test-suite&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ok-orlando-automated-testing-framework-changes/#copy-an-automated-test-suite&quot; class=&quot;heading-anchor&quot;&gt;Copy an automated test suite&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In the past copying a test suite kept the past scope.&lt;br&gt;Lets see how good this works.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If a suite spans multiple scopes, copying scopes doesn’t copy anything out of the current scope.&lt;/li&gt;&lt;li&gt;Copying a test suite isn’t available unless you’re in the suite’s scope.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;custom-ui-test-steps-misleading&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ok-orlando-automated-testing-framework-changes/#custom-ui-test-steps-misleading&quot; class=&quot;heading-anchor&quot;&gt;Custom UI test steps - misleading&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;So in the new section there’s a “Custom UI test steps” but it goes on to say;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Test workspaces using the Form category test steps. The Custom UI category steps don’t support available workspace.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;So it’s just a heads up, to test workspaces goto the form category, not custom ui.&lt;/p&gt;&lt;h2 id=&quot;list-and-related-list-steps&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ok-orlando-automated-testing-framework-changes/#list-and-related-list-steps&quot; class=&quot;heading-anchor&quot;&gt;List and related list steps&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Validate related list visibility - tested&lt;/li&gt;&lt;li&gt;Apply filter to list - tested&lt;/li&gt;&lt;li&gt;Validate record present in list - tested - no way to validate list is empty or test that&lt;/li&gt;&lt;li&gt;Validate ui actions in lists&lt;/li&gt;&lt;li&gt;Open a record in list&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;email&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ok-orlando-automated-testing-framework-changes/#email&quot; class=&quot;heading-anchor&quot;&gt;Email&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Validate outbound email&lt;/li&gt;&lt;li&gt;Generate inbound reply email&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;other&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ok-orlando-automated-testing-framework-changes/#other&quot; class=&quot;heading-anchor&quot;&gt;Other&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Generate Random String - only input is how long to make the input…&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Ok Orlando - CSV Line Parser</title>
      <link href="https://jace.pro/blog/ok-orlando-csv-line-parser/" />
      <updated>2020-02-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/ok-orlando-csv-line-parser/</id>
      <content type="html">
				&lt;p&gt;As part of my getting familiar with some of the new features of Orlando, I wanted to dive into the new CSVParser class.&lt;/p&gt;&lt;h2 id=&quot;why-might-i-use-this&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ok-orlando-csv-line-parser/#why-might-i-use-this&quot; class=&quot;heading-anchor&quot;&gt;Why might I use this?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;So in looking for use-case I found a community post by [Vinod]. He has a csv file that he needs to parse. Good enough for me. [Ankur Bawiskar] proposed a solution, but it’s using some Packages call, that is not supported in scopes. With that lets dig in.&lt;/p&gt;&lt;p&gt;I am using the&amp;nbsp;&lt;a href=&quot;https://catalog.data.gov/dataset/fy-2011-public-libraries-survey&quot; rel=&quot;noopener&quot;&gt;Library survey from 2011&lt;/a&gt;&amp;nbsp;data and I’m planning to write that to an import table, then to that could be used to update Locations.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Original solution&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sa &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideSysAttachment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; bytesContent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sa&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBytes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;incident&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bdd212d04fbf7340fc11fa218110c7d5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; strData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Packages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;java&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lang&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bytesContent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;strData&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lets try this with CSVParser.&lt;/p&gt;&lt;p&gt;Oofta. So Below is my “working” example. A few important notes;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;parseLineToObject&lt;/code&gt;&amp;nbsp;needs the array for the headers.&lt;/li&gt;&lt;li&gt;If your CSV is mixed with quotes and without, you’re going to have to correct that, like I did.&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// to object&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; attachment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideSysAttachment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; agr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; attachment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttachments&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;incident&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;552c48888c033300964f4932b03eb092&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;agr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;agr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;file_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; content &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; attachment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;agr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; contentb64 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; attachment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getContentBase64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;agr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;content.length: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// CSV Parser splits the data up&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; contentArr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; headers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;STABR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FSCSKEY&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FSCS_SEQ&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;LIBID&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;LIBNAME&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ADDRESS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;CITY&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZIP&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ZIP4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;CNTY&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;PHONE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;C_OUT_TY&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;C_MSA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SQ_FEET&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;F_SQ_FT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;L_NUM_BM&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;F_BKMOB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;HOURS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;F_HOURS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;WKS_OPEN&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;F_WKSOPN&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;YR_SUB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;STATSTRU&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;STATNAME&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;STATADDR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;LONGITUD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;LATITUDE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FIPSST&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FIPSCO&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;FIPSPLAC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;CNTYPOP&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;LOCALE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;CENTRACT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;CENBLOCK&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;CDCODE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MAT_CENT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MAT_TYPE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;CBSA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MICROF&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// with out this, the call fails;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// now if you csv is not formed consistentlt yhis still fails.... so im just going to remove ,&#39;s in quotes, then quotes.&lt;/span&gt;
  contentArr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// regex to remove commas from within `&quot;` parts e.g. a,b,&quot;test,test./#&amp;amp;&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; regex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&quot;([A-Z0-9&#92;s&#92;.#-&#92;/&amp;amp;]+),([A-Z0-9&#92;s&#92;.#-&#92;/&amp;amp;]+)&quot;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;gm&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; subst &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;$1$2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;regex&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subst&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// regex to remove comma from within &quot; at the end e.g. a,b,&quot;test,&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; regex2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&quot;([A-Z0-9&#92;s&#92;.#-&#92;/&amp;amp;]+),&quot;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;gm&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; subst2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;$1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;regex2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subst2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; delimiter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;,&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quoteCharacter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lineObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;sn_impex&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;CSVParser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parseLineToObject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;line&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; headers&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; delimiter&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; quoteCharacter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lineObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;STABR&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MN&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; lineObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;CITY&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MINNEAPOLIS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lineObj&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;  &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;/*do what you want here... like make a record or whatever*/&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here’s what the output looks like;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/tzI6NUT_X0-477.webp 477w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/tzI6NUT_X0-477.jpeg&quot; alt width=&quot;477&quot; height=&quot;798&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Source:&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-application-development/page/app-store/dev_portal/API_reference/CSVParserScoped/concept/CSVParserScopedAPI.html&quot; rel=&quot;noopener&quot;&gt;https://docs.servicenow.com/bundle/orlando-application-development/page/app-store/dev_portal/API_reference/CSVParserScoped/concept/CSVParserScopedAPI.html&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Ok Orlando - Studio Git Outside Files</title>
      <link href="https://jace.pro/blog/ok-orlando-studio-git-outside-files/" />
      <updated>2020-01-27T00:00:00Z</updated>
      <id>https://jace.pro/blog/ok-orlando-studio-git-outside-files/</id>
      <content type="html">
				&lt;h2 id=&quot;edit-source-control-integration-files-outside-of-studio&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/ok-orlando-studio-git-outside-files/#edit-source-control-integration-files-outside-of-studio&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-01-27-ok-orlando-studio-outside-files/#edit-source-control-integration-files-outside-of-studio&quot; rel=&quot;noopener&quot;&gt;Edit source control integration files outside of Studio&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;Edit application files linked to a source control integration using an editor other than Studio. To ensure that the application files remain usable, the instance validates and sanitizes application files edited by other editing applications. Application files that fail XML schema validation either abort the current source control operation or are skipped. The instance generates an upgrade log entry for each sanitization action taken.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-application-development/page/build/applications/concept/c_SourceControlIntegration.html&quot; rel=&quot;noopener&quot;&gt;Edit source control integration files outside of Studio&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This works great. You can see the file structure there. The now app path is defined by root file&amp;nbsp;&lt;code&gt;sn_source_control.properties&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;I edited an application file on Github. That does work. There is some sanitation process (which I don’t understand) allows for editing of application files out of ServiceNow.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/77XogeJ1Ky-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/77XogeJ1Ky-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;671&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Ok Orlando: Serivce Portal Conversation widget</title>
      <link href="https://jace.pro/blog/ok-orlando-serivce-portal-conversation-widget/" />
      <updated>2020-01-27T00:00:00Z</updated>
      <id>https://jace.pro/blog/ok-orlando-serivce-portal-conversation-widget/</id>
      <content type="html">
				&lt;p&gt;This didn’t make the release notes but the&amp;nbsp;enter&amp;nbsp;key used to do nothing. If you wanted to add line breaks to the comments to make a multi-line comment you had to customize the widget. Now you don’t have to.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/XtR5Aw4aFe-650.webp 650w, https://jace.pro/img/XtR5Aw4aFe-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/XtR5Aw4aFe-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;489&quot; srcset=&quot;https://jace.pro/img/XtR5Aw4aFe-650.jpeg 650w, https://jace.pro/img/XtR5Aw4aFe-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Backing Out an Update Set From a Batch</title>
      <link href="https://jace.pro/blog/backing-out-an-update-set-from-a-batch/" />
      <updated>2020-01-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/backing-out-an-update-set-from-a-batch/</id>
      <content type="html">
				&lt;p&gt;Author’s Note: I know backing out isn’t the right term but it’s how I think of it.&lt;/p&gt;&lt;h2 id=&quot;backing-out-update-sets-can-be-a-pain&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/backing-out-an-update-set-from-a-batch/#backing-out-update-sets-can-be-a-pain&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-01-14-backing-out-update-set-from-a-batch/#backing-out-update-sets-can-be-a-pain&quot; rel=&quot;noopener&quot;&gt;Backing out update sets can be a pain.&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Here’s the thing. Update Set Batches are&amp;nbsp;&lt;strong&gt;amazing&lt;/strong&gt;, until you have a problem.&lt;/p&gt;&lt;p&gt;One problem I’ve experienced with batching work in development is;&lt;br&gt;Handling errors on update set batches.&lt;br&gt;Sometimes this is due to a missing plugin or some other update set that needs to wait. How do you correct this? With help from @paige and @ajb I will answer this;&lt;/p&gt;&lt;p&gt;Quotes;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;… delete the previewed update sets (all of them, including parent). Remove it from the parent in the source instance and bring it all back over. - @paige&lt;/p&gt;&lt;p&gt;… un-parent it, or as Paige said - delete the whole thing - and re-parent in development - @ajb&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;When I’ve done the delete way in the past I’ve had issues and now reading through these comments I can guess why. You need to ensure you “… have to ensure you get ALL the update sets.” as @paige said. I suspect I didn’t get all the update sets.&lt;/p&gt;&lt;p&gt;Going forward now that I’ve had success doing this are these steps;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Delete the Target Instance Update Sets, &amp;amp; Batch Update set&lt;/li&gt;&lt;li&gt;Un-parent in source&lt;/li&gt;&lt;li&gt;Re-import&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Can issues still arise? Sure, keep this in mind;&lt;/p&gt;&lt;p&gt;So update sets can fail two ways in regards to batching;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;An update set completed can be pulled before it’s associated with a batch. If you want that to be included in the batch it needs to be removed from the target instance.&lt;/li&gt;&lt;li&gt;An update set was included but before applying it you want to exclude it. To do this, delete batch’s related update sets, then the parent(batch) update set. Change the source update set batch and re-import.&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Step Away From Emails</title>
      <link href="https://jace.pro/blog/step-away-from-emails/" />
      <updated>2020-01-09T00:00:00Z</updated>
      <id>https://jace.pro/blog/step-away-from-emails/</id>
      <content type="html">
				&lt;p&gt;I started making notes on this a long time ago. I’m going to update this as needed but this is what I have so far.&lt;/p&gt;&lt;p&gt;Email is an amazing system, however, it is also easy to lose so much work there. ServiceNow wants you to make work you do from email into structured data that can easily worked.&lt;/p&gt;&lt;p&gt;That’s great Jace, but where’s the steps. What do I do?&lt;/p&gt;&lt;h1 id=&quot;the-guide&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/step-away-from-emails/#the-guide&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-01-09-step-away-from-emails-guide/#the-guide&quot; rel=&quot;noopener&quot;&gt;The guide&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;This is all theory for me as I have not implemented this.&lt;/p&gt;&lt;h2 id=&quot;step-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/step-away-from-emails/#step-1&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-01-09-step-away-from-emails-guide/#step-1&quot; rel=&quot;noopener&quot;&gt;Step 1&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Identify what&amp;nbsp;&lt;strong&gt;is going to be allowed now&lt;/strong&gt;&amp;nbsp;to create work.&lt;/p&gt;&lt;p&gt;Go over you’re current Inbound Actions and make a list of inbound emails you intend to still process immediately, initially I’d guess that is just the “Update Approval Request” inbound action.&lt;/p&gt;&lt;p&gt;The rest of them, ensure they set “Contact Source” to email for inserts.&lt;/p&gt;&lt;h2 id=&quot;step-2&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/step-away-from-emails/#step-2&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-01-09-step-away-from-emails-guide/#step-2&quot; rel=&quot;noopener&quot;&gt;Step 2&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Identify what outbound Notifications can be disabled right now.&lt;br&gt;The less you email people, the less they have to respond to.&lt;br&gt;You have many notifications that are not actionable.&lt;br&gt;Anything that the user receiving the message is only informational should be disabled.&lt;/p&gt;&lt;p&gt;Disable any notification that is strictly informational.&lt;/p&gt;&lt;p&gt;Examples;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Item Requested&lt;/li&gt;&lt;li&gt;Incident Created&lt;/li&gt;&lt;li&gt;Something was approved&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;step-3&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/step-away-from-emails/#step-3&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-01-09-step-away-from-emails-guide/#step-3&quot; rel=&quot;noopener&quot;&gt;Step 3&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Now it will get hard.&lt;br&gt;Change processes on how people find work.&lt;br&gt;Instead of going to their mailbox, they will need to go to their assignments.&lt;/p&gt;&lt;p&gt;I’d recommend doing this all at once.&lt;/p&gt;&lt;h1 id=&quot;notes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/step-away-from-emails/#notes&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2020-01-09-step-away-from-emails-guide/#notes&quot; rel=&quot;noopener&quot;&gt;Notes&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;TL; DR Record Producers created specific to your most commonly reported incidents that gather the data needed to resolve those incidents (including optional data based on answers in the RP) can greatly reduce your TTR and cause overall greater customer satisfaction despite the bigger hurdle to incident submission.&lt;br&gt;careful pushing of folks to these Structured Record Producers can be handled in many ways, including closing incidents submitted improperly and pointing them to the new RP&lt;/p&gt;&lt;p&gt;Emails &amp;amp; SP:&lt;br&gt;Emails created entries cost more, introduce delay for most interactions, initial send is quicker for user to send, slower to help them in general case&lt;br&gt;Structured data and clear services via SP are a large difference - cuts down on back and forth, aids in automation, helps routing and fulfillment expectations, transparency and prioritization. Better expectations and up front data collection leads to happier users quickly.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Phased Approach is recommended Show incentive to go to no inbound email with Time to resolved Time to resolved is lessened by less categorizing, less back and forth to/from the customer.&lt;/p&gt;&lt;p&gt;Some organizations saw a 25%-75% better resolution time after disallowing email.&lt;/p&gt;&lt;p&gt;Ensure you offer specific services that handle most the calls to allow the faster resolution.&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Quick Guide: Orlando</title>
      <link href="https://jace.pro/blog/quick-guide-orlando/" />
      <updated>2020-01-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/quick-guide-orlando/</id>
      <content type="html">
				&lt;p&gt;Here’s my take of what’s new with Orlando. To me this seems like the release of “The Workspace”. Sure there are other updates but unless you subscribe to those specific SKUs, you won’t see meaningful updates for your customers. The improvements to me seem to be mostly on the workspaces.&lt;/p&gt;&lt;h2 id=&quot;deprecated-things&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/quick-guide-orlando/#deprecated-things&quot; class=&quot;heading-anchor&quot;&gt;Deprecated things&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Service Desk Call plugin now requires subscription (didn’t before)&lt;/li&gt;&lt;li&gt;Discovery - Help the help desk plugin no longer available&lt;/li&gt;&lt;li&gt;Enterprise Release Management plugin no longer available&lt;/li&gt;&lt;li&gt;Facilities Service Management plugin no longer available&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;updated-things&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/quick-guide-orlando/#updated-things&quot; class=&quot;heading-anchor&quot;&gt;Updated things&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Agent Workspace: CMDB&lt;/li&gt;&lt;li&gt;Agent Workspace: Form annotation supported&lt;/li&gt;&lt;li&gt;Agent Workspace: Field Styles not supported&lt;/li&gt;&lt;li&gt;Agent Workspace: Faster list loading by not showing count of all rows&lt;/li&gt;&lt;li&gt;Agent Workspace: Variable editor in Agent Workspace inline&lt;/li&gt;&lt;li&gt;ATF: Quick Start Tests for many things&lt;/li&gt;&lt;li&gt;ATF: Copy automated test suite, copies all nested tests&lt;/li&gt;&lt;li&gt;ATF: Emails can now be tested&lt;/li&gt;&lt;li&gt;ATF: Workspaces can now be tested&lt;/li&gt;&lt;li&gt;VTB: Compact cards, now more compact (thinner columns)&lt;/li&gt;&lt;li&gt;VTB: Can show attachment preview on board&lt;/li&gt;&lt;li&gt;Flow Designer: Service Catalog - Plugin now active by default&lt;/li&gt;&lt;li&gt;Virtual Agent: Loads of updates&lt;/li&gt;&lt;li&gt;Mobile Platform: Loads of updates&lt;/li&gt;&lt;li&gt;Customer Service Management: Loads of updates&lt;/li&gt;&lt;li&gt;Field Service Management: Loads of updates&lt;/li&gt;&lt;li&gt;Human Resources Service Delivery: Loads of updates&lt;/li&gt;&lt;li&gt;Project Portfolio Management: Loads of updates&lt;/li&gt;&lt;li&gt;Mid Servers require JRE 1.8.0_161 or greater&lt;/li&gt;&lt;li&gt;Mid Servers for discovery require Powershell 5.1 (was 3.0)&lt;/li&gt;&lt;li&gt;Mid Servers no longer need an admin account, just read/write to the /agent folder&lt;/li&gt;&lt;li&gt;MID Servers now support Microsoft JEA authentication in order to run basic Discovery.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;new-things&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/quick-guide-orlando/#new-things&quot; class=&quot;heading-anchor&quot;&gt;New things&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Now Components available for development see NDS&lt;/li&gt;&lt;li&gt;Studio: Edit source control files outside of ServiceNow&lt;/li&gt;&lt;li&gt;Studio: Can use Mid connect to source control&lt;/li&gt;&lt;li&gt;Studio: Set the GIT repository default branch&lt;/li&gt;&lt;li&gt;System Clone: Presever Update Sets - no longer need to export/import from target instance&lt;/li&gt;&lt;li&gt;Service Portal: Widget Diagnostics&lt;/li&gt;&lt;li&gt;Import and Export: REST (IntegrationHub) type data source&lt;/li&gt;&lt;li&gt;Import and Export: Custom (Load by Script) type data source&lt;/li&gt;&lt;li&gt;Import and Export: Robust Import Set Transformers&lt;/li&gt;&lt;li&gt;Import and Export: Custom (Parse by Script) format&lt;/li&gt;&lt;li&gt;Import and Export: CSV line parser&lt;/li&gt;&lt;li&gt;Import and Export: Scoped scriptable Import Set APIs&lt;/li&gt;&lt;li&gt;Investment Funding - This sounds new&lt;/li&gt;&lt;li&gt;Discovery: ServiceNow Certificate Inventory and Management application&lt;/li&gt;&lt;li&gt;Dynamic Translation - Translates stuff on the fly&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;further-reading&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/quick-guide-orlando/#further-reading&quot; class=&quot;heading-anchor&quot;&gt;Further Reading&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://andrew.alburydor.com/blog/2020/01/06/orlandofeatures/&quot; rel=&quot;noopener&quot;&gt;Andrew Albury’s blog post&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;comments&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/quick-guide-orlando/#comments&quot; class=&quot;heading-anchor&quot;&gt;Comments&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/macmorning&quot; rel=&quot;noopener&quot;&gt;macmorning&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/164#issuecomment-579846342&quot; rel=&quot;noopener&quot;&gt;on Jan 29, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Thanks Jace.&lt;br&gt;I can still see no way to create or edit the new UX components (like ribbons).&lt;br&gt;Frustrating&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/164#issuecomment-579848339&quot; rel=&quot;noopener&quot;&gt;on Jan 29, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I’ve heard that is coming out with General Availability. See&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-servicenow-platform/page/administer/workspace/concept/record-view.html#d1269810e56&quot; rel=&quot;noopener&quot;&gt;https://docs.servicenow.com/bundle/orlando-servicenow-platform/page/administer/workspace/concept/record-view.html#d1269810e56&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/macmorning&quot; rel=&quot;noopener&quot;&gt;macmorning&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/164#issuecomment-579865071&quot; rel=&quot;noopener&quot;&gt;on Jan 29, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You just warmed my heart. The documentation stays vague though, giving hints about “adding custom components” but not actually giving details about it.&lt;br&gt;This page reads “Register your Now component with Tectonic” =&amp;gt;&lt;br&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/orlando-servicenow-platform/page/administer/workspace/task/set-up-ui-action-render-custom-component.html&quot; rel=&quot;noopener&quot;&gt;https://docs.servicenow.com/bundle/orlando-servicenow-platform/page/administer/workspace/task/set-up-ui-action-render-custom-component.html&lt;/a&gt;&lt;br&gt;Mood shifted from frustrated to excited. Thanks&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/164#issuecomment-579902897&quot; rel=&quot;noopener&quot;&gt;on Jan 29, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I’m excited about it.&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Browser Extensions for ServiceNow</title>
      <link href="https://jace.pro/blog/browser-extensions-for-servicenow/" />
      <updated>2019-12-02T00:00:00Z</updated>
      <id>https://jace.pro/blog/browser-extensions-for-servicenow/</id>
      <content type="html">
				&lt;p&gt;This post is brought to you because of Kevin. Thanks Kevin!&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Just read your great code search blog post @jacebenson… you probably already know about this, but the an-Utils browser extension has an “install-less” code search feature in beta. - 🍹🍸Kev 🍸🍹 (@milligna) &lt;a href=&quot;https://twitter.com/milligna/status/1200668500597055489?ref_src=twsrc%5Etfw&quot;&gt;November 30, 2019&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Browser extensions are scary in my opinion when it comes to work. Some workplaces have rules (not really enforceable) where you are allowed to only download extensions used by hundreds of thousands of users.&lt;/p&gt;&lt;p&gt;There are&amp;nbsp;&lt;a href=&quot;https://www.kaspersky.com/blog/browser-extensions-security/20886/&quot; rel=&quot;noopener&quot;&gt;legitimate&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://www.digitaltrends.com/news/popular-browser-extensions-are-selling-your-data/&quot; rel=&quot;noopener&quot;&gt;reasons&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://www.washingtonpost.com/technology/2019/07/18/i-found-your-data-its-sale/&quot; rel=&quot;noopener&quot;&gt;for&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://www.howtogeek.com/188346/why-browser-extensions-can-be-dangerous-and-how-to-protect-yourself/&quot; rel=&quot;noopener&quot;&gt;this&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Now that I have that out of the way, let’s talk about the extensions for Firefox and Chrome to help work in ServiceNow.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Extension&lt;/th&gt;&lt;th&gt;Firefox&lt;/th&gt;&lt;th&gt;Chrome&lt;/th&gt;&lt;th&gt;Github&lt;/th&gt;&lt;th&gt;Author&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;SN Utils&lt;/td&gt;&lt;td&gt;Yes&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/servicenow-utils2/&quot; rel=&quot;noopener&quot;&gt;1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;a href=&quot;https://chrome.google.com/webstore/detail/sn-utils-tools-for-servic/jgaodbdddndbaijmcljdbglhpdhnjobg&quot; rel=&quot;noopener&quot;&gt;2&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;a href=&quot;https://github.com/arnoudkooi/ServiceNow-Utils&quot; rel=&quot;noopener&quot;&gt;3&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Arnoud Kooi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SN Toolbelt&lt;/td&gt;&lt;td&gt;Yes&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/snow-tool-belt&quot; rel=&quot;noopener&quot;&gt;4&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;a href=&quot;https://chrome.google.com/webstore/detail/servicenow-tool-belt/jflcifhpkilfaomlnikfaaccmpidkmln&quot; rel=&quot;noopener&quot;&gt;5&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;a href=&quot;https://github.com/macmorning/snowtools-webext&quot; rel=&quot;noopener&quot;&gt;6&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Mac Morning&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SwissNow&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;a href=&quot;https://chrome.google.com/webstore/detail/swissnow-servicenow-toolb/jneeammdkdmlfgidcacmjmbijdmkdbjm&quot; rel=&quot;noopener&quot;&gt;7&lt;/a&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Łukasz Krzaczkowski&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;features-were-comparing&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/browser-extensions-for-servicenow/#features-were-comparing&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-11-30-browser-extensions-review/#features-were-comparing&quot; rel=&quot;noopener&quot;&gt;Features we’re comparing&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;There extensions have a&amp;nbsp;&lt;strong&gt;lot&lt;/strong&gt;&amp;nbsp;of features so I’ll be comparing all of them I can find;&lt;/p&gt;&lt;p&gt;Legend;&lt;br&gt;✅ = Yes&lt;br&gt;❌ = No&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;SN Toolbelt&lt;/th&gt;&lt;th&gt;SN Utils&lt;/th&gt;&lt;th&gt;SwissNow&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Chrome&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FireFox&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Open Source&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tabs customizations&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Docs and API searches&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Node Switching&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Links to many instances&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;Configurable&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Export Settings&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Slash commands&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Edit scripts in VS Code&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Edit widgets in VS Code&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Show technical names&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Update set search&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Updates List&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Search tables&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;View Data&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Search User by Id&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Code Templates&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CTRL-S / CMD-S&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CTRL-V / CMD-V&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Compare Records&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;sn-utils&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/browser-extensions-for-servicenow/#sn-utils&quot; class=&quot;heading-anchor&quot;&gt;SN Utils&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Unfortunately I’ve never looked at this extension in depth until I started writing this post. With that being said, holy cow.&lt;/p&gt;&lt;p&gt;Arnoud, good job.&lt;/p&gt;&lt;p&gt;&lt;s&gt;Some of the things I don’t think should be in the extension but others, man I wish they were part of the platform.&lt;/s&gt;&lt;/p&gt;&lt;p&gt;I think the CTRL-S / CMD-S and CTRL-V / CMD-V should be something Servicenow Proper should add to the platform making them unneeded.&lt;/p&gt;&lt;p&gt;After comments added to this post it’s clear to see slash commands can add any search including docs/api stuff. So I changed that to Sort of as they need to be configured.&lt;/p&gt;&lt;h2 id=&quot;sn-tool-belt&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/browser-extensions-for-servicenow/#sn-tool-belt&quot; class=&quot;heading-anchor&quot;&gt;SN Tool belt&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I’ve been a fan of this repository for years now. It isn’t the biggest project but was the only one I found to be open source when I first looked.&lt;/p&gt;&lt;p&gt;With that being said, it’s all about giving you links to quickly jump around instances. I assume we all do that because I do that.&lt;/p&gt;&lt;h2 id=&quot;swissnow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/browser-extensions-for-servicenow/#swissnow&quot; class=&quot;heading-anchor&quot;&gt;SwissNow&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is the only other extension I could find was this one.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://servicenowgems.com/2017/09/11/swissnow-chrome-extension/&quot; rel=&quot;noopener&quot;&gt;https://servicenowgems.com/2017/09/11/swissnow-chrome-extension/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This one is also about jumping around instances and as such has some nice links around them including a very handy compare function, however, I can’t find the source. So I downloaded the&amp;nbsp;&lt;code&gt;.crx&lt;/code&gt;&amp;nbsp;file and unzipped it. Looked around at the code for any odd calls but I didn’t find any. So thats great.&lt;/p&gt;&lt;h1 id=&quot;change-log&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/browser-extensions-for-servicenow/#change-log&quot; class=&quot;heading-anchor&quot;&gt;Change Log&lt;/a&gt;&lt;/h1&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Date&lt;/th&gt;&lt;th&gt;Action&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2019-12-01&lt;/td&gt;&lt;td&gt;Changed SN Utils - Docs and API searches to yes (via&amp;nbsp;&lt;code&gt;/dev searchterm&lt;/code&gt;) was no.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-12-01&lt;/td&gt;&lt;td&gt;Changed SN Utils - Links to many instances to configurable was no.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;comments&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/browser-extensions-for-servicenow/#comments&quot; class=&quot;heading-anchor&quot;&gt;Comments&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/arnoudkooi&quot; rel=&quot;noopener&quot;&gt;arnoudkooi&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/145#issuecomment-560152659&quot; rel=&quot;noopener&quot;&gt;on Dec 1, 2019&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Great article Jace!&lt;/p&gt;&lt;p&gt;In SNU some of the features are accessible via slashcommands, like:&lt;br&gt;&lt;code&gt;/docs &amp;lt;query&amp;gt;&lt;/code&gt;&amp;nbsp;or&amp;nbsp;&lt;code&gt;/dev &amp;lt;query&amp;gt;&lt;/code&gt;&amp;nbsp;for docs and api search.&lt;br&gt;You (or I) can add a own search source like :&lt;br&gt;&lt;code&gt;jace;https://sn.jace.pro/docs/?q=$0 Search Jace&#39;s documentation&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Via&amp;nbsp;&lt;code&gt;/env acmedev&lt;/code&gt;&amp;nbsp;you can open current page in instance acmedev.&lt;br&gt;(I need to look at the nested function, creating a slashcommand&amp;nbsp;&lt;code&gt;/acmedev&lt;/code&gt;&amp;nbsp;doesn’t work now)&lt;/p&gt;&lt;p&gt;Most of the features are explained in the&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/app.do#!/event/knowledge19/CCW0844&quot; rel=&quot;noopener&quot;&gt;K19 labguide&lt;/a&gt;&amp;nbsp;or the newer in my&amp;nbsp;&lt;a href=&quot;https://twitter.com/sn_utils&quot; rel=&quot;noopener&quot;&gt;Tweets&lt;/a&gt;&lt;br&gt;And of course the&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/channel/UCtr-9_HAEAPmcDRQSyKNzxg&quot; rel=&quot;noopener&quot;&gt;videos&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;Regarding the risks of Extension, always good to be aware of this and make your own assessment. I’m keeping the permissions as tight as possible, resulting in rather low&amp;nbsp;&lt;a href=&quot;https://crxcavator.io/report/jgaodbdddndbaijmcljdbglhpdhnjobg/3.5.8.0/&quot; rel=&quot;noopener&quot;&gt;score&lt;/a&gt;&amp;nbsp;at&amp;nbsp;&lt;a href=&quot;https://crxcavator.io/&quot; rel=&quot;noopener&quot;&gt;crxcavator&lt;/a&gt;.&lt;br&gt;The permissions I do ask are explained in the&amp;nbsp;&lt;a href=&quot;https://github.com/arnoudkooi/ServiceNow-Utils/blob/master/PRIVACY.md&quot; rel=&quot;noopener&quot;&gt;Privacy Disclaimer&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/145#issuecomment-560163606&quot; rel=&quot;noopener&quot;&gt;on Dec 1, 2019&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Seems great, looking into this now makes me wish I did it more earlier.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/macmorning&quot; rel=&quot;noopener&quot;&gt;macmorning&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/145#issuecomment-579850847&quot; rel=&quot;noopener&quot;&gt;on Jan 29, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Hey Jace, thanks for the shout out.&lt;br&gt;As you can guess, with the Toolbelt extension I’m not trying to compete with Arnoud &amp;amp; team (tremendous work there!). It’s mostly a navigation helper. I’m adding small features when I get the idea and the time, limiting them to what is doable without script injection, external framework nor update sets because we should avoid doing this on our clients [live] environments.&lt;br&gt;Anyhow, the project is on github and sndevs are most welcome to contribute with ideas, defects, and pull requests.&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>List Collectors Are the Pits</title>
      <link href="https://jace.pro/blog/list-collectors-are-the-pits/" />
      <updated>2019-12-01T00:00:00Z</updated>
      <id>https://jace.pro/blog/list-collectors-are-the-pits/</id>
      <content type="html">
				&lt;p&gt;List collectors try so very hard to be helpful.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/Y2kCNUkz_r-650.webp 650w, https://jace.pro/img/Y2kCNUkz_r-960.webp 960w, https://jace.pro/img/Y2kCNUkz_r-1314.webp 1314w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/Y2kCNUkz_r-650.jpeg&quot; alt width=&quot;1314&quot; height=&quot;607&quot; srcset=&quot;https://jace.pro/img/Y2kCNUkz_r-650.jpeg 650w, https://jace.pro/img/Y2kCNUkz_r-960.jpeg 960w, https://jace.pro/img/Y2kCNUkz_r-1314.jpeg 1314w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;I have used them, but I don’t like them and here’s why;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Impossible to report on&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SP display of extra columns is… not helpful (see screenshot)&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/bt-S8r8kBq-650.webp 650w, https://jace.pro/img/bt-S8r8kBq-831.webp 831w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/bt-S8r8kBq-650.jpeg&quot; alt width=&quot;831&quot; height=&quot;169&quot; srcset=&quot;https://jace.pro/img/bt-S8r8kBq-650.jpeg 650w, https://jace.pro/img/bt-S8r8kBq-831.jpeg 831w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Display values are tied to the table, not the instance of the variable&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Generally complex logic is required to handle if you ever automate around them&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;They are moot with “add to cart”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;In SP it’s not clear what columns are when you add them via&amp;nbsp;&lt;code&gt;ref_ac_columns&lt;/code&gt;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0696884&quot; rel=&quot;noopener&quot;&gt;1&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;They were not made mobile friendly, so now they have a very different look/feel in SP&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0635149&quot; rel=&quot;noopener&quot;&gt;2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;s&gt;You have to have a table made for it’s purpose which is overkill&lt;/s&gt;&amp;nbsp;Covestic posted a workaround&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The list isn’t that long, but it merits a conversation about&amp;nbsp;&lt;strong&gt;what&lt;/strong&gt;&amp;nbsp;you’re trying to collect.&lt;/p&gt;&lt;p&gt;Before London, there was no good out of box alternative. With London we got the Multi-Row Variable Sets, and sure they also have their flaws, they are not as bad as List collectors.&lt;/p&gt;&lt;p&gt;In my past the most common use for List collectors is to grant access or to modify a number of things in different ways. The problem with that is, you can’t specify after you’ve selected all the things what you want to do&amp;nbsp;&lt;strong&gt;individually&lt;/strong&gt;. So in practice, it would be a User Access form. You pick the users you want to change access for, but then you are only allowed to add one role, or group.&lt;/p&gt;&lt;h2 id=&quot;covestics-workaround&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/list-collectors-are-the-pits/#covestics-workaround&quot; class=&quot;heading-anchor&quot;&gt;Covestic’s workaround&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is a great way to do the options without a whole table… but then someone still has to manage these options.&lt;a href=&quot;https://www.covestic.com/servicenow-tips-making-list-collectors-useful/&quot; rel=&quot;noopener&quot;&gt;3&lt;/a&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;On your catalog item, create a new multiple choice or select box variable (either will work, we are after the “Choices” related list here), give it a name and some question text and then submit.&lt;/li&gt;&lt;li&gt;Add any choices your variable needs.&lt;/li&gt;&lt;li&gt;Switch the variable type over to a list collector. You will notice that we cannot save until we give ServiceNow a table to reference so pick Question Choice [&lt;code&gt;question_choice&lt;/code&gt;]&lt;/li&gt;&lt;li&gt;Add a reference qualifier of “question=XXXX” where XXXX is the question’s sys_id.&lt;/li&gt;&lt;li&gt;(Optional) You may want to deactivate the “Question Choice Related List” client script or modify the if statement in the script to be if (newValue == “3” || newValue == “5” || newValue == “21”) to show the Question Choice related list on list collector variables.&lt;/li&gt;&lt;li&gt;You now have a list collector variable without having to create a whole new table.&lt;/li&gt;&lt;li&gt;(Optional) You can now think about adding variable attributes such as&amp;nbsp;&lt;code&gt;no_filter&lt;/code&gt;&amp;nbsp;or&amp;nbsp;&lt;code&gt;glide_list&lt;/code&gt;&amp;nbsp;to alter the variable’s appearance on the form.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;comments&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/list-collectors-are-the-pits/#comments&quot; class=&quot;heading-anchor&quot;&gt;Comments&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/CheriEmm&quot; rel=&quot;noopener&quot;&gt;CheriEmm&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/157#issuecomment-570314215&quot; rel=&quot;noopener&quot;&gt;on Jan 2, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Only admins can see question_choice so this is useless for your end users. You could create an ACL but would have to think on the reason question_choice is only available to admin, etc.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/157#issuecomment-570446546&quot; rel=&quot;noopener&quot;&gt;on Jan 2, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It is a workaround. It does make them a little better.&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Access Control Lists (ACLs) VS Query Business Rules (QBR)</title>
      <link href="https://jace.pro/blog/access-control-lists-acls-vs-query-business-rules-qbr/" />
      <updated>2019-12-01T00:00:00Z</updated>
      <id>https://jace.pro/blog/access-control-lists-acls-vs-query-business-rules-qbr/</id>
      <content type="html">
				&lt;p&gt;This is an issue as old as the “&lt;a href=&quot;https://docs.servicenow.com/bundle/geneva-servicenow-platform/page/administer/security/task/t_ActivateHighSecuritySettings.html&quot; rel=&quot;noopener&quot;&gt;HI security plugin&lt;/a&gt;”. Before that, I’m not sure how ServiceNow secured their tables as it was before my time.&lt;/p&gt;&lt;p&gt;I’ve been asked in the past to remove the message “n records removed by security…” and it&amp;nbsp;&lt;strong&gt;can&lt;/strong&gt;&amp;nbsp;be done, but&amp;nbsp;&lt;strong&gt;shouldn’t&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Here’s my take on it.&lt;/p&gt;&lt;p&gt;Access Control Lists (aka ACLs) are there for two reasons;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;maintainability&lt;/li&gt;&lt;li&gt;second is field level control&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You could replace every tables Access Control Lists with Query Business Rules. That is not the normal place security is generally configured.&lt;/p&gt;&lt;p&gt;Here’s some very insightful quotes from people I respect on the topic and links to the resources;&lt;/p&gt;&lt;p&gt;gflewis asked in 2011&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;What are the pros and cons of using an Access Control verses a Before Query Business Rule to block certain users from reading certain records? As far as I can tell, the functionality appears to be identical.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;CapaJC responded in 2011&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Before query is highly preferable if you can use one. It makes the database do the work by modify the query itself. With Contextual Security, your instance has to decide per record what a user can see after fetching them from the database.&lt;/p&gt;&lt;p&gt;With a before query rule, unavailable records are simply not there as far as the user is concerned. With Contextual Security they might get a list of 4 visible records, and the list might say 1 to 100 of 546 with a message at the bottom saying “96 records removed due to security constraints”.&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=11a68365db1cdbc01dcaf3231f961976&quot; rel=&quot;noopener&quot;&gt;1&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;More recently Tim W. wrote in 2018&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;ACLs Vs Query Business Rules:&amp;nbsp;&lt;strong&gt;ACLs&lt;/strong&gt;, but also sometimes query business rules; but usually for performance reasons more than security.&lt;a href=&quot;https://snprotips.com/blog/2018/9/18/broken-queries-and-query-rules&quot; rel=&quot;noopener&quot;&gt;2&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Further Reading;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;1 - [&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=11a68365db1cdbc01dcaf3231f961976&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=11a68365db1cdbc01dcaf3231f961976&lt;/a&gt;](Community Post from 2011)&lt;/li&gt;&lt;li&gt;2 - [&lt;a href=&quot;https://snprotips.com/blog/2018/9/18/broken-queries-and-query-rules&quot; rel=&quot;noopener&quot;&gt;https://snprotips.com/blog/2018/9/18/broken-queries-and-query-rules&lt;/a&gt;](Tim W’s Post from 2018)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenowguru.com/scripting/business-rules-scripting/controlling-record-access-before-query-business-rules/&quot; rel=&quot;noopener&quot;&gt;https://www.servicenowguru.com/scripting/business-rules-scripting/controlling-record-access-before-query-business-rules/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenowguru.com/showcase/servicenow-security-tips/&quot; rel=&quot;noopener&quot;&gt;https://www.servicenowguru.com/showcase/servicenow-security-tips/&lt;/a&gt;&amp;nbsp;&lt;code&gt;#4&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Comments;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/jgr1ffin&quot; rel=&quot;noopener&quot;&gt;@jgr1ffin&lt;/a&gt;&amp;nbsp;commented on Dec 3, 2019&lt;/p&gt;&lt;p&gt;One other thing worth nothing between the two is that QBR’s can’t perform top-level OR queries (^NQ).&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jacebenson&quot; rel=&quot;noopener&quot;&gt;jacebenson&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/146#issuecomment-561228947&quot; rel=&quot;noopener&quot;&gt;on Dec 3, 2019&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/jgr1ffin&quot; rel=&quot;noopener&quot;&gt;@jgr1ffin&lt;/a&gt;&amp;nbsp;that is something I did not know. Thank you for sharing!&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/mikebski&quot; rel=&quot;noopener&quot;&gt;mikebski&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/146#issuecomment-627403921&quot; rel=&quot;noopener&quot;&gt;on May 12, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Also if you have lots of records you are filtering with ACLs you end up with empty pages in the UI - For example, I have 500 records and the user only has perms to see 5. If I use ACL for view they see 500 records worth of pages in the UI - in this case a BR is a must.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jared-laethem&quot; rel=&quot;noopener&quot;&gt;jared-laethem&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;commented&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/jace.pro/issues/146#issuecomment-633167407&quot; rel=&quot;noopener&quot;&gt;on May 23, 2020&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Another difference is that ACL’s can specify scripted conditions that may not be able to be expressed as a query. Prior to the introduction of contextual security (sys_security_acl), security was specified on dictionary records.&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Custom Table Guide: What is this?!</title>
      <link href="https://jace.pro/blog/custom-table-guide-what-is-this/" />
      <updated>2019-11-27T00:00:00Z</updated>
      <id>https://jace.pro/blog/custom-table-guide-what-is-this/</id>
      <content type="html">
				&lt;p&gt;The other day I was looking at the&amp;nbsp;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=a2cad4fcdb9e7300760a71043996193e&amp;amp;type=course&quot; rel=&quot;noopener&quot;&gt;licensing training&lt;/a&gt;&amp;nbsp;and thinking about the&amp;nbsp;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/legal/custom-table-guide.pdf&quot; rel=&quot;noopener&quot;&gt;custom table guide&lt;/a&gt;.&lt;br&gt;To me it’s very bizarre why these are the tables selected so in this post I want to talk through each of them.&lt;br&gt;If you have any thoughts to the reasoning I’d love to have some back and forth on it. Here’s my thoughts so far.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Table&lt;/th&gt;&lt;th&gt;Label&lt;/th&gt;&lt;th&gt;Reason&lt;/th&gt;&lt;th&gt;Extensible OOTB&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;cmdb_*&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Configuration Items&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s in use&lt;/td&gt;&lt;td&gt;Many No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;cmn_location&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Location&lt;/td&gt;&lt;td&gt;See notes below&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;cmn_schedule_condition&lt;/code&gt;&amp;nbsp;&lt;strong&gt;new&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;dl_definition&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Data Lookup Definition&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s not used&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;dl_matcher&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Data Lookup Matcher Rules&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s in use&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;kb_knowlege&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Knowledge&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sc_cat_item_delivery_task&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Exection Plan Task []&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s in use&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;scheduled_data_import&lt;/code&gt;&amp;nbsp;&lt;strong&gt;new&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sf_state_flow&lt;/code&gt;&lt;/td&gt;&lt;td&gt;State Flow&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s not used&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sys_auth_profile&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Authentication Profile&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s not used&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sys_choice&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Choice&lt;/td&gt;&lt;td&gt;I cannot find a reason this is included&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sys_dictionary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Dictionary&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s in use&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sys_filter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Filter&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s in use&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sys_hub_action_type_base&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Action Type Base&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s in use&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sys_import_set_row&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Import Set Row&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s in use&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sys_portal_page&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Portal Page&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s not used&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sys_report_import_table_parent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Report Import Table&lt;/td&gt;&lt;td&gt;What does this table even do?&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sys_transform_map&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Transform Map&lt;/td&gt;&lt;td&gt;I cannot find a reason this is included&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sys_transform_script&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Transform Map Script&lt;/td&gt;&lt;td&gt;I cannot find a reason this is included&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sys_user_preference&lt;/code&gt;&lt;/td&gt;&lt;td&gt;User Preference&lt;/td&gt;&lt;td&gt;I cannot find a reason this is included&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sysauto&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Scheduled Job&lt;/td&gt;&lt;td&gt;Design Choice - has a Class field and it’s in use&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;syslog&lt;/code&gt;&lt;/td&gt;&lt;td&gt;System Log&lt;/td&gt;&lt;td&gt;I cannot find a reason this is included&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;my-thoughts-on-extending-tables&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#my-thoughts-on-extending-tables&quot; class=&quot;heading-anchor&quot;&gt;My thoughts on extending tables&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I can categorize my opinions about when and why to extend a table into three reasons.&lt;/p&gt;&lt;p&gt;Edit: At the time I wrote this, there were two things I had not considered. One. Extending tables is really complicated.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pros&lt;/th&gt;&lt;th&gt;Cons&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;You get all the fields from the parent&lt;/td&gt;&lt;td&gt;You get all the fields from the parent&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;You could add fields that may hit the limit of the technical length in SQL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Reporting on it can be difficult&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;If you need two records with the same unique value in the two tables, the system will not allow this&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;To extend some of these tables is uncharted waters and may not work well see&amp;nbsp;&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0538947&quot; rel=&quot;noopener&quot;&gt;sys_choice&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;usability&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#usability&quot; class=&quot;heading-anchor&quot;&gt;Usability&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Assuming you have a table in mind;&lt;br&gt;Does it make sense to have/modify a “type” or “class” field and have one the table?&lt;br&gt;Also, does the new type inherently change the the record that it is very different?&lt;/p&gt;&lt;p&gt;If yes to both, extend, if not make new.&lt;/p&gt;&lt;h3 id=&quot;scoped-access&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#scoped-access&quot; class=&quot;heading-anchor&quot;&gt;Scoped Access&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Sometimes you cannot create or read records that you might want to use in a scoped app, see&amp;nbsp;&lt;code&gt;sys_user_group&lt;/code&gt;.&lt;br&gt;In this case it may make sense to extend that table if you want to create/modify those records. This is a&lt;br&gt;technical reason, and I feel they likely should not be extended still but must be.&lt;/p&gt;&lt;h3 id=&quot;design-choice&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#design-choice&quot; class=&quot;heading-anchor&quot;&gt;Design Choice&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Generally, something will automatically extend a table, like Import Set Row.&lt;br&gt;Anytime you upload a new file as a data source that is extended.&lt;/p&gt;&lt;p&gt;This is done by adding a class field to indicate the class of record.&lt;br&gt;Some records with this only ever have one class, like&amp;nbsp;&lt;code&gt;sys_auth_profile&lt;/code&gt;.&lt;br&gt;Some have many like&amp;nbsp;&lt;code&gt;cmdb_ci&lt;/code&gt;,&amp;nbsp;&lt;code&gt;sys_user&lt;/code&gt;, and&amp;nbsp;&lt;code&gt;task&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&quot;configuration-items&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#configuration-items&quot; class=&quot;heading-anchor&quot;&gt;Configuration items&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Sometimes you gotta extend this to track things your work considers as a CI but ServiceNow has not. E.g. Rooms&lt;/p&gt;&lt;p&gt;In the example of Rooms, out-of-box there is a “Computer Room” CI class, but you may want to track conference rooms,&lt;br&gt;data closets, supply rooms, etc. In these cases in my opinion extending cmdb_ci makes sense.&lt;/p&gt;&lt;h2 id=&quot;knowledge&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#knowledge&quot; class=&quot;heading-anchor&quot;&gt;Knowledge&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Knowledge is an interesting table to have here.&lt;br&gt;On one hand you could argue some Knowledge articles should be typed/classd differently.&lt;br&gt;I believe Knowledge already has this.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;#ServiceNowDev #blog What is with the Custom Table Guide - Jace Benson 👨‍💻⚙️ (@jacebenson) &lt;a href=&quot;https://twitter.com/jacebenson/status/1199780073559203842?ref_src=twsrc%5Etfw&quot;&gt;November 27, 2019&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Further Reading:&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/newyork-servicenow-platform/page/product/knowledge-management/concept/knowledge-article-templates.html&quot; rel=&quot;noopener&quot;&gt;https://docs.servicenow.com/bundle/newyork-servicenow-platform/page/product/knowledge-management/concept/knowledge-article-templates.html&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;location&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#location&quot; class=&quot;heading-anchor&quot;&gt;Location&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Location is an odd table to me to have on this list.&lt;/p&gt;&lt;p&gt;I’m trying to imagine a situation where you might have different location types, e.g. Offices, Kiosks, and Datacenters&lt;/p&gt;&lt;p&gt;In these cases I can’t imagine a situation you would need this extended. Now scoped apps cannot write to some common tables,&lt;br&gt;if that is the reason this is here that may make sense. If a scoped app needs a place to write to that is like location, but different&lt;br&gt;extend it and write to the extension. If that is the case though then I’d expect the same for Group Memberships&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;With all that being said, on initial look of the table, it does not sport a&amp;nbsp;&lt;code&gt;sys_class_name&lt;/code&gt;&amp;nbsp;field.&lt;br&gt;However it also has “Extensible” as&amp;nbsp;&lt;code&gt;false&lt;/code&gt;.&lt;br&gt;If you change “Extensible” to&amp;nbsp;&lt;code&gt;true&lt;/code&gt;, then BOOM, now there’s a&amp;nbsp;&lt;code&gt;sys_class_name&lt;/code&gt;&amp;nbsp;field.&lt;br&gt;I’m still not sure I agree with the all the ideas of this.&lt;br&gt;That being said it seems like a&amp;nbsp;&lt;strong&gt;Design Descision&lt;/strong&gt;&amp;nbsp;now. - Jace 2019-12-16&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;import-set-row&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#import-set-row&quot; class=&quot;heading-anchor&quot;&gt;Import Set Row&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is extended for each data source you upload, so I feel this is understandable.&lt;/p&gt;&lt;h2 id=&quot;transform-map-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#transform-map-script&quot; class=&quot;heading-anchor&quot;&gt;Transform Map Script&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I don’t think this makes any sense. I can’t imagine why this would be extended.&lt;/p&gt;&lt;h2 id=&quot;transform-map&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#transform-map&quot; class=&quot;heading-anchor&quot;&gt;Transform Map&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I don’t think this makes any sense. I can’t imagine why this would be extended.&lt;/p&gt;&lt;h2 id=&quot;authentication-profile&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#authentication-profile&quot; class=&quot;heading-anchor&quot;&gt;Authentication Profile&lt;/a&gt;&lt;/h2&gt;&lt;h2 id=&quot;action-type-base&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#action-type-base&quot; class=&quot;heading-anchor&quot;&gt;Action Type Base&lt;/a&gt;&lt;/h2&gt;&lt;h2 id=&quot;report-import-table&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#report-import-table&quot; class=&quot;heading-anchor&quot;&gt;Report Import Table&lt;/a&gt;&lt;/h2&gt;&lt;h2 id=&quot;dictionary&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#dictionary&quot; class=&quot;heading-anchor&quot;&gt;Dictionary&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I don’t think this makes any sense. I can’t imagine why this would be extended.&lt;/p&gt;&lt;p&gt;It has a class and it’s used but unless I can make a new field type (I thought that wasn’t possible.)&lt;/p&gt;&lt;p&gt;I dont see why this is a thing unless that&amp;nbsp;&lt;strong&gt;is&lt;/strong&gt;&amp;nbsp;possible.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/nKxRIyx0MO-650.webp 650w, https://jace.pro/img/nKxRIyx0MO-960.webp 960w, https://jace.pro/img/nKxRIyx0MO-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/nKxRIyx0MO-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;783&quot; srcset=&quot;https://jace.pro/img/nKxRIyx0MO-650.jpeg 650w, https://jace.pro/img/nKxRIyx0MO-960.jpeg 960w, https://jace.pro/img/nKxRIyx0MO-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;choice&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#choice&quot; class=&quot;heading-anchor&quot;&gt;Choice&lt;/a&gt;&lt;/h2&gt;&lt;h2 id=&quot;system-log&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#system-log&quot; class=&quot;heading-anchor&quot;&gt;System Log&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I don’t think this makes any sense. I can’t imagine why this would be extended.&lt;/p&gt;&lt;h2 id=&quot;user-preference&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#user-preference&quot; class=&quot;heading-anchor&quot;&gt;User Preference&lt;/a&gt;&lt;/h2&gt;&lt;h2 id=&quot;filter&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#filter&quot; class=&quot;heading-anchor&quot;&gt;Filter&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I don’t think this makes any sense. I can’t imagine why this would be extended.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/vcIEHYSXRX-650.webp 650w, https://jace.pro/img/vcIEHYSXRX-960.webp 960w, https://jace.pro/img/vcIEHYSXRX-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/vcIEHYSXRX-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;240&quot; srcset=&quot;https://jace.pro/img/vcIEHYSXRX-650.jpeg 650w, https://jace.pro/img/vcIEHYSXRX-960.jpeg 960w, https://jace.pro/img/vcIEHYSXRX-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;portal-page&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#portal-page&quot; class=&quot;heading-anchor&quot;&gt;Portal Page&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I don’t think this makes any sense. I can’t imagine why this would be extended.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/8DNrRaZvPA-650.webp 650w, https://jace.pro/img/8DNrRaZvPA-960.webp 960w, https://jace.pro/img/8DNrRaZvPA-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/8DNrRaZvPA-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;215&quot; srcset=&quot;https://jace.pro/img/8DNrRaZvPA-650.jpeg 650w, https://jace.pro/img/8DNrRaZvPA-960.jpeg 960w, https://jace.pro/img/8DNrRaZvPA-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;scheduled-job&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#scheduled-job&quot; class=&quot;heading-anchor&quot;&gt;Scheduled Job&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;These are already extended to a number of types of jobs, but I’m not sure why I’d extend it.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Sysauto I extended all the time. Specifically&amp;nbsp;&lt;code&gt;sysauto_script&lt;/code&gt;&amp;nbsp;for many integrations.&lt;br&gt;Including the SCCM integration that is close to what we have today.&lt;br&gt;And I used that same design for the all the integrations for security vulnerability. - @killswitch&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;data-lookup-definition&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#data-lookup-definition&quot; class=&quot;heading-anchor&quot;&gt;Data Lookup Definition&lt;/a&gt;&lt;/h2&gt;&lt;h2 id=&quot;data-lookup-matcher-rules&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#data-lookup-matcher-rules&quot; class=&quot;heading-anchor&quot;&gt;Data Lookup Matcher Rules&lt;/a&gt;&lt;/h2&gt;&lt;h2 id=&quot;state-flow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#state-flow&quot; class=&quot;heading-anchor&quot;&gt;State Flow&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This has a class, but just one. I’m not sure why this would be extended.&lt;/p&gt;&lt;h2 id=&quot;execution-plan-task&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/custom-table-guide-what-is-this/#execution-plan-task&quot; class=&quot;heading-anchor&quot;&gt;Execution Plan Task&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;These are old as dirt. It has two classes today but beyond those I’m not sure why I’d extend it more.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Comparing Code Searchers</title>
      <link href="https://jace.pro/blog/comparing-code-searchers/" />
      <updated>2019-11-26T00:00:00Z</updated>
      <id>https://jace.pro/blog/comparing-code-searchers/</id>
      <content type="html">
				&lt;p&gt;I am biased. I like&amp;nbsp;&lt;em&gt;my&lt;/em&gt;&amp;nbsp;code search cause&amp;nbsp;&lt;em&gt;I know&lt;/em&gt;&amp;nbsp;how it works as&amp;nbsp;&lt;em&gt;I&lt;/em&gt;&amp;nbsp;wrote it. However, there are a few options for code searchers out there. But let me stat this first;&lt;/p&gt;&lt;p&gt;ServiceNow should have this OOB in their system not buried behind their Studio application.&lt;/p&gt;&lt;p&gt;Now that I’ve said my peace about it I’m going to compare all the code searcher’s I know about.&lt;/p&gt;&lt;h2 id=&quot;global-code-search-by-rick-marsha&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-code-searchers/#global-code-search-by-rick-marsha&quot; class=&quot;heading-anchor&quot;&gt;Global Code Search by Rick Marsha&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;A portable search utility that leverages the ‘sn_codesearch’ application (App Studio) for performing string searches across multiple tables and fields. Based on the out-of-box sample page ‘CodeSearchExampleUse’, but rather than only searching within custom application scopes, this page performs a system-wide search across all scopes, including GLOBAL.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Downloads as of 2019-11-25: 196&lt;/p&gt;&lt;p&gt;This includes 2 files;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;UI action that is available on sys_* forms&lt;/li&gt;&lt;li&gt;UI page that does the search using the&amp;nbsp;&lt;code&gt;/api/sn_codesearch/&lt;/code&gt;&amp;nbsp;apis&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Download:&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/share/contents/8451237_global_code_search?v=1.01&amp;amp;t=PRODUCT_DETAILS&quot; rel=&quot;noopener&quot;&gt;Share&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/-6RMpCC9OI-650.webp 650w, https://jace.pro/img/-6RMpCC9OI-960.webp 960w, https://jace.pro/img/-6RMpCC9OI-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/-6RMpCC9OI-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;462&quot; srcset=&quot;https://jace.pro/img/-6RMpCC9OI-650.jpeg 650w, https://jace.pro/img/-6RMpCC9OI-960.jpeg 960w, https://jace.pro/img/-6RMpCC9OI-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/9CO5XlqrWW-650.webp 650w, https://jace.pro/img/9CO5XlqrWW-960.webp 960w, https://jace.pro/img/9CO5XlqrWW-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/9CO5XlqrWW-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;444&quot; srcset=&quot;https://jace.pro/img/9CO5XlqrWW-650.jpeg 650w, https://jace.pro/img/9CO5XlqrWW-960.jpeg 960w, https://jace.pro/img/9CO5XlqrWW-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;This is a very pretty search that uses that&amp;nbsp;&lt;code&gt;/api/sn_codesearch/&lt;/code&gt;&amp;nbsp;apis. It is installed in the global application. This also adds a left hand navigation Menu called, “Code Search” with a links to;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Code Search&lt;/li&gt;&lt;li&gt;Search Groups&lt;/li&gt;&lt;li&gt;REST API Explorer&lt;/li&gt;&lt;li&gt;Scripted REST API&lt;/li&gt;&lt;li&gt;Properties&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;ms-codesearch-by-sebastian-reinmann&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-code-searchers/#ms-codesearch-by-sebastian-reinmann&quot; class=&quot;heading-anchor&quot;&gt;MS CodeSearch by Sebastian Reinmann&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;This is a Code Search application based on the sn_codesearch REST API and provides a quick and easy way to lookup code in the entirety ServiceNow instance.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Downloads as of 2019-11-25: 188&lt;/p&gt;&lt;p&gt;This include 3 files;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Script Include, “MS_CodeSearch”, which has functions to add tables to the codesearch&lt;/li&gt;&lt;li&gt;UI Page, “MS_CodeSearch” which appears to only use&amp;nbsp;&lt;code&gt;/api/sn_codesearch/&lt;/code&gt;&amp;nbsp;apis&lt;/li&gt;&lt;li&gt;UI Script prism.js for syntax highlighting&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Download:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/share/contents/4888545_ms_codesearch?v=0.1&amp;amp;t=PRODUCT_DETAILS&quot; rel=&quot;noopener&quot;&gt;Share&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/TechAdvis0r/NowDevelopment&quot; rel=&quot;noopener&quot;&gt;Git&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/qzBwGQloxK-650.webp 650w, https://jace.pro/img/qzBwGQloxK-960.webp 960w, https://jace.pro/img/qzBwGQloxK-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/qzBwGQloxK-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;392&quot; srcset=&quot;https://jace.pro/img/qzBwGQloxK-650.jpeg 650w, https://jace.pro/img/qzBwGQloxK-960.jpeg 960w, https://jace.pro/img/qzBwGQloxK-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;This is in a scoped app so it can be removed entirely, has a nice UI. A satisfying progress bar, collapsible search results, and syntax highlighted results.&lt;/p&gt;&lt;h2 id=&quot;fetchcode-by-brent-llewellyn&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-code-searchers/#fetchcode-by-brent-llewellyn&quot; class=&quot;heading-anchor&quot;&gt;FetchCode by Brent Llewellyn&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;FetchCode is a handy utility for finding mysterious updaters, logging, wonkiness, and any other code snippets you could need to find throughout your instance. Just provide the terms to search for and FetchCode searches all script, xml, html, condition, calculation, system properties and default values as well as specific fields added in the config for the terms supplied in the dashboard.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Downloads as of 2019-11-25: 113&lt;/p&gt;&lt;p&gt;This includes 321 Updates, on Share it lists these;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;6 Business Rules&lt;/li&gt;&lt;li&gt;3 Client Scripts&lt;/li&gt;&lt;li&gt;9 Data transformers&lt;/li&gt;&lt;li&gt;11 Key Definitions&lt;/li&gt;&lt;li&gt;1 Magic Key&lt;/li&gt;&lt;li&gt;1 Processor&lt;/li&gt;&lt;li&gt;3 Script Includes&lt;/li&gt;&lt;li&gt;2 Scripted Rest APIs&lt;/li&gt;&lt;li&gt;3 UI Actions&lt;/li&gt;&lt;li&gt;3 UI Pages&lt;/li&gt;&lt;li&gt;8 UI Scripts&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Download:&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/share/contents/1176688_fetchcode_an_instance_code_search_utility?v=1.03&amp;amp;t=PRODUCT_DETAILS&quot; rel=&quot;noopener&quot;&gt;Share&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/Ryfen_SwQH-650.webp 650w, https://jace.pro/img/Ryfen_SwQH-960.webp 960w, https://jace.pro/img/Ryfen_SwQH-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/Ryfen_SwQH-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;637&quot; srcset=&quot;https://jace.pro/img/Ryfen_SwQH-650.jpeg 650w, https://jace.pro/img/Ryfen_SwQH-960.jpeg 960w, https://jace.pro/img/Ryfen_SwQH-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/k3_o60MPaM-650.webp 650w, https://jace.pro/img/k3_o60MPaM-960.webp 960w, https://jace.pro/img/k3_o60MPaM-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/k3_o60MPaM-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;605&quot; srcset=&quot;https://jace.pro/img/k3_o60MPaM-650.jpeg 650w, https://jace.pro/img/k3_o60MPaM-960.jpeg 960w, https://jace.pro/img/k3_o60MPaM-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;This has a unique look and feel. It is installed in global and has a number of custom tables but without the&amp;nbsp;&lt;code&gt;u_&lt;/code&gt;&amp;nbsp;prefix which forces me to raise my left eyebrow. If they are mucking with tables like that I have to wonder what else they are doing.&lt;/p&gt;&lt;h2 id=&quot;code-tools-by-jace-benson&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-code-searchers/#code-tools-by-jace-benson&quot; class=&quot;heading-anchor&quot;&gt;Code Tools by Jace Benson&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;This is a scoped application for Service-now to allow easier searching all code sources.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This includes 8 files;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;4 business rules&lt;/li&gt;&lt;li&gt;1 script include&lt;/li&gt;&lt;li&gt;1 service portal widget&lt;/li&gt;&lt;li&gt;1 service portal (&lt;code&gt;/code&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;1 scripted rest api&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This does the standard search api, but then also does a lookup on the workflow activity to update results for workflow activities that are only active and marking old ones “Inactive”&lt;/p&gt;&lt;p&gt;This also has an opt-in feature to tell you about bad code.&lt;/p&gt;&lt;p&gt;Download:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/share/contents/7596230_code_share_for_sp?v=2.4&amp;amp;t=PRODUCT_DETAILS&quot; rel=&quot;noopener&quot;&gt;Share&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/jacebenson/servicenow-code.git&quot; rel=&quot;noopener&quot;&gt;Git&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Downloads as of 2019-11-25: 115&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/x9m-hs86z3-650.webp 650w, https://jace.pro/img/x9m-hs86z3-960.webp 960w, https://jace.pro/img/x9m-hs86z3-1244.webp 1244w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/x9m-hs86z3-650.jpeg&quot; alt width=&quot;1244&quot; height=&quot;500&quot; srcset=&quot;https://jace.pro/img/x9m-hs86z3-650.jpeg 650w, https://jace.pro/img/x9m-hs86z3-960.jpeg 960w, https://jace.pro/img/x9m-hs86z3-1244.jpeg 1244w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/UAyX1SSkn4-650.webp 650w, https://jace.pro/img/UAyX1SSkn4-960.webp 960w, https://jace.pro/img/UAyX1SSkn4-1230.webp 1230w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/UAyX1SSkn4-650.jpeg&quot; alt width=&quot;1230&quot; height=&quot;360&quot; srcset=&quot;https://jace.pro/img/UAyX1SSkn4-650.jpeg 650w, https://jace.pro/img/UAyX1SSkn4-960.jpeg 960w, https://jace.pro/img/UAyX1SSkn4-1230.jpeg 1230w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;developer-search-by-garrett-griffin&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-code-searchers/#developer-search-by-garrett-griffin&quot; class=&quot;heading-anchor&quot;&gt;Developer Search by Garrett Griffin&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;Introducing Developer Search 2.0, the comprehensive utility to search every script field in the system for that troublesome piece of code.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This includes 6 files;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;2 Application Module Links&lt;/li&gt;&lt;li&gt;1 script include&lt;/li&gt;&lt;li&gt;2 UI Pages&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I love the short url for this,&amp;nbsp;&lt;code&gt;/ds.do&lt;/code&gt;&lt;/p&gt;&lt;p&gt;I also love that you can share the link to the results.&lt;/p&gt;&lt;p&gt;It searches custom tables and fields normally which is great. The UI is a little difficult to read but is very functional.&lt;/p&gt;&lt;p&gt;It also features a “Deep Search” which appears to search other fields not traditionally scripting fields.&lt;/p&gt;&lt;p&gt;One thing it does really well is find Workflow Activity results.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/k_ChG1Ydmv-650.webp 650w, https://jace.pro/img/k_ChG1Ydmv-960.webp 960w, https://jace.pro/img/k_ChG1Ydmv-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/k_ChG1Ydmv-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;564&quot; srcset=&quot;https://jace.pro/img/k_ChG1Ydmv-650.jpeg 650w, https://jace.pro/img/k_ChG1Ydmv-960.jpeg 960w, https://jace.pro/img/k_ChG1Ydmv-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Download:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/share/contents/9326002_developer_search?t=PRODUCT_DETAILS&quot; rel=&quot;noopener&quot;&gt;Share&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Downloads as of 2019-11-25: 47&lt;/p&gt;&lt;h2 id=&quot;studio-search-by-servicenow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-code-searchers/#studio-search-by-servicenow&quot; class=&quot;heading-anchor&quot;&gt;Studio Search by ServiceNow&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;Studio allows application developers to search within application files for matching record values.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Source:&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/newyork-application-development/page/build/applications/task/t_SearchWithinApplicationFiles.html&quot; rel=&quot;noopener&quot;&gt;https://docs.servicenow.com/bundle/newyork-application-development/page/build/applications/task/t_SearchWithinApplicationFiles.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Downloads as of 2019-11-25: ♾️&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/a0WdBws4XF-650.webp 650w, https://jace.pro/img/a0WdBws4XF-960.webp 960w, https://jace.pro/img/a0WdBws4XF-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/a0WdBws4XF-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;315&quot; srcset=&quot;https://jace.pro/img/a0WdBws4XF-650.jpeg 650w, https://jace.pro/img/a0WdBws4XF-960.jpeg 960w, https://jace.pro/img/a0WdBws4XF-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/EtOJ6-2JDD-650.webp 650w, https://jace.pro/img/EtOJ6-2JDD-960.webp 960w, https://jace.pro/img/EtOJ6-2JDD-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/EtOJ6-2JDD-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;488&quot; srcset=&quot;https://jace.pro/img/EtOJ6-2JDD-650.jpeg 650w, https://jace.pro/img/EtOJ6-2JDD-960.jpeg 960w, https://jace.pro/img/EtOJ6-2JDD-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;summary&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-code-searchers/#summary&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-11-25-comparing-code-searches/#summary&quot; rel=&quot;noopener&quot;&gt;Summary&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Global Code Search&lt;/th&gt;&lt;th&gt;MS CodeSearch&lt;/th&gt;&lt;th&gt;FetchCode&lt;/th&gt;&lt;th&gt;Code Tools&lt;/th&gt;&lt;th&gt;Developer Search&lt;/th&gt;&lt;th&gt;Studio Search&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Installed OOB&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Scoped App&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;UI16 navigator links&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;UI Action to open Search&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Install-able from Git&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Advanced Query function&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Code Analysis&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Searches extra tables&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Looks up Active WF activities&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;🚫&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tables used&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;With all this being said, I’d love to combine my efforts into a project with any of the maintainers of the code here.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Setting Variables in a MRVS from an outside variable</title>
      <link href="https://jace.pro/blog/setting-variables-in-a-mrvs-from-an-outside-variable/" />
      <updated>2019-11-20T00:00:00Z</updated>
      <id>https://jace.pro/blog/setting-variables-in-a-mrvs-from-an-outside-variable/</id>
      <content type="html">
				&lt;p&gt;A while ago&amp;nbsp;&lt;a href=&quot;https://jace.pro/post/2019-09-06-mvrs-dependent-variables/&quot; rel=&quot;noopener&quot;&gt;I wrote about&lt;/a&gt;&amp;nbsp;using Dependent variables in a Multi Row Variable Set (MRVS). In there something always bothered me. The whole bit about how you can not access the variables outside of the MRVS.&lt;/p&gt;&lt;p&gt;Today a former colleague of mine asked me, “How do you get a value from the main form variable onto the MRVS field?”&lt;/p&gt;&lt;p&gt;I wanted to help, so I talked through the options available that I have not tested. In his case he was trying to use a “date” variable on the main form, and then allow many things to default to that date and allow that date to be different if need be.&lt;/p&gt;&lt;p&gt;The options as I saw them were these (none of these work);&lt;/p&gt;&lt;ul&gt;&lt;li&gt;In the default value of the variable, try&amp;nbsp;&lt;code&gt;javascript: current.variables.main_date&lt;/code&gt;&lt;/li&gt;&lt;li&gt;In the MRVS, add an onChange Client Script for the first variable to read the&amp;nbsp;&lt;code&gt;main_date&lt;/code&gt;&amp;nbsp;variable and set the&amp;nbsp;&lt;code&gt;server_date&lt;/code&gt;&amp;nbsp;variable.&lt;/li&gt;&lt;li&gt;(Didn’t try this), on the main form, add an onChange Client Script for the&amp;nbsp;&lt;code&gt;main_date&lt;/code&gt;&amp;nbsp;variable to pre-build a number of rows in the MRVS.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;After talking about these options it was really clear that there should be another way. I found one. Here it is, it is not as elegant as I’d like.&lt;/p&gt;&lt;p&gt;This uses user preferences to solve this issue. On change of the main form’s variable, set the preference. On the MRVS set the default value based on that preference. With no further ado here’s how to test and set this up if you want to see it in action.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Install the&amp;nbsp;&lt;code&gt;ATF&lt;/code&gt;&amp;nbsp;scoped application (to give you a form with a MRVS and other variables). We’ll be using the MRVS and the&amp;nbsp;&lt;code&gt;Date&lt;/code&gt;&amp;nbsp;variable.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the Test Item, look at the related variable set. Update the “Question” variable’s default value to this script;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//default value on variable in MRVS&lt;/span&gt;
&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; currentUser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; currentUser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getPreference&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;customform.date&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Now we can’t set a preference in a client script, but we need to. So we’ll need to create a script include that’s client callable. Here’s mine.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//script include&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; CatalogMVRSHelper &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Class&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token class-name&quot;&gt;CatalogMVRSHelper&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extendsObject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;global&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AbstractAjaxProcessor&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;awesomeFunction&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; inputObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_obj&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; currentUser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
    currentUser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;savePreference&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;customform.date&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;inputObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; returnObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;server&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; inputObj
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;returnObj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;CatalogMVRSHelper&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;After that’s created we can set the preference with a client script. Here’s that code.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;control&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isLoading&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isLoading &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; newValue &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//js in client script on form&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//if variable changes &lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ga &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideAjax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;x_8821_atf.CatalogMVRSHelper&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  ga&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;awesomeFunction&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  ga&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_obj&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string-property property&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;newValue&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  ga&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getXML&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; responseDocument &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;responseXML&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; answer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; responseDocument&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;answer&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; serverObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;answer&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//console.log(serverObj);&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;So now that those parts are happening here’s what’s occurring;&lt;/p&gt;&lt;p&gt;When your user sets the “Date” variable, you are creating or updating that user’s&amp;nbsp;&lt;code&gt;sys_user_preference&lt;/code&gt;. Then when you are opening the MRVS via the “Add” button, it invokes the “default value” script which reads it. Really it’s pretty simple once you boil it down.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Validating links on your KB</title>
      <link href="https://jace.pro/blog/validating-links-on-your-kb/" />
      <updated>2019-11-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/validating-links-on-your-kb/</id>
      <content type="html">
				&lt;p&gt;The other day, “Jon” on slack asked;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Hi everyone 🙂 We have a ton of external links in content items. How can I regularly check those links to make sure they are active?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Got me thinking, I should share this, cause someone might find it useful.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Jace: You’d need to do the following steps;&lt;br&gt;1 Gather the outbound links&lt;br&gt;2 Make a http request to the endpoint to ensure it returns whatever is valid (is a 301 okay, that’s a redirect?)&lt;br&gt;3 Once you get the response, do something when you have an issue.&lt;br&gt;To do 1, you could GlideRecord over the KB records and use regex to extract the links.&lt;br&gt;You’ll probably want to make an object where the link name is the property, and store the KB article as an array so if multiple articles use the same link you don’t need to test repeatedly.&lt;br&gt;You’re output will look like&#92;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;https://google.com&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;KB1234&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;KB1235&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;https://ddg.gg&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;KB43232&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;KB4355&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then if the links are PUBLIC, you could just use a scripted rest message and if response is not 200 do something,&amp;nbsp;[&lt;a href=&quot;https://jace.pro/post/2019-09-14-recordless-rest-is-great/%5C&quot; rel=&quot;noopener&quot;&gt;https://jace.pro/post/2019-09-14-recordless-rest-is-great/&#92;&lt;/a&gt;](&lt;a href=&quot;https://jace.pro/post/2019-09-14-recordless-rest-is-great/%5C&quot; rel=&quot;noopener&quot;&gt;https://jace.pro/post/2019-09-14-recordless-rest-is-great/&#92;&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;However if the links require auth or vpn access, you’ll have to account for that.&lt;/p&gt;&lt;p&gt;I’d assume code would be something like;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; link &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; links&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;doRestCall&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doRestCall&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; restMessage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;sn_ws&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RESTMessageV2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setHttpMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;post&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setEndpoint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setRequestBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getStatusCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;not getting a 200 response&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This could easily be adapted to a business rule or scheduled job to verify sites are available. One thing that would be interesting would be having this process check if the site is on the&amp;nbsp;&lt;a href=&quot;https://archive.org/web/web.php&quot; rel=&quot;noopener&quot;&gt;Wayback machine&lt;/a&gt;, if it is rewrite the link, if it is not, request it there and rewrite it to there.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Making a custom probe and sensor</title>
      <link href="https://jace.pro/blog/making-a-custom-probe-and-sensor/" />
      <updated>2019-11-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/making-a-custom-probe-and-sensor/</id>
      <content type="html">
				&lt;p&gt;The other day I was trying to create a custom probe/sensor for a probe for our linux machines.&lt;/p&gt;&lt;p&gt;The only example I could find was to read a text file and make a ci based on that. That was not what I wanted.&lt;/p&gt;&lt;p&gt;I was specifically asking a program to tell me about its facts and I wanted to relate those details to the currently identified CI.&lt;/p&gt;&lt;p&gt;I couldnt remember how to do this;&lt;/p&gt;&lt;p&gt;Thankfully Rob G. pointed me in the right direction.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Created Probe to run the command&amp;nbsp;&lt;code&gt;sudo `which factor` -pj&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Created Sensor to respond to the probe&lt;/li&gt;&lt;li&gt;Opened the Classifiers, and added the Probe to the Linux one&lt;/li&gt;&lt;li&gt;Created a Test Discovery schedule so I could test the Probe &amp;amp; Sensor&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/l6ooEkvJIr-650.webp 650w, https://jace.pro/img/l6ooEkvJIr-960.webp 960w, https://jace.pro/img/l6ooEkvJIr-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/l6ooEkvJIr-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;692&quot; srcset=&quot;https://jace.pro/img/l6ooEkvJIr-650.jpeg 650w, https://jace.pro/img/l6ooEkvJIr-960.jpeg 960w, https://jace.pro/img/l6ooEkvJIr-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/EziEuWZIT5-650.webp 650w, https://jace.pro/img/EziEuWZIT5-960.webp 960w, https://jace.pro/img/EziEuWZIT5-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/EziEuWZIT5-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;597&quot; srcset=&quot;https://jace.pro/img/EziEuWZIT5-650.jpeg 650w, https://jace.pro/img/EziEuWZIT5-960.jpeg 960w, https://jace.pro/img/EziEuWZIT5-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Notes;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;result.output&lt;/code&gt;&amp;nbsp;is going to be string output as its what’s on the shell that is returned. If it’s an object, you gotta parse it.&lt;/li&gt;&lt;li&gt;&lt;code&gt;var serverGR = this.getCmdbRecord();&lt;/code&gt;&amp;nbsp;is the way I used to get the currently identified CI.&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title> Comparing VS Code Extensions</title>
      <link href="https://jace.pro/blog/comparing-vs-code-extensions/" />
      <updated>2019-11-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/comparing-vs-code-extensions/</id>
      <content type="html">
				&lt;p&gt;This post is about the state of code syncing tools for the VS Code tool.&lt;/p&gt;&lt;p&gt;Recently&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/blog.do?p=/post/vscode/&quot; rel=&quot;noopener&quot;&gt;Andrew announced the new VS Code extension&lt;/a&gt;. I knew something was going to be released eventually because at K19 on the CreatorCon keynote they briefly showed the creation of web components being built locally. To do that you need something locally.&lt;/p&gt;&lt;p&gt;With all that out of the way I want to show what is currently out there, and compare features.&lt;/p&gt;&lt;p&gt;Also it’s worth noting once ServiceNow seems to release something most generally community versions of them stop getting updated because, why would the community contribute when ServiceNow is maintaining it.&lt;/p&gt;&lt;p&gt;I’m going to compare the following file syncr’s&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Installer&lt;/th&gt;&lt;th&gt;Source&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Sal Costa’s Servicenow Sync&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=anerrantprogrammer.servicenow-sync&quot; rel=&quot;noopener&quot;&gt;VS Code Installer&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/alcosta/vsc-servicenow-sync&quot; rel=&quot;noopener&quot;&gt;Source&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IntegrateNate’s S.N.I.C.H.&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=integrateNate.snich&quot; rel=&quot;noopener&quot;&gt;VS Code Installer&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/RaynorUE/snich&quot; rel=&quot;noopener&quot;&gt;Source&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ServiceNow® Extension for VS Code&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ServiceNow.now-vscode&quot; rel=&quot;noopener&quot;&gt;VS Code Installer&lt;/a&gt;&lt;/td&gt;&lt;td&gt;NA&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;I’m not going to look at these as they either haven’t been updated or require software I’m not going to stand up. That is to say I respect the work done on these and these may have helped others make their tools, so to all of you who wrote these, good job. I do follow your work.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/dynamicdan/sn-filesync&quot; rel=&quot;noopener&quot;&gt;DynamicDan’s Filesync&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/cern-snow/codesync&quot; rel=&quot;noopener&quot;&gt;cern-snow’s Codesync&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/theconnectiv/now-sync&quot; rel=&quot;noopener&quot;&gt;theconnectiv’s Now-sync&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/0x111/sn-edit.com&quot; rel=&quot;noopener&quot;&gt;0x111’s sn-edit.com Sync&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/thtliife/servicenow-sync&quot; rel=&quot;noopener&quot;&gt;tftliife’s Atom Servicenow Sync&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/salcosta/servicenow-sync&quot; rel=&quot;noopener&quot;&gt;Sal Costa’s Sublime Servicenow Sync&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/ReedOwens/UXsyncNow&quot; rel=&quot;noopener&quot;&gt;ReedOwens’ UXsyncNow&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;dynamicdans-filesync&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-vs-code-extensions/#dynamicdans-filesync&quot; class=&quot;heading-anchor&quot;&gt;DynamicDan’s Filesync&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Many years ago I worked at Fruition Partners and was aware of the Filesync project near the time of my departure. I never used it while there but did try it out after Dynamic Dan started maintaining it. Originally written by&amp;nbsp;&lt;a href=&quot;https://github.com/johncaruso&quot; rel=&quot;noopener&quot;&gt;John Caruso&lt;/a&gt;&amp;nbsp;here on&amp;nbsp;&lt;a href=&quot;https://github.com/fruition-partners/filesync&quot; rel=&quot;noopener&quot;&gt;github.com/fruition-partners/filesync&lt;/a&gt;, then&amp;nbsp;&lt;a href=&quot;https://github.com/dynamicdan/sn-filesync&quot; rel=&quot;noopener&quot;&gt;forked and maintained by Dynamic Dan&lt;/a&gt;. This is great, it has a lot of room for configuration and wasn’t tied to any editor. Since Dynamic Dan’s fork has existed it’s been forked 54 times, and stared 66 times.&lt;/p&gt;&lt;p&gt;This tool is not dependent on any text editor like the rest but I believe this was and still is a source of inspiration for all of these tools. Because this tool has no required editor, it in my opinion is going to be more available to more systems and users likes.&lt;/p&gt;&lt;p&gt;This was originally written before scopes, so you literally had to set up what tables and columns you wanted and this will fetch the files and update the values in ServiceNow in your current scope and update set.&lt;/p&gt;&lt;h2 id=&quot;sal-costas-servicenow-sync&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-vs-code-extensions/#sal-costas-servicenow-sync&quot; class=&quot;heading-anchor&quot;&gt;Sal Costa’s Servicenow Sync&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I’m pretty partial to Sal’s work as it to me has always been of very high quality. As such I tried this out. This reminded me very much of when I had used DynamicDan’s fork. It is more intuitive, but that is because the commands are all available in command palette. This extension has these features;&lt;/p&gt;&lt;p&gt;The good;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;No pre-configured tables to start with, you have to specify what you want&lt;/li&gt;&lt;li&gt;Pre-configured fields for tables are set up once you add a table&lt;/li&gt;&lt;li&gt;Can download records regardless of scope/application&lt;/li&gt;&lt;li&gt;Link to open the file in the browser&lt;/li&gt;&lt;li&gt;Compare file to server&lt;/li&gt;&lt;li&gt;Can set your scope&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The bad;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;No pre-configured tables to start with, you have to specify what you want&lt;/li&gt;&lt;li&gt;No Intellisense&lt;/li&gt;&lt;li&gt;No way to download all files from a scope&lt;/li&gt;&lt;li&gt;No way to set your update set (No api made available)&lt;/li&gt;&lt;li&gt;Works in your current Scope/Update set that is associated to user&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-vs-code-extensions/&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;integratenates-snich&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-vs-code-extensions/#integratenates-snich&quot; class=&quot;heading-anchor&quot;&gt;IntegrateNate’s S.N.I.C.H.&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Nate’s extension had something many people wanted, Intellisense. Somehow Nate has the hookup to get this and it is great. This like Sal’s has a simple to understand way to configure tables and fields. This extension has these features;&lt;/p&gt;&lt;p&gt;The good;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Pre-configured (also customizable) to download many system files and fields&lt;/li&gt;&lt;li&gt;A way to download records regardless of scope/application&lt;/li&gt;&lt;li&gt;Compare file to server&lt;/li&gt;&lt;li&gt;Intellisense&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The bad;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;No link to the file on server&lt;/li&gt;&lt;li&gt;No way to set your scope&lt;/li&gt;&lt;li&gt;No way to set your update set (No api made available)&lt;/li&gt;&lt;li&gt;Works in your current Scope/Update set that is associated to user&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-vs-code-extensions/&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;servicenowr-extension-for-vs-code&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-vs-code-extensions/#servicenowr-extension-for-vs-code&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow® Extension for VS Code&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Enter ServiceNow® Extension for VS Code extension. I think they have a great place to start here. Lots of idea’s from Sal, Nate’s and DynamicDan’s projects.&lt;/p&gt;&lt;p&gt;The good;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Pre-configured (&lt;em&gt;not customizable&lt;/em&gt;) to download many system files and fields&lt;/li&gt;&lt;li&gt;Compare file to server&lt;/li&gt;&lt;li&gt;Intellisense&lt;/li&gt;&lt;li&gt;Run highlighted code in or out of scope&lt;/li&gt;&lt;li&gt;Link to open file in browser (sometimes)&lt;/li&gt;&lt;li&gt;Can set your update set (Must be a new undocumented api)&lt;/li&gt;&lt;li&gt;Can set your scope&lt;/li&gt;&lt;li&gt;Works with Scoped applications&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The bad;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;s&gt;Table configurations not modifiable&lt;/s&gt;&lt;/li&gt;&lt;li&gt;Table configurations do not allow you to modify pre-configured tables e.g. UI Pages, Business Rules&lt;/li&gt;&lt;li&gt;&lt;s&gt;Only works for Scoped Applications&lt;/s&gt;&lt;/li&gt;&lt;li&gt;Can work with global records if you know the plugin that includes the record in question&lt;/li&gt;&lt;li&gt;Has interesting way to configure initially (shown in video)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-vs-code-extensions/&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h1 id=&quot;summary&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/comparing-vs-code-extensions/#summary&quot; class=&quot;heading-anchor&quot;&gt;Summary&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Lets look at it in a table format&lt;/p&gt;&lt;p&gt;Legend;&lt;br&gt;✅ = Yes&lt;br&gt;❌ = No&lt;br&gt;😕 = Sort of&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;Servicenow Sync&lt;/th&gt;&lt;th&gt;S.N.I.C.H.&lt;/th&gt;&lt;th&gt;ServiceNow Official&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Updates ServiceNow from VS Code&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Can create records from VS Code&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Works with proxy&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sets your scope&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sets your update set&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Opens file in the instance&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;😕❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Executes code on server&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Compares file to server&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pre-configured Setup&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Customizable Setup&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;😕&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Has Intellisense&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Works with Global&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Works with Scopes&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Allows Basic Auth&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Allows OAuth&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Open Source&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Changelog;&#92;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Date&lt;/th&gt;&lt;th&gt;Notes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2019-11-18&lt;/td&gt;&lt;td&gt;Changed “ServiceNow Official” Customizable Setup from No, to Sort of&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-18&lt;/td&gt;&lt;td&gt;Changed “ServiceNow Official” Works with Global from No, to No and Sort of&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-18&lt;/td&gt;&lt;td&gt;Changed “ServiceNow Official” The bad to be more clear that table configurations are possible but only if not already configured&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-18&lt;/td&gt;&lt;td&gt;Changed “ServiceNow Official” The good to include “Works with scoped application”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-18&lt;/td&gt;&lt;td&gt;Added “ServiceNow Official” The bad to include “Authentication issues”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-21&lt;/td&gt;&lt;td&gt;Added “Can create records from VS Code”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-21&lt;/td&gt;&lt;td&gt;Added “Allows Basic Auth”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-21&lt;/td&gt;&lt;td&gt;Added “Allows OAuth”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-21&lt;/td&gt;&lt;td&gt;Added “Can execute code on server”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-21&lt;/td&gt;&lt;td&gt;Changed “ServiceNow Official” video to show all features and how to set it up.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-21&lt;/td&gt;&lt;td&gt;Changed “ServiceNow Official” Can open file in the instance as I just had that wrong.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-21&lt;/td&gt;&lt;td&gt;Changed “ServiceNow Official” Works with Global to No because although global files can be retrieved in scope, it’s not simple to do and will be in scope if you change it.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2019-11-27&lt;/td&gt;&lt;td&gt;Changed “ServiceNow Official” Opens files in instance to Sort of No because some things pull down with a&amp;nbsp;&lt;code&gt;.now&lt;/code&gt;&amp;nbsp;and those open in the instance&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Service Portal is going the way of the mammoth</title>
      <link href="https://jace.pro/blog/service-portal-is-going-the-way-of-the-mammoth/" />
      <updated>2019-10-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-is-going-the-way-of-the-mammoth/</id>
      <content type="html">
				&lt;p&gt;That’s my prediction. Service Portal will no longer get updates by the Orlando release. It will be like Workflow, Execution plans, Homepages, and the Content Management System. It will still&amp;nbsp;&lt;em&gt;work&lt;/em&gt;&amp;nbsp;but will not get future development.&lt;/p&gt;&lt;p&gt;I know it’s only been out since&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/helsinki-release-notes/page/release-notes/servicenow-platform/r_ServicePortalRN.html&quot; rel=&quot;noopener&quot;&gt;Helsinki&lt;/a&gt; and that means since April 2016 which is ~4 years. But after you look at these findings, you’ll agree.&lt;/p&gt;&lt;h2 id=&quot;why-bring-it-up&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-is-going-the-way-of-the-mammoth/#why-bring-it-up&quot; class=&quot;heading-anchor&quot;&gt;Why bring it up?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Well, I don’t like to work on something that isn’t going to get support. Things that do not get active development generally are left behind.&lt;/p&gt;&lt;p&gt;They are hard to maintain because any&amp;nbsp;&lt;em&gt;new&lt;/em&gt;&amp;nbsp;features need to be built by the customers using them. Want to see some active examples?&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;New Feature&lt;/th&gt;&lt;th&gt;New Feature last notable update&lt;/th&gt;&lt;th&gt;Old Feature&lt;/th&gt;&lt;th&gt;Old Feature last notable update&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Dashboards&lt;/td&gt;&lt;td&gt;New York: Multiple Breakdowns&lt;/td&gt;&lt;td&gt;Home pages&lt;/td&gt;&lt;td&gt;Homepage layouts (Summer &#39;08)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Flow Designer&lt;/td&gt;&lt;td&gt;New York: Multiple Updates&lt;/td&gt;&lt;td&gt;Workflow&lt;/td&gt;&lt;td&gt;Created Workflow (Summer &#39;08)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Service Portal&lt;/td&gt;&lt;td&gt;New York: Agent Chat&lt;/td&gt;&lt;td&gt;CMS&lt;/td&gt;&lt;td&gt;Created CMS (Summer &#39;09)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Would ServiceNow keep development efforts on Service Portal and the New Design System? Unlikely.&lt;/p&gt;&lt;p&gt;In the past they haven not ever announced they would od this kind of dual development. According to&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=6246e75cdb9d3b0422e0fb2439961965&quot; rel=&quot;noopener&quot;&gt;this talk&lt;/a&gt;&amp;nbsp;all out of box forms will use these components that are part of this.&lt;/p&gt;&lt;h2 id=&quot;what-is-the-new-design-system&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-is-going-the-way-of-the-mammoth/#what-is-the-new-design-system&quot; class=&quot;heading-anchor&quot;&gt;What is the New Design System?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Before we dive into what this is, lets talk about&amp;nbsp;&lt;strong&gt;why&lt;/strong&gt;&amp;nbsp;it’s needed.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Keeping ServiceNow tied to Angular 1.5.3 is not maintainable.&lt;/li&gt;&lt;li&gt;Any new functionality developed needs to be custom developed by someone to use in SN.&lt;/li&gt;&lt;li&gt;No ability to use new tech in the old system.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;So, now that we know why it’s needed, lets talk about the new design system.&lt;/p&gt;&lt;p&gt;At it’s core everything is on a “Canvas”. When you customize the canvas, it appears ServiceNow is calling that an “Experience” and Pre-defined experiences are called “Workspaces” which we’ve seen since Madrid (See Agent Workspace).&lt;/p&gt;&lt;p&gt;So to repeat;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Canvas: Base building block for new design system. I’d compare this to a UI Page.&lt;/li&gt;&lt;li&gt;Experience: A name for a customized Canvas.&lt;/li&gt;&lt;li&gt;Workspace: A Experience with navigation and general UI components.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/J_3zreqyiy-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/J_3zreqyiy-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;358&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/CvBhO_SJNR-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/CvBhO_SJNR-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;361&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;how-is-the-design-system-built&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-is-going-the-way-of-the-mammoth/#how-is-the-design-system-built&quot; class=&quot;heading-anchor&quot;&gt;How is the design System built?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow has not made that clear, but they did say it’s all built on Jelly, then said, “Just Kidding”. I am not sure.&lt;/p&gt;&lt;p&gt;The&amp;nbsp;&lt;strong&gt;ServiceNow UI Framework&lt;/strong&gt;&amp;nbsp;is a custom Javascript framework built using web components. On top of that framework is the metadata layer.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components&quot; rel=&quot;noopener&quot;&gt;Based on web components stardard: custom elements + shadow DOM&lt;/a&gt;&amp;nbsp;is what this is based on&lt;/li&gt;&lt;li&gt;Write testable, re-usable effects that respond to actions&lt;/li&gt;&lt;li&gt;Shared effects: all your platform API calls, no more messy spaghetti code&amp;nbsp;These are custom to SN&lt;/li&gt;&lt;li&gt;Everything is a component, and that’s great&lt;/li&gt;&lt;li&gt;One target stack with customization and composition built into core.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There are two kinds of components;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Experience Components - These are a UI and effects to connect to the platform API&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/ZeaisXBoA3-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/ZeaisXBoA3-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;355&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Base Components - UI only building blocks&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/oRilpzzxJ2-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/oRilpzzxJ2-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;344&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/n0QLkhDVPP-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/n0QLkhDVPP-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;306&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;How does it work together?&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/L_wlKnrtxF-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/L_wlKnrtxF-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;350&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;what-will-this-look-like&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-is-going-the-way-of-the-mammoth/#what-will-this-look-like&quot; class=&quot;heading-anchor&quot;&gt;What will this look like&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In the video they actually create a widget using web components for ServiceNow. Below is a screenshot, but also here is a link to the talk. This part starts @25:57.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/zE-nHbawGc-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/zE-nHbawGc-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;353&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;sources&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-is-going-the-way-of-the-mammoth/#sources&quot; class=&quot;heading-anchor&quot;&gt;Sources&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=6246e75cdb9d3b0422e0fb2439961965&quot; rel=&quot;noopener&quot;&gt;CreatorCon2019 - CCB0702&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://knowledge.servicenow.com/video-library/day-3-spotlight-creatorcon-full.html&quot; rel=&quot;noopener&quot;&gt;Day 3 Keynote, @51:44&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Going Fast in ServiceNow</title>
      <link href="https://jace.pro/blog/going-fast-in-servicenow/" />
      <updated>2019-10-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/going-fast-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;Robert Fedoruk has been killing it with his content, and one of theses posts needs to be retold because it is, just that good.&lt;/p&gt;&lt;p&gt;Source:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=UvwA4_9ajX8&quot; rel=&quot;noopener&quot;&gt;Youtube&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Tired of only the pros knowing how work fast in #ServiceNow. In &amp;lt; 5 minutes, learn to pinpoint stuff most relevant to you, and bookmark it for later. - Rob (@rfedoruk) &lt;a href=&quot;https://twitter.com/rfedoruk/status/1179140873352876033?ref_src=twsrc%5Etfw&quot;&gt;October 1, 2019&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I feel like this should be searchable and isn’t today. So I am making a post to share that content.&lt;/p&gt;&lt;p&gt;There’s a few things people should know to going fast. All the shortcuts, and accessing your stuff.&lt;/p&gt;&lt;h1 id=&quot;list-management&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/going-fast-in-servicenow/#list-management&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-10-06-faster-with-servicenow/#list-management&quot; rel=&quot;noopener&quot;&gt;List Management&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;right-click&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/going-fast-in-servicenow/#right-click&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-10-06-faster-with-servicenow/#right-click&quot; rel=&quot;noopener&quot;&gt;Right-click&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Be bold and use your middle finger, to right-click on everything. This gives your access to the following actions;&lt;br&gt;filter out&lt;/p&gt;&lt;ul&gt;&lt;li&gt;show matching&lt;/li&gt;&lt;li&gt;show before&lt;/li&gt;&lt;li&gt;show after&lt;/li&gt;&lt;li&gt;build a report&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;use-the-monacle-to-search-columns&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/going-fast-in-servicenow/#use-the-monacle-to-search-columns&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-10-06-faster-with-servicenow/#use-the-monacle-to-search-columns&quot; rel=&quot;noopener&quot;&gt;Use the monacle to search columns&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This will load a textbox below each column, they work with text like so;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;text&lt;/code&gt;&amp;nbsp;defaults to starts with&lt;/li&gt;&lt;li&gt;&lt;code&gt;=text&lt;/code&gt;&amp;nbsp;is the exact match (case insensitive)&lt;/li&gt;&lt;li&gt;&lt;code&gt;*text&lt;/code&gt;&amp;nbsp;is the text contains&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;jump-around-with-breadcrumbs&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/going-fast-in-servicenow/#jump-around-with-breadcrumbs&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-10-06-faster-with-servicenow/#jump-around-with-breadcrumbs&quot; rel=&quot;noopener&quot;&gt;Jump around with breadcrumbs&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You can change your filter fast by smashing the different parts of the breadcrumbs.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;smash the chevron to remove the next specific filter&lt;/li&gt;&lt;li&gt;smash the part of the filter to remove all the parts right of it&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;editing-data-in-a-list&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/going-fast-in-servicenow/#editing-data-in-a-list&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-10-06-faster-with-servicenow/#editing-data-in-a-list&quot; rel=&quot;noopener&quot;&gt;Editing data in a list&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You don’t have to go into each record to change the data.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;CTRL&lt;/code&gt;&amp;nbsp;+ smash and then double smash a cell to edit all selected rows for that column&lt;/li&gt;&lt;li&gt;&lt;code&gt;SHIFT&lt;/code&gt;&amp;nbsp;+&amp;nbsp;&lt;code&gt;↑&lt;/code&gt;&amp;nbsp;/&amp;nbsp;&lt;code&gt;↓&lt;/code&gt;, then double smash a selected cell to edit all selected rows&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;control-the-data-you-see-with-the-cog&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/going-fast-in-servicenow/#control-the-data-you-see-with-the-cog&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-10-06-faster-with-servicenow/#control-the-data-you-see-with-the-cog&quot; rel=&quot;noopener&quot;&gt;Control the data you see with the cog&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;smash the cog to decide what columns you will see&lt;/li&gt;&lt;li&gt;experiment with this as you can always reset&lt;/li&gt;&lt;/ul&gt;&lt;h1 id=&quot;accessing-your-stuff-fast&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/going-fast-in-servicenow/#accessing-your-stuff-fast&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-10-06-faster-with-servicenow/#accessing-your-stuff-fast&quot; rel=&quot;noopener&quot;&gt;Accessing your stuff fast&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;Drag a condition onto the left hand menu to add it to your favorites&lt;/li&gt;&lt;li&gt;Ham sandwich menu has a create favorite option too that does the same from&amp;nbsp;&lt;strong&gt;list&lt;/strong&gt;&amp;nbsp;and&amp;nbsp;&lt;strong&gt;record&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Stars in the left hand menu appear if you hover, that will also add them to your favorites&lt;/li&gt;&lt;li&gt;On the left hand menu in the star menu at the bottom is a pencil to edit all your favorites and their order&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Automation with Failover Tasks</title>
      <link href="https://jace.pro/blog/automation-with-failover-tasks/" />
      <updated>2019-10-05T00:00:00Z</updated>
      <id>https://jace.pro/blog/automation-with-failover-tasks/</id>
      <content type="html">
				&lt;p&gt;So I’ve built many automation tasks that didn’t account for what to do during an error or an expected output.&lt;/p&gt;&lt;p&gt;Do you know who has to work on that stuff? Likely, it’s you. That’s a fine way to go if that’s the intention.&lt;/p&gt;&lt;p&gt;I never intended for that to happen. I was working with a stakeholder on some automation and he wanted to keep a task in place. It didn’t matter to me at the time. One day automation stopped working. It was only then I was happy it had a built-in failover process.&lt;/p&gt;&lt;p&gt;There are many ways to make integrations. Follow one of these two patterns pictured above if you like the idea of a failover task.&lt;/p&gt;&lt;p&gt;This is great because you don’t do any of the automation on the workflow. You leave the task in place. Add some identifier or key to make it simple to find. Then make a business rule to call the outside system and have that system update the task. Or have the outside system find the tasks to run against and update the task. I’ve used the &lt;code&gt;correlation_id&lt;/code&gt; field in the past as the key field and defined it as part of the workflow. Ensure that the other system closes the task with appropriate messages. If it encounters an issue, have it make a work note.&lt;/p&gt;&lt;p&gt;This might seem like common sense, but if you didn’t think about it, you might not know.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What Are Syntax Macros?</title>
      <link href="https://jace.pro/blog/what-are-syntax-macros/" />
      <updated>2019-09-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-are-syntax-macros/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/geneva-servicenow-platform/page/script/general_scripting/reference/r_SyntaxEditorMacros.html&quot; rel=&quot;noopener&quot;&gt;Syntax Editor Macros&lt;/a&gt;&amp;nbsp;are rarely talked about.&lt;br&gt;Effectively, they are a text replacement table for script elements.&lt;/p&gt;&lt;p&gt;That might not seem that big of a deal, but for me. It could have saved me some serious headaches. Let’s look at the examples provided on the docs site.&lt;/p&gt;&lt;p&gt;&lt;code&gt;vargr&lt;/code&gt;&amp;nbsp;will replace itself to;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As much as I dislike the use of variable name&amp;nbsp;&lt;code&gt;gr&lt;/code&gt;&amp;nbsp;as using just that name can cause issues, its nice!&lt;/p&gt;&lt;p&gt;You can change the code up so if you want to ensure a&amp;nbsp;&lt;a href=&quot;https://sn.jace.pro/docs/scripting/glideajax/&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;glideAjax&lt;/code&gt;&lt;/a&gt; call always uses some format like I use cause for me consistency is key.&lt;/p&gt;&lt;p&gt;Additionally, because I don’t believe anything is permanent online I’ll include links and Wayback links to these next resources.&lt;/p&gt;&lt;p&gt;This&amp;nbsp;&lt;em&gt;shark711&lt;/em&gt;&amp;nbsp;person form Australia has had a&amp;nbsp;&lt;a href=&quot;https://shark711.github.io/sn-syntax-editor-macro/&quot; rel=&quot;noopener&quot;&gt;“sn-syntax-editor-macro”&lt;/a&gt; repo public since 2016.&amp;nbsp;&lt;a href=&quot;https://web.archive.org/web/20190929002112/https://shark711.github.io/sn-syntax-editor-macro/&quot; rel=&quot;noopener&quot;&gt;Wayback Link&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In that repo its just a collection of these syntax editor macros.&lt;/p&gt;&lt;h2 id=&quot;does-it-work-everywhere-in-the-platform&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-are-syntax-macros/#does-it-work-everywhere-in-the-platform&quot; class=&quot;heading-anchor&quot;&gt;Does it work everywhere in the platform?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Sadly, no, it doesn’t work in the Service Portal Widget Editor screen 😦&lt;/p&gt;&lt;p&gt;Thankfully,&amp;nbsp;&lt;a href=&quot;http://snowguy.co.uk/2019/04/27/service-portal-syntax-editor-macros/&quot; rel=&quot;noopener&quot;&gt;Dan Gibbard’s post&lt;/a&gt; comes to the rescue&amp;nbsp;&lt;a href=&quot;https://web.archive.org/web/20190929002526/http://snowguy.co.uk/2019/04/27/service-portal-syntax-editor-macros/&quot; rel=&quot;noopener&quot;&gt;Wayback&lt;/a&gt;;&lt;/p&gt;&lt;p&gt;He has a UI Script that he says you just gotta add to the widget editor widget. That’s a mouthful.&lt;/p&gt;&lt;p&gt;Thanks jgr1ffin for sharing &lt;a href=&quot;https://www.cheatography.com/kipp/cheat-sheets/personal-servicenow-syntax-macros/&quot; rel=&quot;noopener&quot;&gt;https://www.cheatography.com/kipp/cheat-sheets/personal-servicenow-syntax-macros/&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Projects are better than Certificates</title>
      <link href="https://jace.pro/blog/projects-are-better-than-certificates/" />
      <updated>2019-09-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/projects-are-better-than-certificates/</id>
      <content type="html">
				&lt;p&gt;I posted a survey on Twitter a few weeks ago;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Prosective #servicenow employers, what do you find more telling of a quality applicant? #servicenowdev. If it’s something else, reply to this. - Jace Benson 👨‍💻⚙️ (@jacebenson) &lt;a href=&quot;https://twitter.com/jacebenson/status/1145689658791272448?ref_src=twsrc%5Etfw&quot;&gt;July 1, 2019&lt;/a&gt;&lt;br&gt;SN Certifications 17.2%&lt;br&gt;A bunch of side projects 82.8%&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;why-does-this-matter&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/projects-are-better-than-certificates/#why-does-this-matter&quot; class=&quot;heading-anchor&quot;&gt;Why does this matter?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Average developers using ServiceNow think they&amp;nbsp;&lt;em&gt;need&lt;/em&gt;&amp;nbsp;a certificate to validate&lt;br&gt;that they really do in fact know something about ServiceNow. I think having&lt;br&gt;a certificate is great for ServiceNow, and for your employer if you’re a consultant&lt;br&gt;because it adds to their partner level stuff. You know what is better? Something.&lt;br&gt;That. You. Make.&lt;/p&gt;&lt;p&gt;Make something, make anything. If it’s something you find useful, share that.&lt;/p&gt;&lt;p&gt;Jobs that post that they require a certificate, don’t know the ins-and-outs of&lt;br&gt;what is entailed in getting, and maintaining the certificate. They are not cheap.&lt;/p&gt;&lt;p&gt;Let’s follow one of my… Twitter threads;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;So I’m not sure how familiar y’all are with #darkpatterns but I’m pretty sure this qualifies &lt;a href=&quot;https://t.co/wP3M4IiLyq&quot;&gt;https://t.co/wP3M4IiLyq&lt;/a&gt; - Jace Benson 👨‍💻⚙️ (@jacebenson) &lt;a href=&quot;https://twitter.com/jacebenson/status/1172949268489035782?ref_src=twsrc%5Etfw&quot;&gt;September 14, 2019&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Let me just say this one more time. If I were hiring, and as the top survey had shown, showing results is better than a certificate any day. I’d suggest creating something instead of getting certified. If, you have to get certified, just realize it’s likely not what you think it is.&lt;/p&gt;&lt;p&gt;None of these things guarantee employment and at least if you have something you made, you can have that in a portfolio which is better than a piece of paper saying you know ITSM.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Annotations seem to be unsupported</title>
      <link href="https://jace.pro/blog/annotations-seem-to-be-unsupported/" />
      <updated>2019-09-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/annotations-seem-to-be-unsupported/</id>
      <content type="html">
				&lt;p&gt;First, I have to say, thank you @paige for making me aware. I really appreciate you and this info.&lt;/p&gt;&lt;h2 id=&quot;form-annotations&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/annotations-seem-to-be-unsupported/#form-annotations&quot; class=&quot;heading-anchor&quot;&gt;Form annotations&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Can be really helpful and powerful. You can use them help users enter the right information and users can turn them off when they feel comfortable.&lt;br&gt;The other day on&amp;nbsp;&lt;a href=&quot;https://sndevs.com/&quot; rel=&quot;noopener&quot;&gt;slack&lt;/a&gt;&amp;nbsp;I think Paige mentioned they just flat out do not work on service portal. This is a real shame.&lt;/p&gt;&lt;p&gt;There’s three things here;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;No where does it say it’s not supported on service portal. Not on the Form Annotation link above, not on the page specifically about the&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/newyork-servicenow-platform/page/build/service-portal/concept/form-widget.html&quot; rel=&quot;noopener&quot;&gt;form widget&lt;/a&gt; itself.&lt;/li&gt;&lt;li&gt;There’s no options on the widget to set to allow them.&lt;/li&gt;&lt;li&gt;They aren’t on the new Agent Workspaces either.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Don’t believe me. Okay. Here’s a short video showing the&amp;nbsp;&lt;code&gt;ticket&lt;/code&gt;&amp;nbsp;table record with annotations of html and plain text working in UI16, not working on the Service Portal.&lt;/p&gt;&lt;p&gt;So when people are making new fields, or showing fields on forms and might want to show what things are for what, is the expectation to move these informational messages to guided tours? But that seems less available, meaning it isn’t easily toggled on and off.&lt;/p&gt;&lt;p&gt;Now I’d love to just add this functionality back, but it seem the more and more we as developers add to this platform, the more and more ServiceNow takes away from it. With that I highly encourage you to open a HI ticket if you use annotations and ask pointed questions that have easy and direct answers.&lt;/p&gt;&lt;p&gt;Ha, I was even able to make a preloaded form with some text for you, but you have to already be logged in.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://hi.service-now.com/hisp?id=cssp_irp&amp;amp;description=When%20will%20form%20annoations%20be%20supported%20on%20Service%20Portal%20and%20Agent%20Workspace%3F&quot; rel=&quot;noopener&quot;&gt;Open a Hi ticket&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Further Reading:&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=231ccf25db9cdbc01dcaf3231f9619d9&quot; rel=&quot;noopener&quot;&gt;Community post from 2016 by mdobner&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Better UX or Fully Automated?</title>
      <link href="https://jace.pro/blog/better-ux-or-fully-automated/" />
      <updated>2019-09-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/better-ux-or-fully-automated/</id>
      <content type="html">
				&lt;p&gt;I posted a survey on Twitter a few weeks ago;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;What’s better? Fully Automated with many questions, or nearly automated process with very simple inputs? #ServiceNowDev #ServiceNow #Survey &amp;gt; One means, make it and forget, the other means a better user experience. - Jace Benson 👨‍💻⚙️ (@jacebenson) &lt;a href=&quot;https://twitter.com/jacebenson/status/1174684663861956609?ref_src=twsrc%5Etfw&quot;&gt;September 19, 2019&lt;/a&gt;&lt;br&gt;Many Q’s, 100% Automated 12.1%&lt;br&gt;Few Q’s, 80% Automated 87.9%&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Once I came to this realization that User Experience(UX) is literally more important then getting all the details from an end user, it literally took me three days to sort it internally.&lt;/p&gt;&lt;p&gt;But like a good survey, a good form should only ask the very bare minimum to get the request going. If 80% of the requests for a complicated item are in favor of one type of response, I’d argue, you should either assume every request is for that option, or make a separate item for the other option.&lt;/p&gt;&lt;h2 id=&quot;why&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/better-ux-or-fully-automated/#why&quot; class=&quot;heading-anchor&quot;&gt;Why?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;That makes so many more thing to maintain ( I hear my self asking ). Well, if you keep it, the item is more complex. Therefor it’s less likely to get filled out, or users will more likely dislike the process of putting that data in. Lets look at a real-world example.&lt;/p&gt;&lt;p&gt;Consider the item, “ServiceNow Access or Group Membership”. Now, lets think about the title, it doesn’t indicate an action to add or remove. We’ve used this item for&amp;nbsp;&lt;strong&gt;all&lt;/strong&gt;&amp;nbsp;group changes. This might seem like a simple item, but lets consider the kinds of questions on this form;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Are you adding or removing a user?&lt;/li&gt;&lt;li&gt;What group&lt;/li&gt;&lt;li&gt;What user&lt;/li&gt;&lt;li&gt;Why is access needed&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now of the 7K items that I can see in our system 80% are to add a user. If we had only made this item to add users, 8 out of 10 requests we could have avoided that question. Additionally, asking “Why is access needed” is only filled out 1/2 the time and normally doesn’t make any difference on the request.&lt;/p&gt;&lt;p&gt;What does this form look like when it’s simplified?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;What group needs this new member?&lt;/li&gt;&lt;li&gt;Who is this new member?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now about the removing of a user, I’d say it would make more sense to separate that into a separate item. Once items are simplified you can have other systems potentially digest them. Imagine searching for “how to add a user to a group” and being asked by Clippy if you’d like to add a user to a group, without leaving search, and having it render this simple item.&lt;/p&gt;&lt;p&gt;To me that sounds delightful. It just bothers me so much that I’ve been all about full end-to-end automation until now. I’m not saying that those details are not needed. Sometimes those details will require someone to actually talk to the person who asked for this item. That is not so bad.&lt;/p&gt;&lt;h2 id=&quot;what-about-more-complex-items&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/better-ux-or-fully-automated/#what-about-more-complex-items&quot; class=&quot;heading-anchor&quot;&gt;What about more complex items?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;So sure, lets talk about two other more complex items.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Let’s say one is for a company provided phone and phones available per country are different and varying depending on availability. So maybe you made a few tables to allow the telephony folks to control this item without having to actually change the item.&lt;br&gt;This right now seems too complex for me to breakdown in the same way. This form however allows for different things based on “why” the request is being made. E.g. Lost, New Hire, Up for renewal.&lt;br&gt;Again I’d argue we probably don’t need the why, and should leave that up to the telephony group to&lt;br&gt;ask the requester.&lt;/li&gt;&lt;li&gt;Requesting a certificate, you know like SSL certificates&lt;br&gt;Here things that are needed are the domain, the type of certificate (e.g. Standard, SAN, Wildcard), a password, an responsible group. I’d argue this should be an item per type as most the requests are likely standard certificate.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;My whole point of this post, is you should consider user experience before automation.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Terminology and Wording</title>
      <link href="https://jace.pro/blog/terminology-and-wording/" />
      <updated>2019-09-19T00:00:00Z</updated>
      <id>https://jace.pro/blog/terminology-and-wording/</id>
      <content type="html">
				&lt;p&gt;I took this from,&amp;nbsp;&lt;a href=&quot;https://hi.service-now.com/styles/heisenberg/styleguide/docs/terminology_and_wording.html&quot; rel=&quot;noopener&quot;&gt;Hi’s styleguide&lt;/a&gt; as I don’t trust anyone to keep anything online. So this is just a local copy with opinions about word choices.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Note: Consider consulting with a technical writer before you commit UI text. Tech writers can help with clarity and consistency of UI text.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;avoid-using-please&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/terminology-and-wording/#avoid-using-please&quot; class=&quot;heading-anchor&quot;&gt;Avoid Using “Please”&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Using “please” is unnecessary, unless you are asking the user to do something that is inconvenient or a result of a system error.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Do&lt;/th&gt;&lt;th&gt;Do not&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Select custom application&lt;/td&gt;&lt;td&gt;Please Select a custom application&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Error encountered while executing the selected rules. Please contact system administrator for further assistance&lt;/td&gt;&lt;td&gt;Error encountered while executing the selected rules. Contact system administrator for further assistance&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;avoid-using-words-interchangeably&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/terminology-and-wording/#avoid-using-words-interchangeably&quot; class=&quot;heading-anchor&quot;&gt;Avoid Using Words Interchangeably&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Some words can have multiple meanings, depending on the context. Often, these words are used interchangeably with another word. For clarity, select and consistently use the less ambiguous meaning for each word.&lt;/p&gt;&lt;p&gt;For example,&amp;nbsp;&lt;em&gt;because&lt;/em&gt;&amp;nbsp;and&amp;nbsp;&lt;em&gt;since&lt;/em&gt;&amp;nbsp;should not be used interchangeably. The word&amp;nbsp;&lt;em&gt;since&lt;/em&gt;&amp;nbsp;can have two meanings. To avoid ambiguity, always use&amp;nbsp;&lt;em&gt;because&lt;/em&gt;&amp;nbsp;to provide a reason, and use&amp;nbsp;&lt;em&gt;since&lt;/em&gt;&amp;nbsp;when referring to a specific point in time.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Do&lt;/th&gt;&lt;th&gt;Do not&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td 1&gt;Group approval for {0} was deleted because it no longer matches approval rule&lt;/td&gt;&lt;td 1&gt;Group approval for {0} was deleted since it no longer matches approval rule&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;As another example,&amp;nbsp;&lt;em&gt;once&lt;/em&gt;&amp;nbsp;and _after_should not be used interchangeably. The word&amp;nbsp;&lt;em&gt;once&lt;/em&gt;&amp;nbsp;has two meanings. Always use&amp;nbsp;&lt;em&gt;after&lt;/em&gt;&amp;nbsp;when referring to events that occur later than or in succession to another event, and use&amp;nbsp;&lt;em&gt;once&lt;/em&gt;&amp;nbsp;when referring to events that occur one time.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Do&lt;/th&gt;&lt;th&gt;Do not&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;You cannot change the State after it is Closed or Canceled&lt;/td&gt;&lt;td&gt;You cannot change the State once it is Closed or Canceled&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;spell-out-contractions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/terminology-and-wording/#spell-out-contractions&quot; class=&quot;heading-anchor&quot;&gt;Spell Out Contractions&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Contractions can be hard to translate. Avoid contractions if at all possible.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Do&lt;/th&gt;&lt;th&gt;Do not&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;You do not have any archived tasks&lt;/td&gt;&lt;td&gt;You don’t have any archived tasks&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;use-present-tense&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/terminology-and-wording/#use-present-tense&quot; class=&quot;heading-anchor&quot;&gt;Use Present Tense&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Present tense is easier to read and understand.&lt;/p&gt;&lt;p&gt;Avoid future tense and past tense if at all possible.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Do&lt;/th&gt;&lt;th&gt;Do not&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Problem is closed when the related change is marked Closed Complete&lt;/td&gt;&lt;td&gt;Problem will be closed when the related change is marked Closed Complete&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;write-brief-but-effective-text&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/terminology-and-wording/#write-brief-but-effective-text&quot; class=&quot;heading-anchor&quot;&gt;Write Brief But Effective Text&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In messages that tell users about an action that they can perform, use active voice by providing a direct command or addressing users directly with&amp;nbsp;&lt;em&gt;you&lt;/em&gt;.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Do&lt;/th&gt;&lt;th&gt;Do not&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Specify the start date&lt;/td&gt;&lt;td&gt;Start date must be specified&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;You can create bookmarks by dragging a link to the left edge&lt;/td&gt;&lt;td&gt;Bookmarks are created by dragging a link to the left edge&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Only include enough detail to help users complete tasks.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Do&lt;/th&gt;&lt;th&gt;Do not&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Provide a brief explanation for rejecting this code&lt;/td&gt;&lt;td&gt;Enter your comments for rejecting this code. This comment will be useful for the developer who submitted this code change&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Edit the report settings, and then click&amp;nbsp;&lt;strong&gt;Run Report&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;You’ve chosen Edit mode, make adjustments above and press the button titled&amp;nbsp;&lt;strong&gt;Run Report&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Remove unnecessary words. Examples of words that you can usually remove without altering your meaning include: - Adverbs. For example, really, quickly, and easily. - Articles (for example, the, a, and an) in the beginning of sentences. - Forms of “to be” that are used with another verb.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Do&lt;/th&gt;&lt;th&gt;Do not&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Article was not found&lt;/td&gt;&lt;td&gt;Unfortunately, the article cannot be found&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Chart is loading&lt;/td&gt;&lt;td&gt;The chart is being loaded&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Recordless Rest Is Great</title>
      <link href="https://jace.pro/blog/recordless-rest-is-great/" />
      <updated>2019-09-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/recordless-rest-is-great/</id>
      <content type="html">
				&lt;p&gt;It seems this page was lost in the rearranging of files. I pulled it out&lt;br&gt;of storage&lt;/p&gt;&lt;p&gt;I often use the record-less rest calls to test things. I didn’t see it on&lt;br&gt;my blog, so here’s an example so I can find it in the future.&#92;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; instance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dev40379&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; requestBody &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;short_description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;test incident&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; restMessage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;sn_ws&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RESTMessageV2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setBasicAuth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;slack&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;slack&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setHttpMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;post&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setEndpoint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;http://&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; instance &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.service-now.com/api/now/table/incident&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setRequestBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requestBody&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; error &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;haveError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getErrorCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorMsg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getErrorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; headerVal &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; headers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeaders&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; queryString &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getQueryString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; statusCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getStatusCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; responseBody &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;statusCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;responseBody&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/**
* *** Script: 201
* *** Script: {&quot;result&quot;:{&quot;parent&quot;:&quot;&quot;,&quot;...&quot;}}
*/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Rename Update Set Export File Name</title>
      <link href="https://jace.pro/blog/rename-update-set-export-file-name/" />
      <updated>2019-09-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/rename-update-set-export-file-name/</id>
      <content type="html">
				&lt;p&gt;I know I’ve lost an update set in the past after a clone. Not because I didn’t back it up. But because I couldn’t find it locally on my drive. Or I did but all the names were too much to keep straight.&lt;/p&gt;&lt;p&gt;There’s a bunch of ways to mitigate that loss. I’m not going to go into weather or not you should move everything up or what not. This post is about making the “Export Update Set” button give you a file name that makes more sense.&lt;/p&gt;&lt;p&gt;You can update a OOB Script include&amp;nbsp;&lt;code&gt;ExportWithRelatedLists&lt;/code&gt;&amp;nbsp;to change how it works for exporting update sets. There’s a function,&amp;nbsp;&lt;code&gt;getFileName&lt;/code&gt;&amp;nbsp;that determines the name of the file. It’s&amp;nbsp;&lt;code&gt;table_sysid.xml&lt;/code&gt;. You can add an if and rename it. Here’s the code I’ve used to do this.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;  &lt;span class=&quot;token function-variable function&quot;&gt;getFileName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// added customized name for exported update sets&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// script include: ExportWithRelatedLists&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parent_table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.xml&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parent_table &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sys_remote_update_set&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sus &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_remote_update_set&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.xml&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// end of addition&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// return (this.parent_table + &#39;_&#39; + this.sys_id + &#39;.xml&#39;);&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Further Reading:&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=d2ca7e63dbb723c41cd8a345ca9619c7&quot; rel=&quot;noopener&quot;&gt;Community Post&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>No Code Date Validations</title>
      <link href="https://jace.pro/blog/no-code-date-validations/" />
      <updated>2019-09-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/no-code-date-validations/</id>
      <content type="html">
				&lt;p&gt;I’ve in the past had to write some… cludgey date comparisons. I’m not proud of them. I’m just glad I didn’t have to look at them later.&lt;/p&gt;&lt;p&gt;Had I thought about what Mark Ragavan wrote about, it would have saved me probably days over my development time in the last 10 years.&lt;/p&gt;&lt;p&gt;Really, there’s some common types of checks and actions for dates.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Is it in the past?&lt;/li&gt;&lt;li&gt;Is it within a window? e.g. After 7 days from now.&lt;/li&gt;&lt;li&gt;Is it after another date on the form?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;To show this I’ll add some reproduction steps below. Start out with my&amp;nbsp;&lt;a href=&quot;https://atf.jace.pro/&quot; rel=&quot;noopener&quot;&gt;ATF Scoped App&lt;/a&gt;;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;On your PDI import my&amp;nbsp;&lt;a href=&quot;https://atf.jace.pro/&quot; rel=&quot;noopener&quot;&gt;“ATF” scoped app&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;URL:&amp;nbsp;&lt;code&gt;https://github.com/jacebenson/atf.git&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Change scope to “ATF”&lt;/li&gt;&lt;li&gt;Goto maintain items, and look for “Test Item”&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now that you’re here we can quickly test this out.&lt;/p&gt;&lt;h2 id=&quot;disallow-past-dates&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/no-code-date-validations/#disallow-past-dates&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-09-06-no-code-date-validations/#disallow-past-dates&quot; rel=&quot;noopener&quot;&gt;Disallow past dates&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Create a UI Policy with the condition,&amp;nbsp;&lt;code&gt;Date Before Today&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/6DDauI6Nt_-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/6DDauI6Nt_-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;579&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Add a UI Policy action for the field&amp;nbsp;&lt;code&gt;Date&lt;/code&gt;&amp;nbsp;and check the&amp;nbsp;&lt;code&gt;clear value&lt;/code&gt;&amp;nbsp;checkbox.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/VF-awhBWC2-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/VF-awhBWC2-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;287&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Update the variable&amp;nbsp;&lt;code&gt;Date&lt;/code&gt;&amp;nbsp;to have&amp;nbsp;&lt;code&gt;Example text&lt;/code&gt;&amp;nbsp;of “Date cannot be in the past.”&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/UqlCDyvqX0-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/UqlCDyvqX0-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;196&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Try it out.&lt;/p&gt;&lt;p&gt;Now that you’ve seen it, it should be pretty clear how to apply this to a number of different situations. I just wanted to share as this is a great way for me to remember.&lt;/p&gt;&lt;p&gt;Further Reading:&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=f61964aadbcb3fc85129a851ca9619eb&quot; rel=&quot;noopener&quot;&gt;No Code dates validations thru Catalog UI Policies&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Multiple Variable Row Set - Dependent Variables</title>
      <link href="https://jace.pro/blog/multiple-variable-row-set-dependent-variables/" />
      <updated>2019-09-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/multiple-variable-row-set-dependent-variables/</id>
      <content type="html">
				&lt;p&gt;So It’s been asked a few times, “How can I make my MVRS variables depend on other variables?”&lt;/p&gt;&lt;p&gt;The question has some caveats;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;If the Variables are all in the same row, that’s possible.&lt;/li&gt;&lt;li&gt;If the Variables are not all in the MVRS, it’s possible but you need to add stuff to the MVRS.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Let’s go over each of those.&lt;/p&gt;&lt;p&gt;So I’m going to deal with the 2nd one first. It’s a design choice that you cannot make the MRVS variables dependent on variables outside of the row. The way around this is to add the variable to the MVRS and use that copy instead of the non-MVRS. I don’t see another way around this.&lt;/p&gt;&lt;p&gt;Now that is dealt with the only time this comes up is if you seem to want to use a Lookup Select variable that re-evaluates based on other variables. I’ve&amp;nbsp;&lt;a href=&quot;https://blog.jace.pro/post/2017-10-28-lookup-select-attributes/&quot; rel=&quot;noopener&quot;&gt;written about this in the past here&lt;/a&gt;. If you’re not familiar with it might be worth reading that.&lt;/p&gt;&lt;p&gt;Now I’m going to add reproduction steps cause I don’t want to re-create things all over.&lt;br&gt;So lets decide out test. Let’s load all … notification devices for a user, based on a user variable.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;On your PDI import my&amp;nbsp;&lt;a href=&quot;https://atf.jace.pro/&quot; rel=&quot;noopener&quot;&gt;“ATF” scoped app&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;URL:&amp;nbsp;&lt;code&gt;https://github.com/jacebenson/atf.git&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Change scope to “ATF”&lt;/li&gt;&lt;li&gt;Goto maintain items, and look for “Test Item”&lt;/li&gt;&lt;li&gt;Open the variable set “Multi Row Variable Set”&lt;br&gt;At this point you should see a “question” and “answer”&lt;/li&gt;&lt;li&gt;Rename “question” to “user”&lt;/li&gt;&lt;li&gt;Change it’s type to “reference” to&amp;nbsp;&lt;code&gt;sys_user&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Rename “answer” to “device”&lt;/li&gt;&lt;li&gt;Change it’s type to “lookup select box”&lt;/li&gt;&lt;li&gt;Set it’s table to&amp;nbsp;&lt;code&gt;cmn_notif_device&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Add a variable attribute of&amp;nbsp;&lt;code&gt;ref_qual_elements=user&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Add a reference qualifier of&lt;br&gt;&lt;code&gt;javascript: &#39;user=&#39; + current.variables.user&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now when I try this is just works.&lt;/p&gt;&lt;p&gt;Now say you don’t want the Reference in the MVRS. Okay. I have a Reference variable on this test item already, it has a silly name, “Reference”. But it works. Lets try that and change the variable attribute and reference qualifier.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Change variable attribute to&amp;nbsp;&lt;code&gt;ref_qual_elements=Reference&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Add a reference qualifier of&lt;br&gt;&lt;code&gt;javascript: &#39;user=&#39; + current.variables.Reference&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;You’ll notice this doesn’t appear to work. It seems this is as designed 😭.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/QabIxcAgzd-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/QabIxcAgzd-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;357&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>K11 Adv. Scripting and Debugging</title>
      <link href="https://jace.pro/blog/k11-adv-scripting-and-debugging/" />
      <updated>2019-09-02T00:00:00Z</updated>
      <id>https://jace.pro/blog/k11-adv-scripting-and-debugging/</id>
      <content type="html">
				&lt;p&gt;So I was looking for something and came across this old link from K11. I didn’t go to K11, but I sure wanted to.&lt;/p&gt;&lt;p&gt;I still think this lab has useful info so I’m sharing it&amp;nbsp;&lt;a href=&quot;https://jace.pro/slides/k11-adv-scripting-debugging/#/&quot; rel=&quot;noopener&quot;&gt;here on this post&lt;/a&gt;&amp;nbsp;and linking to the source at the bottom.&lt;/p&gt;&lt;p&gt;Source:&amp;nbsp;&lt;a href=&quot;https://www.slideshare.net/j_roberts/servicenow-knowledge11-advanced-scripting-debugging-lab&quot; rel=&quot;noopener&quot;&gt;https://www.slideshare.net/j_roberts/servicenow-knowledge11-advanced-scripting-debugging-lab&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>UI16: How to update the user menu</title>
      <link href="https://jace.pro/blog/ui16-how-to-update-the-user-menu/" />
      <updated>2019-09-01T00:00:00Z</updated>
      <id>https://jace.pro/blog/ui16-how-to-update-the-user-menu/</id>
      <content type="html">
				&lt;p&gt;Ever wanted to add an item in the drop down menu on the header or&lt;br&gt;customize the sections of the user preferences? Here’s one way.&lt;/p&gt;&lt;p&gt;So it seems ServiceNow is built on jelly, and if you know the names of the&lt;br&gt;macros and ui pages you can overwrite them. So I was able to find the name&lt;br&gt;of the macro. How? That’s a day for another post. I’ll just go over the&lt;br&gt;&lt;code&gt;concourse_user_menu&lt;/code&gt;&amp;nbsp;today. In the image on top, I pasted the code.&lt;/p&gt;&lt;p&gt;So you want to add something to it. Make a UI Macro called&amp;nbsp;&lt;code&gt;concourse_user_menu&lt;/code&gt;&lt;br&gt;with the following xml. I added a link to DuckDuckGo. But you can see how&lt;br&gt;this works.&lt;/p&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt; 
  &lt;span class=&quot;token attr-name&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
  &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jelly:core&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
  &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;glide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
  &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
  &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;glide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;dropdown pull-left&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;application&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;user_info_dropdown&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-toggle&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;dropdown&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;aria-haspopup&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-expanded&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;${gs.getMessage(&#39;User menu&#39;)}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;${gs.getMessage(&#39;User menu&#39;)}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;sn-user-avatar&lt;/span&gt; 
        &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sn-avatar_xs&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
        &lt;span class=&quot;token attr-name&quot;&gt;aria-hidden&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
        &lt;span class=&quot;token attr-name&quot;&gt;disable-popover&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
        &lt;span class=&quot;token attr-name&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;{avatar: &#39;$[gs.getUser().getAvatar()]&#39;, initials: &#39;$[gs.getUser().getInitials()]&#39;, userID: &#39;$[gs.getUserID()]&#39;}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
        &lt;span class=&quot;token attr-name&quot;&gt;enable-presence&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;user-name hidden-xs hidden-sm hidden-md&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          $[HTML,NG:gs.getUser().getDisplayName()]
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sr-only&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          ${gs.getMessage(&#39;User menu&#39;)}
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;elevate-role-indicator&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;caret&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;dropdown-menu&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;aria-labelledby&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;user_info_dropdown&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;presentation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sys_user.do?sys_id=${gs.getUserID()}&lt;span title=&quot;&amp;amp;&quot; class=&quot;token entity named-entity&quot;&gt;&amp;amp;amp;&lt;/span&gt;sysparm_view=ess&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;gsft_main&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;listitem&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;tabindex&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;-1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          ${gs.getMessage(&#39;Profile&#39;)}
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;if&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;${gs.getProperty(&#39;glide.ui.impersonate_button.enable&#39;)}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j2:&lt;/span&gt;if&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;$[new GlideImpersonate().canImpersonate(gs.getUserID())]&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;presentation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;javascript:void(0)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;glide_ui_impersonator&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;sn-modal-show&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;impersonate&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;listitem&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;tabindex&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;-1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
              ${gs.getMessage(&#39;Impersonate User&#39;)}
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j2:&lt;/span&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g2:&lt;/span&gt;evaluate&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jvar_elevated_privileges&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;expression&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;gs.getSession().getAvailableElevatedRoles()&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j2:&lt;/span&gt;if&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;${!empty(jvar_elevated_privileges)}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;presentation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;javascript:void(0)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;sn-modal-show&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;elevateRoles&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;listitem&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;tabindex&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;-1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            ${gs.getMessage(&#39;Elevate Roles&#39;)}
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j2:&lt;/span&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j2:&lt;/span&gt;if&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;$[gs.getUser().getPreference(&#39;user.can.logout&#39;) == &#39;true&#39;]&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;presentation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;logout.do&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;listitem&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;tabindex&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;-1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            ${gs.getMessage(&#39;Logout&#39;)}
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j2:&lt;/span&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;presentation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://ddg.gg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;listitem&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          Welcome to the #duckside
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Service Portal: Embedding a form widget</title>
      <link href="https://jace.pro/blog/service-portal-embedding-a-form-widget/" />
      <updated>2019-08-27T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-embedding-a-form-widget/</id>
      <content type="html">
				&lt;p&gt;So this weekend I had the opportunity to help someone out with an issue&lt;br&gt;on their side project. They had this list they wanted to access from&lt;br&gt;a phone, and wanted the ability to add a new record from a phone.&lt;/p&gt;&lt;p&gt;Simple enough I though. Just make a&amp;nbsp;&lt;a href=&quot;https://getbootstrap.com/docs/3.3/components/#list-group&quot; rel=&quot;noopener&quot;&gt;bootstrap list&lt;/a&gt;&lt;br&gt;of sorts and add a button, to open a&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/app.do#!/api_doc?v=madrid&amp;amp;id=SPM-open_O&quot; rel=&quot;noopener&quot;&gt;spModal&lt;/a&gt;&lt;br&gt;to the OOB form widget.&lt;/p&gt;&lt;p&gt;That worked, but we ended up with 3 buttons, and 2 headers.&lt;/p&gt;&lt;p&gt;So that didn’t work. Sure, I could have removed the buttons, by setting&lt;br&gt;the&amp;nbsp;&lt;code&gt;buttons&lt;/code&gt;&amp;nbsp;array to blank. Also I could have looked into the&lt;br&gt;&lt;code&gt;widget-form&lt;/code&gt;&amp;nbsp;options. I didn’t though. Because it was for a rating&lt;br&gt;system and needed to use something that has a&amp;nbsp;&lt;a href=&quot;https://angular-ui.github.io/bootstrap/#!#rating&quot; rel=&quot;noopener&quot;&gt;star ranking&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In case you are not aware, ServiceNow does a few things for you, like load&lt;br&gt;in a bunch of UI Bootstrap directives.&lt;/p&gt;&lt;p&gt;Enter&amp;nbsp;&lt;code&gt;&amp;lt;uib-rating&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;This gets a little fuzzy here, but essentially, if you have a numeric scale;&lt;br&gt;1-10 or less, you can represent it with stars or other icons. You cannot do&lt;br&gt;this with the OOB widgets you’ll need your own input form. That’s where this&lt;br&gt;post really shines for me. I need to remember how I did this.&lt;/p&gt;&lt;p&gt;So we had a Widget already, called “Home” for the list of ratings. Then we&lt;br&gt;wanted a spModal to load a new widget that was the form. One of the fields&lt;br&gt;is this UIB Rating thing. Then when the [OK] is pressed, send the data back&lt;br&gt;up to the parent widget, and make a new Rating record, and refresh the list.&lt;/p&gt;&lt;p&gt;When sorting this out, I didn’t have that last paragraph. So it took me a bit&lt;br&gt;to find how to pass the data but here’s the crucial bits if you find yourself&lt;br&gt;in a similar situation.&lt;/p&gt;&lt;p&gt;Below is a Home widget which makes the call to spModal.open. That has a promise&lt;br&gt;to handle the response in the&amp;nbsp;&lt;code&gt;then&lt;/code&gt;&amp;nbsp;bit. That’s where this magic happens. It&lt;br&gt;wasn’t in the docs. Thankfully this markdown file was still out on&amp;nbsp;&lt;a href=&quot;https://github.com/service-portal/x-archive/blob/master/documentation/spModal.md#example-5-embedded-widget-with-shared-data&quot; rel=&quot;noopener&quot;&gt;Github&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;End result was this;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/boBqDnwLWt-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/boBqDnwLWt-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;520&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;That example shows how to do this for variable, and I wanted to do this for five.&lt;/p&gt;&lt;h3 id=&quot;home-widget&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-embedding-a-form-widget/#home-widget&quot; class=&quot;heading-anchor&quot;&gt;Home Widget&lt;/a&gt;&lt;/h3&gt;&lt;h3 id=&quot;html&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-embedding-a-form-widget/#html&quot; class=&quot;heading-anchor&quot;&gt;HTML&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;list-group&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;list-group-item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-repeat&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;book in c.data.books&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;badge&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;  
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-click&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;c.onWidget() &lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;btn btn-default&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  Add Rating
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;client-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-embedding-a-form-widget/#client-script&quot; class=&quot;heading-anchor&quot;&gt;Client Script&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Client Script&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;spModal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* widget controller */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; shared &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onWidget&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    spModal&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;shared&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; shared&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;titkfadsf&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;widget&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;rating_form&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
      &lt;span class=&quot;token literal-property property&quot;&gt;widgetInput&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shared&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bookrating&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;shared&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;		
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;server-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-embedding-a-form-widget/#server-script&quot; class=&quot;heading-anchor&quot;&gt;Server Script&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Server Script&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* populate the &#39;data&#39; object */&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* e.g., data.table = $sp.getValue(&#39;table&#39;); */&lt;/span&gt;	
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//if submitted rating&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; rating&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;x_86691_heardit_ratings&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    rating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    rating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;book&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bookrating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    rating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stars&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bookrating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stars&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    rating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;author&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bookrating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    rating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;genre&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bookrating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;genre&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    rating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;u_comments&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bookrating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;comments&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    rating&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;books &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; countRatings &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideAggregate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;x_86691_heardit_ratings&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//parm1: COUNT, MIN, MAX, parm2: field&lt;/span&gt;
  countRatings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addAggregate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;COUNT&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;book&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  countRatings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addAggregate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;AVG&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;stars&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  countRatings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;countRatings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; book &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; countRatings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;book&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ratingCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; countRatings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAggregate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;COUNT&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;book&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; averageRating &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; countRatings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAggregate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;AVG&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;stars&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;books&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;book&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;averageRating&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;averageRating&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;ratingCount&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ratingCount
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;form-widget&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-embedding-a-form-widget/#form-widget&quot; class=&quot;heading-anchor&quot;&gt;Form Widget&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;html-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-embedding-a-form-widget/#html-1&quot; class=&quot;heading-anchor&quot;&gt;HTML&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-horizontal&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;ng-model-options&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;{getterSetter: true}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;fieldset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Form Name --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;legend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Form Name&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;legend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Text input--&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-group&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4 control-label&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;textinput&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Title&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;  
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;bookTitle&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;ng-model&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;c.title&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;ng-model-options&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;{getterSetter:true}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
         &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;textinput&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;placeholder&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-control input-md&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Text input--&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-group&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4 control-label&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;textinput&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Author&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;  
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;bookAuthor&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;ng-model&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;c.author&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;ng-model-options&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;{getterSetter:true}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
         &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;textinput&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;placeholder&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-control input-md&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Select Basic --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-group&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4 control-label&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;selectbasic&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Genre&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;select&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;bookGenre&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
            &lt;span class=&quot;token attr-name&quot;&gt;ng-model&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;c.genre&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; 
            &lt;span class=&quot;token attr-name&quot;&gt;ng-model-options&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;{getterSetter:true}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;selectbasic&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-control&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Pick One&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Action/Adventure&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Action/Adventure&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Autobiography/Biography/Memoir&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Autobiography/Biography/Memoir&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Children&#39;s Fiction&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Children&#39;s Fiction&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Comedy/Humor&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Comedy/Humor&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Crime/Mystery&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Crime/Mystery&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Drama/Romance&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Drama/Romance&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;History/Classic&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;History/Classic&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Horror/Paranormal&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Horror/Paranormal&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Motivational/Educational/Health &amp;amp; Wellness&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Motivational/Educational/Health &lt;span title=&quot;&amp;amp;&quot; class=&quot;token entity named-entity&quot;&gt;&amp;amp;amp;&lt;/span&gt; Wellness&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Mystery/Suspense/Thriller&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Mystery/Suspense/Thriller&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Poetry&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Poetry&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Religion/Spirituality&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Religion/Spirituality&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Sci-Fi/Fantasy&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Sci-Fi/Fantasy&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Other&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Other&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Text input--&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-group&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4 control-label&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;textinput&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Stars&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;  
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;uib-rating&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-model&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;c.stars&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; 
              &lt;span class=&quot;token attr-name&quot;&gt;ng-model-options&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;{getterSetter:true}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token attr-name&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;5&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;uib-rating&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Textarea --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-group&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4 control-label&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;textarea&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Comments&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;                     
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;textarea&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-model&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;c.comments&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; 
              &lt;span class=&quot;token attr-name&quot;&gt;ng-model-options&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;{getterSetter:true}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-control&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
              &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;bookComments&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
              &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;bookComments&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;default text&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;textarea&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;fieldset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;client-script-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-embedding-a-form-widget/#client-script-1&quot; class=&quot;heading-anchor&quot;&gt;Client Script&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Client Script&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* widget controller */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; shared &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;widget&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;shared&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newVal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; angular&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isDefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shared&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; shared&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;author&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newVal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; angular&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isDefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shared&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;author &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; shared&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;author&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;genre&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;genre&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newVal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; angular&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isDefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shared&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;genre &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; shared&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;genre&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;stars&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;stars&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newVal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; angular&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isDefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shared&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stars &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; shared&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stars&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;comments&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newVal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; angular&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isDefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shared&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;comments &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; shared&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;comments&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;server-script-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-embedding-a-form-widget/#server-script-1&quot; class=&quot;heading-anchor&quot;&gt;Server Script&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Server Script&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* populate the &#39;data&#39; object */&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* e.g., data.table = $sp.getValue(&#39;table&#39;); */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;viswam10 thanks for the feedback!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Service Portal: Own your own form</title>
      <link href="https://jace.pro/blog/service-portal-own-your-own-form/" />
      <updated>2019-08-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-own-your-own-form/</id>
      <content type="html">
				&lt;p&gt;Sometimes, you have to control your form. You can use the out of box variable types ServiceNow gives you and the messages they give you.&lt;/p&gt;&lt;p&gt;But, sometimes, that won’t due. In these times you have own the form. You might asking, “Jace, how do you do that? DOM Manipulation is bad mmkay.” You’re right, ServiceNow HATES dom manipulation. That will break. I don’t suggest that. You can use a custom macro for UI 16, and a SP widget for Mobile/SP things.&lt;/p&gt;&lt;p&gt;This is one way to do that. Really this is just an extension of the work that Cody Esmay and Hunter Wolf did for a&amp;nbsp;&lt;a href=&quot;https://sndevs.github.io/meetups/decks/sp-portal-custom-inputs/&quot; rel=&quot;noopener&quot;&gt;lab&lt;/a&gt;&amp;nbsp;YEARS ago now.&lt;/p&gt;&lt;p&gt;So one way to do this is to make a variable that you’re fulfillers and UI 16 users can interact that will keep the data. Then make a Macro/Widget to control the visibility and value of that first variable.&lt;/p&gt;&lt;p&gt;Here’s what I mean. Imagine you have a item to request a Single Board Computer.&lt;/p&gt;&lt;p&gt;Lets say those options are;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Raspberry Pi Zero&lt;/li&gt;&lt;li&gt;Raspberry Pi 4&lt;/li&gt;&lt;li&gt;Paperclip&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And you want to show the spec differences. Normally you’d have to let &lt;a href=&quot;https://blog.jace.pro/g%5C_form/#mobile-showfieldmsg&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;g_form.showFieldMsg&lt;/code&gt;&lt;/a&gt;&amp;nbsp;do the heavy lifting.&lt;/p&gt;&lt;p&gt;This time it’s different. You know that paperclip needs an image. And you know what image it needs. Clippy.&lt;/p&gt;&lt;p&gt;So follow these steps;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create the item&lt;/li&gt;&lt;li&gt;Create a variable to store the value you actually will use for workflow and task visibility&lt;/li&gt;&lt;li&gt;Create a variable of type “Macro”&lt;/li&gt;&lt;li&gt;Create a widget for the macro&lt;/li&gt;&lt;li&gt;Build the HTML you want. I generally use&amp;nbsp;&lt;a href=&quot;https://bootsnipp.com/forms&quot; rel=&quot;noopener&quot;&gt;bootsnipp&lt;/a&gt;&amp;nbsp;to build that&lt;/li&gt;&lt;li&gt;Add some JS to access&amp;nbsp;&lt;code&gt;g_form&lt;/code&gt;, hide the variable from Step 2. Add a ng-change attribute and have that set the now hidden variable from Step 2&lt;/li&gt;&lt;li&gt;Add some cool ng-bind to dynamically create some html&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Here’s what that could look like.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/QBIxfcmztR-650.webp 650w, https://jace.pro/img/QBIxfcmztR-960.webp 960w, https://jace.pro/img/QBIxfcmztR-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/QBIxfcmztR-650.jpeg&quot; alt width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://jace.pro/img/QBIxfcmztR-650.jpeg 650w, https://jace.pro/img/QBIxfcmztR-960.jpeg 960w, https://jace.pro/img/QBIxfcmztR-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Here’s the code used for that example;&lt;/p&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- your widget template --&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-horizontal&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;fieldset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Form Name --&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;legend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Form Name&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;legend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Select Basic --&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-group&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4 control-label&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;selectbasic&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Hardware&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;select&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;selectbasic&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;selectbasic&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-control&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-change&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;c.setVariable()&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-model&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;c.hardwareSelected&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;paperclip&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Paperclip&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;rpi4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Raspberry Pi 4&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;rpi0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Raspberry Pi 0&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;description&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-bind-html&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;c.hardwareOptions[c.hardwareSelected]&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-model&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;c.hardwareOptions[c.hardwareSelected]&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;fieldset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The Client JS&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//This is the controller, we&#39;ve included $scope in the function above because it&#39;s easy to work with&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;//We are going to simplify accessing g_form within the client script by setting it as a variable named g_form&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; g_form &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//We are going to simplify accessing g_form within the HTML by setting it as a $scope attribute&lt;/span&gt;
	$scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;g_form &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setDisplay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;hardware_sku&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;setVariable&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;hardware_sku&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hardwareSelected&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hardwareSelected &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Hello?&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hardwareOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hardwareOptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;paperclip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;This is an amazing bar of steel bent in and important way!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hardwareOptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;paperclip &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;img src=&#39;https://i.ytimg.com/vi/a3qlc2ivES8/hqdefault.jpg&#39; /&amp;gt;&quot;&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hardwareOptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rpi4 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;It&#39;s new... and the USB-C has issues&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hardwareOptions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rpi0 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;It&#39;s small and comes with wifi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>New York Features: Auto Suggest, JS Beautify and Context Menus</title>
      <link href="https://jace.pro/blog/new-york-features-auto-suggest-js-beautify-and-context-menus/" />
      <updated>2019-08-12T00:00:00Z</updated>
      <id>https://jace.pro/blog/new-york-features-auto-suggest-js-beautify-and-context-menus/</id>
      <content type="html">
				&lt;p&gt;New york has a few, nice things added for developers if you still work in the tool and not on some syncer.&lt;/p&gt;&lt;p&gt;This feature specifically is barely noted. Here’s the link to the&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/newyork-release-notes/page/release-notes/summary/rn-summary-new-features.html&quot; rel=&quot;noopener&quot;&gt;documentation&lt;/a&gt;.&lt;br&gt;However, it’s so short I’ll put the text here too;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;HTML auto-suggestions&lt;br&gt;Edit HTML and Jelly scripts and define what is rendered when the page is displayed.&lt;br&gt;The script can contain either static XHTML or dynamically generated content that is defined as Jelly and can call script includes and UI macros.&lt;br&gt;JS Beautify&lt;br&gt;Format code by applying the proper indentation to the script.&lt;br&gt;Context menu&lt;br&gt;Enable the context menu options for script includes, Glide APIs, and tables in the JavaScript editor.&lt;br&gt;&lt;br&gt;With the context menu options, your users can navigate to:&#92;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Script include definitions&#92;&lt;/li&gt;&lt;li&gt;Glide API documentation&#92;&lt;/li&gt;&lt;li&gt;System and custom table definitions and data&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;Well here I’m going to go over the them.&lt;/p&gt;&lt;h2 id=&quot;html-auto-suggestions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/new-york-features-auto-suggest-js-beautify-and-context-menus/#html-auto-suggestions&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-08-11-script-field-click-events/#html-auto-suggestions&quot; rel=&quot;noopener&quot;&gt;HTML auto-suggestions&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Well this is a very overdue convenience. But at least it’s here… Or it’s allegedly here. When I tried it by going toa new UI page, modify the XML adding&amp;nbsp;&lt;code&gt;&amp;lt;div&amp;gt;test&lt;/code&gt;&amp;nbsp;then starting to type&amp;nbsp;&lt;code&gt;&amp;lt;/&lt;/code&gt;&amp;nbsp;nothing came up… so maybe this isn’t here.&lt;/p&gt;&lt;h2 id=&quot;js-beautify&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/new-york-features-auto-suggest-js-beautify-and-context-menus/#js-beautify&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-08-11-script-field-click-events/#js-beautify&quot; rel=&quot;noopener&quot;&gt;JS Beautify&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This isn’t really clear that you&amp;nbsp;&lt;strong&gt;apply you’re own settings&lt;/strong&gt;&amp;nbsp;here. However you can. It’s controlled via this property,&amp;nbsp;&lt;a href=&quot;https://jace.pro/properties/glide.ui.syntax_editor.linter.eslint_config/&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;glide.ui.syntax_editor.linter.eslint_config&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;This appears to just take a eslint json config object. An example one would be like this;&lt;/p&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;rules&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;constructor-super&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-case-declarations&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-class-assign&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-compare-neg-zero&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-cond-assign&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-console&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-const-assign&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-constant-condition&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-control-regex&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-debugger&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-delete-var&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-dupe-args&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-dupe-class-members&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-dupe-keys&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-duplicate-case&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-empty-character-class&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-empty-pattern&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-empty&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;allowEmptyCatch&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-ex-assign&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-extra-boolean-cast&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-extra-semi&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;semi&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-fallthrough&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-func-assign&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-global-assign&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-inner-declarations&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-invalid-regexp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-irregular-whitespace&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-mixed-spaces-and-tabs&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-new-symbol&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-obj-calls&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-octal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-redeclare&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-regex-spaces&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-self-assign&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-sparse-arrays&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-this-before-super&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-undef&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;off&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-unexpected-multiline&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-unreachable&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-unsafe-finally&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-unsafe-negation&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-unused-labels&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-unused-vars&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;off&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;no-useless-escape&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;require-yield&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;use-isnan&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;valid-typeof&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Feel free to read more up on eslint&amp;nbsp;&lt;a href=&quot;https://eslint.org/docs/user-guide/configuring&quot; rel=&quot;noopener&quot;&gt;here on their docs site&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Also thanks&amp;nbsp;&lt;a href=&quot;https://twitter.com/DoomaSimunek/status/1157404260327407617&quot; rel=&quot;noopener&quot;&gt;Dominik Simunek&lt;/a&gt;&amp;nbsp;for the info to look into this.&lt;/p&gt;&lt;h2 id=&quot;context-menus-for-script-fields&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/new-york-features-auto-suggest-js-beautify-and-context-menus/#context-menus-for-script-fields&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-08-11-script-field-click-events/#context-menus-for-script-fields&quot; rel=&quot;noopener&quot;&gt;Context Menus for script fields&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I noticed the context menu thing before I read about it. If you have a script include or client script where you invoke some script include, they now show up&amp;nbsp;&lt;strong&gt;bold&lt;/strong&gt;&amp;nbsp;and&amp;nbsp;&lt;em&gt;italicized&lt;/em&gt;. If you right-click on anything like that, you’ll get a few options;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Show Documentation (which will bring you to&amp;nbsp;&lt;a href=&quot;http://docs.servicenow.com/&quot; rel=&quot;noopener&quot;&gt;docs.servicenow.com&lt;/a&gt;&amp;nbsp;for that object)&lt;/li&gt;&lt;li&gt;Show Definition (which will bring you to the table definition of the content)&lt;/li&gt;&lt;li&gt;Show Data (which will bring you to the table list of data)&lt;/li&gt;&lt;li&gt;Open Definition (which will bring you to the script include)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This might seem small but man, will this save me time.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>New York Feature: Remote Tables</title>
      <link href="https://jace.pro/blog/new-york-feature-remote-tables/" />
      <updated>2019-08-11T00:00:00Z</updated>
      <id>https://jace.pro/blog/new-york-feature-remote-tables/</id>
      <content type="html">
				&lt;p&gt;Making a remote table could be less work but as it is, it’s better than what was before.&lt;/p&gt;&lt;p&gt;If you are okay with&amp;nbsp;&lt;em&gt;read only&lt;/em&gt;&amp;nbsp;data from another system then this is actually pretty good.&lt;/p&gt;&lt;p&gt;To use this you’ll need to create a Table still that will have columns for the columns defined in the script. So the real benefit is just keeping the data up to date and OUT of ServiceNow.&lt;/p&gt;&lt;p&gt;For this example I’m going to use&amp;nbsp;&lt;a href=&quot;https://www.alphavantage.co/&quot; rel=&quot;noopener&quot;&gt;https://www.alphavantage.co/&lt;/a&gt;&amp;nbsp;to get Stock information.&lt;/p&gt;&lt;p&gt;The table I’m going to make is going to have the data for the quote api. It has this data in a response for this;&lt;/p&gt;&lt;p&gt;&lt;code&gt;https://www.alphavantage.co/query?function=GLOBAL_QUOTE&amp;amp;symbol=MSFT&amp;amp;apikey=demo&lt;/code&gt;&lt;/p&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;Global Quote&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;01. symbol&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MSFT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;02. open&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;138.6100&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;03. high&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;139.3800&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;04. low&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;136.4600&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;05. price&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;137.7100&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;06. volume&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;23466701&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;07. latest trading day&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2019-08-09&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;08. previous close&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;138.8900&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;09. change&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-1.1800&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;10. change percent&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-0.8496%&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So I’ll store all of it and use the “symbol” as the unique key, some how. It has to be a “sys_id” but… in this case “MSFT” isn’t long enough. I guess we’ll get there when we get there.&lt;/p&gt;&lt;p&gt;So here’s the steps I’m taking in order (in global)&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a remote table (&lt;code&gt;u_st_stock&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Create columns;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;u_symbol&lt;/code&gt;&amp;nbsp;- String&lt;/li&gt;&lt;li&gt;&lt;code&gt;u_open&lt;/code&gt;&amp;nbsp;- Floating Point Number&lt;/li&gt;&lt;li&gt;&lt;code&gt;u_high&lt;/code&gt;&amp;nbsp;- Floating Point Number&lt;/li&gt;&lt;li&gt;&lt;code&gt;u_low&lt;/code&gt;&amp;nbsp;- Floating Point Number&lt;/li&gt;&lt;li&gt;&lt;code&gt;u_price&lt;/code&gt;&amp;nbsp;- Floating Point Number&lt;/li&gt;&lt;li&gt;&lt;code&gt;u_volume&lt;/code&gt;&amp;nbsp;- Integer&lt;/li&gt;&lt;li&gt;&lt;code&gt;u_latest_trading_day&lt;/code&gt;&amp;nbsp;- Date&lt;/li&gt;&lt;li&gt;&lt;code&gt;u_previous_close&lt;/code&gt;&amp;nbsp;- Floating Point Number&lt;/li&gt;&lt;li&gt;&lt;code&gt;u_change&lt;/code&gt;&amp;nbsp;- Floating Point Number&lt;/li&gt;&lt;li&gt;&lt;code&gt;u_change_percent&lt;/code&gt;&amp;nbsp;- Floating Point Number&lt;/li&gt;&lt;/ul&gt;&lt;ol start=&quot;3&quot;&gt;&lt;li&gt;Create a Remote Table Definition(&lt;code&gt;sys_script_vtable&lt;/code&gt;)&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;This is not as simple as I’d like. I was hoping to use some simple stock price for the NYSE however, there is not a good source for that in its entirety.&lt;br&gt;So I defaulted it to load 5 stocks and if a search occurred, I returned those results. But pretty much if your data is rate limited, or doesn’t allow return of &amp;gt; 5 records, this becomes really painful.&lt;/li&gt;&lt;li&gt;Also if you need it to work with searches, it seems that the only way to get field searches is to get the encoded query and parse the bits out. There is no helper function for that if the search is a field STARTSWITH, ENDSWITH or CONTAINS which is used if you have the inputs on the headers of the list.&lt;/li&gt;&lt;li&gt;Feel free to try this out yourself with this code;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;executeQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;v_table&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v_query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getKey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getStock&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;ticker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; endpoint &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://www.alphavantage.co/query?function=GLOBAL_QUOTE&amp;amp;symbol=&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		endpoint &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; ticker &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;amp;apikey=&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getKey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; restMessage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;sn_ws&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RESTMessageV2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setHttpMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;get&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setEndpoint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;endpoint&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setRequestBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; error &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;haveError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getErrorCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorMsg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getErrorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; headerVal &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; headers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeaders&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; queryString &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getQueryString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; statusCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getStatusCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; responseBody &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; responseObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;responseBody&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			
				gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addErrorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;responseBody&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; responseObj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Global Quote&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; quote &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; responseObj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Global Quote&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				v_table&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addRow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;sys_id&lt;/span&gt;              &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ticker&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;u_symbol&lt;/span&gt;            &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; quote&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;01. symbol&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;u_open&lt;/span&gt;              &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; quote&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;02. open&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;u_high&lt;/span&gt;              &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; quote&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;03. high&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;u_low&lt;/span&gt;               &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; quote&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;04. low&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;u_price&lt;/span&gt;             &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; quote&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;05. price&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;u_volume&lt;/span&gt;            &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; quote&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;06. volume&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;u_latest_trading_day&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; quote&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;07. latest trading day&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;u_previous_close&lt;/span&gt;    &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; quote&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;08. previous close&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;u_change&lt;/span&gt;            &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; quote&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;09. change&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;u_change_percent&lt;/span&gt;    &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseFloat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;quote&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;10. change percent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addErrorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;responseBody&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				v_table&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addRow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;sys_id&lt;/span&gt;              &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ticker&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token literal-property property&quot;&gt;u_symbol&lt;/span&gt;            &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; ticker
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getTickers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;keyword&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;		
		&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; endpoint &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://www.alphavantage.co/query?function=SYMBOL_SEARCH&amp;amp;keywords=&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		endpoint &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; keyword &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;amp;apikey=&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getKey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; restMessage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;sn_ws&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RESTMessageV2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setHttpMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;get&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setEndpoint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;endpoint&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setRequestBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; error &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;haveError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getErrorCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorMsg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getErrorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; headerVal &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; headers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeaders&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; queryString &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getQueryString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; statusCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getStatusCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; responseBody &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; responseObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;responseBody&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;responseObj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bestMatches&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				responseObj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bestMatches&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; matches &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; responseObj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bestMatches&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				matches&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;match&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4. region&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;United States&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
						&lt;span class=&quot;token function&quot;&gt;getStock&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;match&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;1. symbol&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
					&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;/*
		on list load... load these 10 
		Load now, and 9 others
		now
		goog
		msft
		aapl
		uber
		expe
		ko
		pep
		tsla
		amzn
		tgt
		*/&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;//https://www.alphavantage.co/query?function=GLOBAL_QUOTE&amp;amp;symbol=MSFT&amp;amp;apikey=demo&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; defaultStocks &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
			&lt;span class=&quot;token string&quot;&gt;&#39;now&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token string&quot;&gt;&#39;goog&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token string&quot;&gt;&#39;aapl&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token string&quot;&gt;&#39;tsla&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token string&quot;&gt;&#39;amzn&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v_query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isGet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;getStock&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v_query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSysId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token comment&quot;&gt;//list lookup&lt;/span&gt;
			gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addInfoMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v_query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; query &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; v_query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;STARTSWITH&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; 
			   query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;CONTAINS&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; 
			   query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;ENDSWITH&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
			  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; keyword&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; keyword1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;STARTSWITH&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; keyword2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;CONTAINS&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; keyword3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;ENDSWITH&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyword1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					keyword &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; keyword1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;^&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyword2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					keyword &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; keyword2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;^&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyword3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					keyword &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; keyword3&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;^&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
				&lt;span class=&quot;token function&quot;&gt;getTickers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keyword&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token comment&quot;&gt;//if search is happening... lookup those tickers&lt;/span&gt;
				&lt;span class=&quot;token comment&quot;&gt;//https://www.alphavantage.co/query?function=SYMBOL_SEARCH&amp;amp;keywords=target&amp;amp;apikey=&lt;/span&gt;

			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;token comment&quot;&gt;//not searched load default&lt;/span&gt;
				defaultStocks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;ticker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;token function&quot;&gt;getStock&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ticker&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		v_query&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setLastErrorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ex&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addErrorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ex&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// Main API:&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//    v_table.addRow({ ... }) - adds a row to the result set&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// There are also query helper methods&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//    v_query.getEncodedQuery() - returns encoded querystring&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//    v_query.getCondition(field) - returns encoded querystring for the given field (includes field name, operator, and value)&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//    v_query.getParameter(field) - returns parameter for the given field (only includes value for equality conditions)&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//    v_query.isGet() - returns whether the query is a single get by sys_id&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//    v_query.getSysId() - returns parameter for sys_id field&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//    v_query.isTextSearch() - returns whether the query contains a text query parameter&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//    v_query.getTextSearch() - returns text search query parameter (internal field name 123TEXTQUERY321)&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//    v_query.getFirstRowWanted() - returns the first row to include&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;//    v_query.getLastRowWanted() - returns the last row to include&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// Note: You must define sys_id for each row so that forms and lists for this table work properly&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// Your code goes here&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// v_table.addRow({...})&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v_table&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v_query&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;TL;DR - Remote tables are neat, but have some limitations. It does lower the work for a READ ONLY integration, however, it all really depends on your API.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Why use a Service Account</title>
      <link href="https://jace.pro/blog/why-use-a-service-account/" />
      <updated>2019-08-08T00:00:00Z</updated>
      <id>https://jace.pro/blog/why-use-a-service-account/</id>
      <content type="html">
				&lt;p&gt;On Slack someone asked me to post about service accounts.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Could anyone define some advantages of using a service account rather than a user account when it comes to integrations?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;There was a three pros right away;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Doesn’t depend on user being employed&lt;/li&gt;&lt;li&gt;Generally can be excused from password reset policies&lt;/li&gt;&lt;li&gt;Granular permissions&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;how-one-is-made&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/why-use-a-service-account/#how-one-is-made&quot; class=&quot;heading-anchor&quot;&gt;How one is made&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Check the “Web Services Access Only” on the user account. It’s part of the&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/london-platform-administration/page/administer/users-and-groups/concept/c_NonInteractiveSessions.html&quot; rel=&quot;noopener&quot;&gt;Non-Interactive Session Plugin&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Now this is where this post was going to end. I had gone into how I do service accounts.&lt;/p&gt;&lt;h2 id=&quot;how-i-manage-them&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/why-use-a-service-account/#how-i-manage-them&quot; class=&quot;heading-anchor&quot;&gt;How I manage them&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Create a group called “ServiceNow Service Accounts”&lt;/li&gt;&lt;li&gt;We have a process in place when someone wants to be added to a group they submit and item. It has an approval to the manager. If Approved a script adds them to the group. Otherwise they don’t get added.&lt;/li&gt;&lt;li&gt;Once added to the group the roles attached,&amp;nbsp;&lt;code&gt;itil&lt;/code&gt;, and&amp;nbsp;&lt;code&gt;rest_api_explorer&lt;/code&gt;&amp;nbsp;are given. You could add other older roles like the SOAP roles but we encourage REST.&lt;/li&gt;&lt;li&gt;Let the owner of the service account figure out their calls.&lt;/li&gt;&lt;li&gt;Once those calls are sorted. Remove gui access.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;We use SSO so user’s can’t use their personal account to do the REST calls outside of the browser. We make the new user have a manager of the person who is asking for the service account. If the service account needs more access, we can add it to other groups where the access is proper. I do intend to write up something or link to something to help convey what the APIs are they have access to but generally I point them to the&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/london-application-development/page/integrate/inbound-rest/concept/c_RESTAPIExplorer.html&quot; rel=&quot;noopener&quot;&gt;Rest API Explorer&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Further Reading:&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=b4fca2a5dbd0dbc01dcaf3231f961900&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=b4fca2a5dbd0dbc01dcaf3231f961900&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Save Time, Money, and Resources by Asking Why</title>
      <link href="https://jace.pro/blog/save-time-money-and-resources-by-asking-why/" />
      <updated>2019-08-08T00:00:00Z</updated>
      <id>https://jace.pro/blog/save-time-money-and-resources-by-asking-why/</id>
      <content type="html">
				&lt;p&gt;There are problems we should be solving, but they’re not part of any requirements. That’s where you come in. Use your professional skills to help us shape a solution that will make our customers happy, without breaking the bank.&lt;/p&gt;&lt;p&gt;I’ve been on most sides of the equation when it comes to this. I started as a help desk technician. Then I tried to help define the requirements that we needed. I’ve been a consultant where I fulfilled the requirements. Now I’m a customer again. When you’re a customer, you don’t care how it works, just that it works. At least that was my opinion back then. Now, I push back.&amp;nbsp;&lt;strong&gt;I ask why&lt;/strong&gt;. I get the details that drive to the question, “&lt;strong&gt;What business problem does this solve?&lt;/strong&gt;” You should to.&lt;/p&gt;&lt;h2 id=&quot;you-are-the-expert&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/save-time-money-and-resources-by-asking-why/#you-are-the-expert&quot; class=&quot;heading-anchor&quot;&gt;You are the expert&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You were hired or at least you are probably working as the subject matter expert. If you didn’t push back or give reasons&amp;nbsp;&lt;strong&gt;why&lt;/strong&gt;&amp;nbsp;the requirement they’ve given is poor/bad why wouldn’t they keep doing this? When someone asks;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Customer: Hey SME, Add this checkbox on Incident called “Outage”&lt;/p&gt;&lt;p&gt;You: I can do that, but&amp;nbsp;&lt;em&gt;why&lt;/em&gt;&amp;nbsp;do you want this?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;That’s all this post is about.&lt;br&gt;Until they give you the reason, or the business problem this solves. I’d wait to do it.&lt;/p&gt;&lt;p&gt;I’ve spent countless hours head down working on code that never got released because I never asked this. Sure. They are paying you either via payroll or via a contract, but, if you didn’t ask you wouldn’t be doing you’re job. It’s critical you ask.&lt;/p&gt;&lt;h2 id=&quot;how-i-handle-poor-requirements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/save-time-money-and-resources-by-asking-why/#how-i-handle-poor-requirements&quot; class=&quot;heading-anchor&quot;&gt;How I handle poor requirements&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I’ll go over adding that field above.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Customer: Hey SME, Add this checkbox on Incident called “Outage”&lt;/p&gt;&lt;p&gt;You: I can do that, but&amp;nbsp;&lt;em&gt;why&lt;/em&gt;&amp;nbsp;do you want this?&lt;/p&gt;&lt;p&gt;Customer: Don’t ask why, just do it.&lt;/p&gt;&lt;p&gt;You: If I didn’t ask, you could hire anyone to do this.&lt;br&gt;I’ve done this in the past, and knowing&amp;nbsp;&lt;em&gt;why&lt;/em&gt;&amp;nbsp;is crucial to ensuring this is the right thing to solve the problem.&lt;br&gt;When you don’t present a problem, it’s concerning because you might not be considering other factors.&lt;/p&gt;&lt;p&gt;Customer: Like what? Less is worst!&lt;/p&gt;&lt;p&gt;You: Licensing, whose maintaining the value of the field, what is going to keep it in check,&lt;br&gt;and setting an expectation that anyone can add an arbitrary number of fields on incident.&lt;/p&gt;&lt;p&gt;Customer: This is just for reporting. We want to know when and for what customers an incident is considered an outage.&lt;/p&gt;&lt;p&gt;You: …🤦‍♂️&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;You can see how this might keep going down different ways. Maybe the right call here is use the &amp;nbsp;&lt;code&gt;cmdb_ci_outage&lt;/code&gt;table. Maybe the right call is to use a metric. In any case. Adding a field is probably not the right way to solve this.&lt;/p&gt;&lt;p&gt;Let me end here by quoting Chuck’s ending remarks;&lt;/p&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;First, Seek to understand their needs. Don’t take their solution at face value when you haven’t understood the problem. Ask why.&lt;/li&gt;&lt;li&gt;If necessary, consult the community for additional knowledge in the matter.&lt;/li&gt;&lt;li&gt;Offer options.&lt;/li&gt;&lt;li&gt;Finally, make your recommendation based on their needs.&lt;br&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=7c9ceae1dbd0dbc01dcaf3231f9619da&quot; rel=&quot;noopener&quot;&gt;Chuck Tomasi&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;By asking why, you could short circuit any solution saving you and colleagues loads of time, the customers money, and wasted resources.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Quick Guide: New York</title>
      <link href="https://jace.pro/blog/quick-guide-new-york/" />
      <updated>2019-07-26T00:00:00Z</updated>
      <id>https://jace.pro/blog/quick-guide-new-york/</id>
      <content type="html">
				&lt;p&gt;Here’s my take of whats new with New York&lt;/p&gt;&lt;p&gt;Deprecated things&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/newyork-application-development/page/script/processors/concept/c_Processors.html&quot; rel=&quot;noopener&quot;&gt;Processors-Listed under changes&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Note: This feature is deprecated. While legacy, custom processors will continue to be supported, creating new custom processors has been deprecated. Instead, please use the Scripted REST APIs. The following information is left in the documentation for existing processors only.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;You can still create them, so it’s just a recommendation&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/properties/mid.download.through.instance/&quot; rel=&quot;noopener&quot;&gt;Mid server property mid.download.through.instance&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;In previous releases, this property was set to true to force all MID Servers to upgrade through the instance and was configurable by customers. In the New York release, auto-upgrades are performed by the MID Server host computer and not by the instance. To implement this behavior, the default value of this property was changed to&amp;nbsp;&lt;strong&gt;false&lt;/strong&gt;, and the property was concealed to protect the setting. DO NOT change the value of this property.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/newyork-release-notes/page/release-notes/summary/rn-summary-changes.html&quot; rel=&quot;noopener&quot;&gt;Updated things&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/newyork-it-service-management/page/product/service-catalog-management/concept/c_ServiceCatalogVariableSets.html&quot; rel=&quot;noopener&quot;&gt;Multi-row variable set&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;When you clone a request that contains a multi-row variable set, the information that is specified in the multi-row variable set is available in all cloned requests.&lt;/li&gt;&lt;li&gt;A multi-row variable set is now visible in the variable summarizer in Service Portal.&lt;/li&gt;&lt;li&gt;Set a limit to the number of rows that you can add to a multi-row variable set by using the `max_rows` attribute in the Variable Set attributes field.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/newyork-release-notes/page/release-notes/summary/rn-summary-new-features.html&quot; rel=&quot;noopener&quot;&gt;New things&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Remote Tables&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/newyork-servicenow-platform/page/administer/remote-tables/concept/remote-tables.html&quot; rel=&quot;noopener&quot;&gt;Retrieve external data using remote tables and scripts&lt;/a&gt;&#92;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;retrieve the data from external sources or from another instance with REST or SOAP services. The external data lives in the memory in read-only mode, which makes the data temporary, or transient, within the Now Platform. You can then view and manipulate the external data without importing or storing it.&lt;/li&gt;&lt;li&gt;Plugin: “Remote Tables” or &lt;code&gt;com.glide.script.vtable&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Recommended limit is 1000 records&lt;/li&gt;&lt;li&gt;example use cases;&lt;/li&gt;&lt;li&gt;weather-related data that appears on a homepage when a user logs in.&lt;/li&gt;&lt;li&gt;customer details that are stored in an external Customer Relationship Management&lt;/li&gt;&lt;li&gt;personnel data from Human Capital Management&lt;/li&gt;&lt;li&gt;Example working script;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;executeQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;v_table&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v_query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// &amp;lt;https://randomuser.me/api/&amp;gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; requestBody &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; restMessage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;sn_ws&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;RESTMessageV2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setHttpMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;get&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setEndpoint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;https://randomuser.me/api/?results=1000&amp;amp;seed=foobar&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&#92;
    restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setRequestBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requestBody&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; restMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; error &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;haveError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getErrorCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorMsg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getErrorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;errorCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;errorMsg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; headerVal &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; headers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeaders&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; queryString &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getQueryString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; statusCode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getStatusCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; responseBody &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; responseObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;responseBody&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; responseObjLen &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; responseObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;System Clone&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/newyork-platform-administration/page/administer/managing-data/task/schedule-cloning.html&quot; rel=&quot;noopener&quot;&gt;Automatic, repeated cloning&lt;/a&gt;&amp;nbsp;- Clone instances automatically on a recurring basis.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Delegated development and deployment&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/newyork-application-development/page/build/applications/task/t_AddADeveloper.html&quot; rel=&quot;noopener&quot;&gt;Manage Update sets&lt;/a&gt;&amp;nbsp;- Grant non-admin users permission to manage local and retrieved update sets. Allow users to create, update, and delete local update sets as well as preview, resolve conflicts, and commit retrieved update sets.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Further Reading:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=abfe2818db667b401cd8a345ca9619a1&quot; rel=&quot;noopener&quot;&gt;Pradeep’s blog post&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/blog.do?p=/post/newyork-pdi/&quot; rel=&quot;noopener&quot;&gt;Dave Slusher’s post&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>What is GlideOverlay</title>
      <link href="https://jace.pro/blog/what-is-glideoverlay/" />
      <updated>2019-07-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-glideoverlay/</id>
      <content type="html">
				&lt;p&gt;I was on twitter and this came up;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Try GlideOverlay instead. I can send you a DM with some sample code.&lt;br&gt;Or ping on SNDevs.&lt;/p&gt;&lt;p&gt;-– Jonathan Jacob (@TheBurgerlution)&amp;nbsp;&lt;a href=&quot;https://twitter.com/TheBurgerlution/status/1154155650521456640&quot; rel=&quot;noopener&quot;&gt;July 24, 2019&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I had to make a&amp;nbsp;&lt;a href=&quot;https://sn.jace.pro/GlideOverlay&quot; rel=&quot;noopener&quot;&gt;page for it&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It appears to be a undocumented modal.&lt;/p&gt;&lt;p&gt;It’s used throughout ServiceNow on VTB, Change, and Surveys.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Licensing... Again (Mid 2019)[redacted]</title>
      <link href="https://jace.pro/blog/licensing-again-mid-2019[redacted]/" />
      <updated>2019-07-23T00:00:00Z</updated>
      <id>https://jace.pro/blog/licensing-again-mid-2019[redacted]/</id>
      <content type="html">
				&lt;h1 id=&quot;content-redacted-per-servicenows-council&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/licensing-again-mid-2019[redacted]/#content-redacted-per-servicenows-council&quot; class=&quot;heading-anchor&quot;&gt;CONTENT REDACTED PER SERVICENOWS COUNCIL&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I’m sad that I can’t share the content I have seen in public spaces. I don’t want to cause more problems for anyone so I’m removing the content they’ve identified. At this point, I’d suggest reaching out to your business contacts of similar size and industry to comparing notes. Outside of that you’ll have to meet with ServiceNow and get their pricing.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Updated on Feb 16 2021&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>New side project: Dev Toolbox</title>
      <link href="https://jace.pro/blog/new-side-project-dev-toolbox/" />
      <updated>2019-07-22T00:00:00Z</updated>
      <id>https://jace.pro/blog/new-side-project-dev-toolbox/</id>
      <content type="html">
				&lt;p&gt;Dev Toolbox is a scoped app to capture tests for all the Out of Box ServiceNow applications. This is a scoped application for Service-now to allow some utilities to be easily added and maintained on instances.&lt;/p&gt;&lt;p&gt;Now the difference between Jim’s and mine is, well was, I haven’t checked in a few months, about 11 features due to scoped things not being able to be added on a global level.&lt;/p&gt;&lt;p&gt;Here’s a link to the current issues:&lt;br&gt;&lt;a href=&quot;https://github.com/jacebenson/devtoolbox/issues&quot; rel=&quot;noopener&quot;&gt;https://github.com/jacebenson/devtoolbox/issues&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;My Scoped version cause, scoped means you’re protected right: &lt;a href=&quot;https://devtoolbox.jace.pro/&quot; rel=&quot;noopener&quot;&gt;https://devtoolbox.jace.pro&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Jim’s Post: &lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=b3c843aadb892b40fece0b55ca961906&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=b3c843aadb892b40fece0b55ca961906&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Jim’s Update Set: &lt;a href=&quot;https://developer.servicenow.com/app.do#!/share/contents/7375176_developer_toolbox3?v=1&amp;amp;t=PRODUCT_DETAILS&quot; rel=&quot;noopener&quot;&gt;https://developer.servicenow.com/app.do#!/share/contents/7375176_developer_toolbox3?v=1&amp;amp;t=PRODUCT_DETAILS&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>How to build reports via URL</title>
      <link href="https://jace.pro/blog/how-to-build-reports-via-url/" />
      <updated>2019-07-22T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-build-reports-via-url/</id>
      <content type="html">
				&lt;p&gt;Building reports via the URL can be really useful when you don’t want to&lt;br&gt;ensure a report exists or hasn’t been modified, but documentation is&lt;br&gt;pretty lacking on it.&lt;/p&gt;&lt;p&gt;Thankfully&lt;br&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=05540369dbd8dbc01dcaf3231f9619d3#answer_9ca74435db905fc01dcaf3231f9619a3&quot; rel=&quot;noopener&quot;&gt;ralpho&lt;/a&gt;&lt;br&gt;have seemed to figure out the url parameters.&lt;/p&gt;&lt;p&gt;Report type: List&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Parameter&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;manual_labor&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;form&lt;/td&gt;&lt;td&gt;&lt;code&gt;list&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;query&lt;/td&gt;&lt;td&gt;encoded query&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;field_list&lt;/td&gt;&lt;td&gt;comma separated list of fields you want&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;type&lt;/td&gt;&lt;td&gt;&lt;code&gt;list&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;table&lt;/td&gt;&lt;td&gt;&lt;code&gt;table&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;A few things to note;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;You can dot-walk on the fields regardless of role, so this is a&lt;br&gt;great workaround to making some tricky reports for power users.&lt;/li&gt;&lt;li&gt;You can add variables from sc_req_item if you can figure out the&lt;br&gt;sys_id of variable&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Here’s an example report url I generated for someone the other day that&lt;br&gt;included variables;&lt;/p&gt;&lt;p&gt;&lt;code&gt;sys_report_template.do?sysparm_field_list=variables.71cba0540f5fb600503c590be1050ec0&amp;amp;sysparm_type=list&amp;amp;sysparm_table=sc_req_item&amp;amp;sysparm_from_list=true&amp;amp;sysparm_chart_size=large&amp;amp;sysparm_manual_labor=true&amp;amp;sysparm_query=cat_item%3Dc9d980750f437200503c590be1050e8a%5Ecat_item%3Dc9d980750f437200503c590be1050e8a&lt;/code&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Service Portal: Disabling the order confirmation dialog</title>
      <link href="https://jace.pro/blog/service-portal-disabling-the-order-confirmation-dialog/" />
      <updated>2019-07-21T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-disabling-the-order-confirmation-dialog/</id>
      <content type="html">
				&lt;p&gt;This is the first thing I was asked to do as the dialog is not what some of my stake holders wanted.&lt;/p&gt;&lt;p&gt;Make this sys_property&amp;nbsp;&lt;code&gt;glide.sc.sp.twostep&lt;/code&gt;&amp;nbsp;with a value false.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/OLNvbFfgWO-650.webp 650w, https://jace.pro/img/OLNvbFfgWO-960.webp 960w, https://jace.pro/img/OLNvbFfgWO-1341.webp 1341w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/OLNvbFfgWO-650.jpeg&quot; alt width=&quot;1341&quot; height=&quot;424&quot; srcset=&quot;https://jace.pro/img/OLNvbFfgWO-650.jpeg 650w, https://jace.pro/img/OLNvbFfgWO-960.jpeg 960w, https://jace.pro/img/OLNvbFfgWO-1341.jpeg 1341w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Madrid</title>
      <link href="https://jace.pro/blog/madrid/" />
      <updated>2019-07-21T00:00:00Z</updated>
      <id>https://jace.pro/blog/madrid/</id>
      <content type="html">
				&lt;p&gt;Here’s my take of whats new with Madrid&lt;/p&gt;&lt;h1 id=&quot;madrid&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/madrid/#madrid&quot; class=&quot;heading-anchor&quot;&gt;Madrid&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I was told these are things I should look at;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/yTMwzjvgO6-650.webp 650w, https://jace.pro/img/yTMwzjvgO6-960.webp 960w, https://jace.pro/img/yTMwzjvgO6-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/yTMwzjvgO6-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;843&quot; srcset=&quot;https://jace.pro/img/yTMwzjvgO6-650.jpeg 650w, https://jace.pro/img/yTMwzjvgO6-960.jpeg 960w, https://jace.pro/img/yTMwzjvgO6-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Thing&lt;/th&gt;&lt;th&gt;Comment&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Agent Workspace&lt;/td&gt;&lt;td&gt;Yep It’s here, it’s nice, g_form stuff works on it for mobile stuff&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Agent Workspace Lists&lt;/td&gt;&lt;td&gt;Not sure what to look at here&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Agent Workspace Form Resizing&lt;/td&gt;&lt;td&gt;Nice?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Agent Workspace Contextual Search&lt;/td&gt;&lt;td&gt;Looking into what’s different&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ATF&lt;/td&gt;&lt;td&gt;Lots of new features&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ATF Smart Suites&lt;/td&gt;&lt;td&gt;Sounds, intelligent&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ATF Quick Start Test&lt;/td&gt;&lt;td&gt;Could be improved&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ATF Custom UI / Page Inspector&lt;/td&gt;&lt;td&gt;Interesting and a nice addition&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ATF Parameterized Tests&lt;/td&gt;&lt;td&gt;Looks great&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Virtual Agent&lt;/td&gt;&lt;td&gt;Extra subscription&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;No-code designer&lt;/td&gt;&lt;td&gt;It’s pretty&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adv. Work Assignment&lt;/td&gt;&lt;td&gt;Not sure what this is&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Service Portal Multiple KB and Catalog Support&lt;/td&gt;&lt;td&gt;Now that I have a work around I have to see if it’s worth undoing it for this&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Store &amp;amp; Plugin UI Updates&lt;/td&gt;&lt;td&gt;Only impacts Admins, it’s nice&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mid Server - Now using JRE&lt;/td&gt;&lt;td&gt;Saving some $ money&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CMDB Query Builder&lt;/td&gt;&lt;td&gt;I’ll have to check it out&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Flow Designer&lt;/td&gt;&lt;td&gt;Booo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Decision Trees&lt;/td&gt;&lt;td&gt;Booo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;New Logic&lt;/td&gt;&lt;td&gt;Booo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;New Actions&lt;/td&gt;&lt;td&gt;Booo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;New API&lt;/td&gt;&lt;td&gt;Booo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Reporting on Running Flows&lt;/td&gt;&lt;td&gt;Booo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IntegrationHub - Adds Soap&lt;/td&gt;&lt;td&gt;Nice&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IntegrationHub - Payload Builder&lt;/td&gt;&lt;td&gt;…&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mobile - new app on apple and play store&lt;/td&gt;&lt;td&gt;Where? Not as of Jan 29&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mobile studio&lt;/td&gt;&lt;td&gt;I still haven’t found it&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mobile offline capable&lt;/td&gt;&lt;td&gt;Nice…&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Instance Security Center&lt;/td&gt;&lt;td&gt;I still think&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/share/contents/7852853_security_best_practice_audit?v=3.02&amp;amp;t=PRODUCT_DETAILS&quot; rel=&quot;noopener&quot;&gt;https://developer.servicenow.com/connect.do#!/share/contents/7852853_security_best_practice_audit?v=3.02&amp;amp;t=PRODUCT_DETAILS&lt;/a&gt;&amp;nbsp;was better, easier to follow&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloning&lt;/td&gt;&lt;td&gt;Cant test this on my pdi&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Analytics hub&lt;/td&gt;&lt;td&gt;not sure I know this.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>How to activate plugins via script</title>
      <link href="https://jace.pro/blog/how-to-activate-plugins-via-script/" />
      <updated>2019-07-21T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-activate-plugins-via-script/</id>
      <content type="html">
				&lt;p&gt;Sometimes you have a whole bunch of plugins to install. No reason to keep your screen busy, you can script it, here’s how.&lt;/p&gt;&lt;p&gt;Some smart person named Ashby posted about this. I haven’t tested it out, but this seems promising and likely undocumented.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Partial Version&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//you can check following URL to see if the work is finished. It is finished when the completion time is set and the percent complete is 100.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&amp;lt;instance&amp;gt;/sys_execution_tracker_list.do?sysparm_query=name%3DPlugin%20Installer&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; plugins &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
plugins&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;com.snc.pa.change&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
plugins&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;com.snc.pa.problem&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
plugins&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;com.snc.pa.premium&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
plugins&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;com.snc.pa.solution.library&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; main &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideMultiPluginManagerWorker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
main&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setPluginIds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;plugins&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
main&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setProgressName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Plugin Installer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
main&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setBackground&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
main&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Source: &lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=e6db5e4bdb47ab002e8c2183ca9619a2#answer_a8ddb159db407388feb1a851ca9619fa&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=e6db5e4bdb47ab002e8c2183ca9619a2#answer_a8ddb159db407388feb1a851ca9619fa&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Did you know, you can impersonate with a sys_id</title>
      <link href="https://jace.pro/blog/did-you-know-you-can-impersonate-with-a-sys_id/" />
      <updated>2019-07-21T00:00:00Z</updated>
      <id>https://jace.pro/blog/did-you-know-you-can-impersonate-with-a-sys_id/</id>
      <content type="html">
				&lt;p&gt;Sometimes you’ll have many people with the same name… Don’t judge my users. You also sometimes need to impersonate the user. Did you know you can impersonate by pasting the&amp;nbsp;&lt;code&gt;sys_id&lt;/code&gt;? I didn’t.&lt;/p&gt;&lt;p&gt;Thanks cmclendon for sharing this!&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/7EZU9toAcW-650.webp 650w, https://jace.pro/img/7EZU9toAcW-853.webp 853w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/7EZU9toAcW-650.jpeg&quot; alt width=&quot;853&quot; height=&quot;593&quot; srcset=&quot;https://jace.pro/img/7EZU9toAcW-650.jpeg 650w, https://jace.pro/img/7EZU9toAcW-853.jpeg 853w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Source: &lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=9a177495db44f348f7fca851ca961961&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=9a177495db44f348f7fca851ca961961&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Using Processors to download files</title>
      <link href="https://jace.pro/blog/using-processors-to-download-files/" />
      <updated>2019-07-12T00:00:00Z</updated>
      <id>https://jace.pro/blog/using-processors-to-download-files/</id>
      <content type="html">
				&lt;p&gt;I was talking to Nthumma about a problem. It was the need for a custom XML file for each incident. I knew of a way to do this, but it’s &lt;strong&gt;old&lt;/strong&gt;. Enter Processors.&lt;/p&gt;&lt;p&gt;If you ever have a need to make something auto-download, that would seem pretty difficult as you need to set headers as mentioned&amp;nbsp;&lt;a href=&quot;https://stackoverflow.com/questions/386845/http-headers-for-file-downloads#386904&quot; rel=&quot;noopener&quot;&gt;here on StackOverlow&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;With processors this is a non-issue. Here’s how to do it.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Processor code&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;g_request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_processor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; filter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; g_request&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;filterQuery&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; fileName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filter &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.xml&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; contentType &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;xml/plain&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; fileContent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; incident &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;incident&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    incident&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    incident&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    fileContent&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;root&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;incident&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//generate XML format&lt;/span&gt;
        fileContent&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;record&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        fileContent&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;message-type&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; incident&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;short_description&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;/message-type&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        fileContent&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;/record&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    fileContent&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;/root&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;contentType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;xml/plain&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        fileContent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;XMLDocument&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fileContent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    g_response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addHeader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Content-Disposition&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;attachment;filename=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; fileName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    g_processor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeOutput&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;contentType&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;fileContent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_processor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeOutput&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;text/html&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g_request&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_response&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_processor&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;ui-action&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/using-processors-to-download-files/#ui-action&quot; class=&quot;heading-anchor&quot;&gt;UI Action&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Client side ui action&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;downloadXML&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;downloadXML&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sysparm_query &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; g_list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;orderby&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;fixed&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;/customprocessor.do?filterQuery=&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;sysparm_query&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;_blank&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Thanks Nthumma for the idea to make this post and the code above.&lt;/p&gt;&lt;p&gt;Further Reading;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.john-james-andersen.com/blog/service-now/create-your-own-rest-based-servicenow-web-service.html&quot; rel=&quot;noopener&quot;&gt;http://www.john-james-andersen.com/blog/service-now/create-your-own-rest-based-servicenow-web-service.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenowguru.com/scripting/download-attachments-zip-file/&quot; rel=&quot;noopener&quot;&gt;https://www.servicenowguru.com/scripting/download-attachments-zip-file/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Silly Tech Videos</title>
      <link href="https://jace.pro/blog/silly-tech-videos/" />
      <updated>2019-07-10T00:00:00Z</updated>
      <id>https://jace.pro/blog/silly-tech-videos/</id>
      <content type="html">
				&lt;p&gt;A while ago some people shared with me some great videos that were just&lt;br&gt;silly. These are just, well in my opinion worth at least a cursory&lt;br&gt;glance. If you’re like me you’ll probably enjoy them&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Sia Mongodb:&amp;nbsp;&lt;a href=&quot;https://youtu.be/0vPt7GI-2kc?t=24&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/0vPt7GI-2kc?t=24&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Opensuse uptown funk:&amp;nbsp;&lt;a href=&quot;https://youtu.be/SYRlTISvjww&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/SYRlTISvjww&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Winsongs:&amp;nbsp;&lt;a href=&quot;https://youtu.be/W--13mBc788&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/W--13mBc788&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Outbound Email Examples - Might come in handy</title>
      <link href="https://jace.pro/blog/outbound-email-examples-might-come-in-handy/" />
      <updated>2019-07-10T00:00:00Z</updated>
      <id>https://jace.pro/blog/outbound-email-examples-might-come-in-handy/</id>
      <content type="html">
				&lt;p&gt;I am trying to keep a small list of emails I get from service-now&lt;br&gt;installations… this post is just that;&lt;/p&gt;&lt;h1 id=&quot;email-examples&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/outbound-email-examples-might-come-in-handy/#email-examples&quot; class=&quot;heading-anchor&quot;&gt;Email Examples&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;survey-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/outbound-email-examples-might-come-in-handy/#survey-1&quot; class=&quot;heading-anchor&quot;&gt;Survey 1&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Subject: ServiceNow Customer Satisfaction Survey for [RECORD]&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;We would like to thank you again for being our customer.&lt;/p&gt;&lt;p&gt;Customer satisfaction is our priority, and we hope the solution to&lt;br&gt;incident [RECORD] has met your expectations.&lt;/p&gt;&lt;p&gt;Please grade our performance by clicking the link below to complete a&lt;br&gt;short survey. Every survey is acted upon and your input is vital.&lt;/p&gt;&lt;p&gt;Customer Satisfaction Survey&lt;/p&gt;&lt;p&gt;Thank you for your input.&lt;/p&gt;&lt;h2 id=&quot;[[persons-name]-[role-department]-[company]]https//jacepro/post/2019-07-10-email-examples/persons-name-role-department-company&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/outbound-email-examples-might-come-in-handy/#[[persons-name]-[role-department]-[company]]https//jacepro/post/2019-07-10-email-examples/persons-name-role-department-company&quot; class=&quot;heading-anchor&quot;&gt;[[Person’s name] [Role, Department] [Company]](&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-07-10-email-examples/#persons-name-role-department-company&quot; rel=&quot;noopener&quot;&gt;https://jace.pro/post/2019-07-10-email-examples/#persons-name-role-department-company&lt;/a&gt;)&lt;/h2&gt;&lt;p&gt;Resolved by: [Resolvers Name]&lt;/p&gt;&lt;p&gt;Short description: [Short Description]&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;survey-2&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/outbound-email-examples-might-come-in-handy/#survey-2&quot; class=&quot;heading-anchor&quot;&gt;Survey 2&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Subject: Survey invitation: New Survey on Customer Satisfaction Survey&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;You have been invited to take the survey: Customer Satisfaction&lt;br&gt;Survey.&lt;/p&gt;&lt;p&gt;Click here to take your survey: [Link to survey]&lt;/p&gt;&lt;p&gt;Unsubscribe | Notification Preferences&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;record-commented&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/outbound-email-examples-might-come-in-handy/#record-commented&quot; class=&quot;heading-anchor&quot;&gt;Record Commented&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Subject: [Priority] [Record Class] Commented - [Company] - [Record]: [Short Description]&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;[Record Updated] [Priority] [Record Class]: [Record]&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;[hi-[record-class]-[record]-has-been-updated]https//jacepro/post/2019-07-10-email-examples/hi-record-class-record-has-been-updated&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/outbound-email-examples-might-come-in-handy/#[hi-[record-class]-[record]-has-been-updated]https//jacepro/post/2019-07-10-email-examples/hi-record-class-record-has-been-updated&quot; class=&quot;heading-anchor&quot;&gt;[Hi [Record Class] [Record] has been updated.](&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-07-10-email-examples/#hi-record-class-record-has-been-updated&quot; rel=&quot;noopener&quot;&gt;https://jace.pro/post/2019-07-10-email-examples/#hi-record-class-record-has-been-updated&lt;/a&gt;)&lt;/h2&gt;&lt;p&gt;[Record Class]: [Record]&lt;br&gt;Priority: [Priority]&lt;br&gt;Short Description: [Short Description]&lt;/p&gt;&lt;h2 id=&quot;comments&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/outbound-email-examples-might-come-in-handy/#comments&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-07-10-email-examples/#comments&quot; rel=&quot;noopener&quot;&gt;Comments&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Comments]&lt;/p&gt;&lt;p&gt;Steps to reproduce: [Steps to reproduce]&lt;/p&gt;&lt;p&gt;Business Criticality: [Impact]&lt;/p&gt;&lt;p&gt;Affected Users: [Quantity of users]&lt;/p&gt;&lt;p&gt;Start Date: [Start Date]&lt;/p&gt;&lt;p&gt;End Date: [End Date]&lt;/p&gt;&lt;hr&gt;&lt;p&gt;Click here to view [Record Class] [Record]&lt;/p&gt;&lt;p&gt;Sincerely, ServiceNow Customer Support&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Dawn Jureks great list of Best Practices</title>
      <link href="https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/" />
      <updated>2019-07-10T00:00:00Z</updated>
      <id>https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/</id>
      <content type="html">
				&lt;p&gt;Dawn Jurek has a great list of best practices that she keeps up to&lt;br&gt;date.&lt;br&gt;As much as I’d like to think that list will always exist, I’ve been&lt;br&gt;burnt before, so this is my copy.&lt;/p&gt;&lt;h1 id=&quot;best-practices&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#best-practices&quot; class=&quot;heading-anchor&quot;&gt;Best Practices&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Source: &lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=6e7d6269dbd0dbc01dcaf3231f9619c0&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=6e7d6269dbd0dbc01dcaf3231f9619c0&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;atf-automated-test-framework&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#atf-automated-test-framework&quot; class=&quot;heading-anchor&quot;&gt;ATF (Automated Test Framework)&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=1a4e66addbd0dbc01dcaf3231f96192f&quot; rel=&quot;noopener&quot;&gt;Best practices for using ATF&lt;/a&gt; 9/26/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=84dc2665dbd0dbc01dcaf3231f96190f&quot; rel=&quot;noopener&quot;&gt;How to avoid ATF testing failures&lt;/a&gt; 5/30/17&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;development&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#development&quot; class=&quot;heading-anchor&quot;&gt;Development&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=09becbf3db589b403882fb651f961986&quot; rel=&quot;noopener&quot;&gt;Best practices for using the Flow Designer&lt;/a&gt; 2/22/18&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=582de2e5dbd0dbc01dcaf3231f961988&quot; rel=&quot;noopener&quot;&gt;Dictionary overrides—what they are and how to use them&lt;/a&gt; 7/24/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=342e266ddbd0dbc01dcaf3231f961971&quot; rel=&quot;noopener&quot;&gt;When running business rules, timing is everything&lt;/a&gt; 7/11/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=47bc6e25dbd0dbc01dcaf3231f961967&quot; rel=&quot;noopener&quot;&gt;Six ways to Improve the Performance of Client Scripts&lt;/a&gt; 6/21/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=c79dae69dbd0dbc01dcaf3231f96192a&quot; rel=&quot;noopener&quot;&gt;Properly deploy changes using Team Development&lt;/a&gt; 5/23/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=ddecea65dbd0dbc01dcaf3231f9619f0&quot; rel=&quot;noopener&quot;&gt;How to keep variables from stepping on each other&lt;/a&gt; 3/17/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=b4fca2a5dbd0dbc01dcaf3231f961900&quot; rel=&quot;noopener&quot;&gt;User account or service account? What to use for web service tasks&lt;/a&gt; 3/10/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=51aca225dbd0dbc01dcaf3231f9619f8&quot; rel=&quot;noopener&quot;&gt;Outsmart fickle networks, firewall changes, and down servers in your web services integration&lt;/a&gt; 2/24/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=675d2a29dbd0dbc01dcaf3231f961910&quot; rel=&quot;noopener&quot;&gt;Why you should never use external iFrames - and the one exception to this rule&lt;/a&gt; 2/15/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=4a1e226ddbd0dbc01dcaf3231f9619dd&quot; rel=&quot;noopener&quot;&gt;How to clone to a target instance that has in-development applications&lt;/a&gt; 2/14/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=c64e26addbd0dbc01dcaf3231f9619da&quot; rel=&quot;noopener&quot;&gt;Why you shouldn’t develop on your production instance&lt;/a&gt; 1/17/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=6f4da229dbd0dbc01dcaf3231f9619a8&quot; rel=&quot;noopener&quot;&gt;Annotate scripts and customizations with comments&lt;/a&gt; 12/20/16&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;hi&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#hi&quot; class=&quot;heading-anchor&quot;&gt;HI&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=cb5eeaaddbd0dbc01dcaf3231f96198f&quot; rel=&quot;noopener&quot;&gt;Requesting assistance with quarterly patching or version upgrade changes&lt;/a&gt; 5/17/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=c07ceea1dbd0dbc01dcaf3231f9619b4&quot; rel=&quot;noopener&quot;&gt;The high importance of managing your company contacts on HI&lt;/a&gt; 5/1/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=aa2da6e5dbd0dbc01dcaf3231f961912&quot; rel=&quot;noopener&quot;&gt;Adding new users in HI—the how and the why&lt;/a&gt; 4/24/17&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;hr-service-delivery&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#hr-service-delivery&quot; class=&quot;heading-anchor&quot;&gt;HR Service Delivery&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=2cf37273db2d5b40852c7a9e0f961920&quot; rel=&quot;noopener&quot;&gt;The basics of integrating with SuccessFactors and other HR management systems&lt;/a&gt; 4/27/18&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;information-technology-and-business-management-itbm&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#information-technology-and-business-management-itbm&quot; class=&quot;heading-anchor&quot;&gt;Information Technology &amp;amp; Business Management (ITBM)&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=e300ac23dbf69bc09d612926ca961977&quot; rel=&quot;noopener&quot;&gt;Agile 101—What is Agile development and why do you need it?&lt;/a&gt; 6/28/18&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=16ec5613dba21340e0e80b55ca961910&quot; rel=&quot;noopener&quot;&gt;PPM 101&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=16ec5613dba21340e0e80b55ca961910&quot; rel=&quot;noopener&quot;&gt;What is PPM, and why do you need it?&lt;/a&gt; 6/18/18&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;information-technology-operations-management-itom&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#information-technology-operations-management-itom&quot; class=&quot;heading-anchor&quot;&gt;Information Technology Operations Management (ITOM)&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=e913125fdbd9d7404837f3231f9619de&quot; rel=&quot;noopener&quot;&gt;CMDB 101 - What is a configuration management database, and why do you need one?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=e913125fdbd9d7404837f3231f9619de&quot; rel=&quot;noopener&quot;&gt;What is a configuration management database, and why do you need one?&lt;/a&gt; 4/13/18&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=6ab2a303db0d9bc4852c7a9e0f96194b&quot; rel=&quot;noopener&quot;&gt;ITOM 101 - What is ITOM and why do I need it?&lt;/a&gt; 3/30/18&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=224bdde9dbacdf00b61ff3231f9619ef&quot; rel=&quot;noopener&quot;&gt;Tips for implementing and troubleshooting Cloud Management&lt;/a&gt; 3/2/18&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=e41daea5dbd0dbc01dcaf3231f96197b&quot; rel=&quot;noopener&quot;&gt;Best practices for setting up Discovery schedules&lt;/a&gt; Best practices for setting up Discovery schedules 12/14/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=9d1deea5dbd0dbc01dcaf3231f961939&quot; rel=&quot;noopener&quot;&gt;Best practices for MID Server setup and tuning&lt;/a&gt; 11/9/17&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;information-technology-services-management-itsm&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#information-technology-services-management-itsm&quot; class=&quot;heading-anchor&quot;&gt;Information Technology Services Management (ITSM)&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=0dd93b5bdb5edfc02d1efb651f961927&quot; rel=&quot;noopener&quot;&gt;ITSM 101 - What is ITSM and why do you need it?&lt;/a&gt; 6/1/18&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=0e8da669dbd0dbc01dcaf3231f961981&quot; rel=&quot;noopener&quot;&gt;Service Catalog in Kingston—podcast and best practices&lt;/a&gt; 2/8/18&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=f71da2e5dbd0dbc01dcaf3231f9619a4&quot; rel=&quot;noopener&quot;&gt;Best practices for a successful ITSM implementation&lt;/a&gt; 1/18/18&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=dfdc6a65dbd0dbc01dcaf3231f96196b&quot; rel=&quot;noopener&quot;&gt;Best practices for implementing the Problem Management application&lt;/a&gt; 1/11/18&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=c1ecea65dbd0dbc01dcaf3231f9619a3&quot; rel=&quot;noopener&quot;&gt;Best practice: Make the most of standard changes&lt;/a&gt; 12/18/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=452e266ddbd0dbc01dcaf3231f9619f1&quot; rel=&quot;noopener&quot;&gt;Best practices for implementing the Incident Management application&lt;/a&gt; 10/26/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=e4edeae9dbd0dbc01dcaf3231f961962&quot; rel=&quot;noopener&quot;&gt;Best practices for implementing the Change Management application&lt;/a&gt; 10/11/17&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;platform&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#platform&quot; class=&quot;heading-anchor&quot;&gt;Platform&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=cc7ebd56db385f402e247a9e0f961945&quot; rel=&quot;noopener&quot;&gt;Tips for streamlining ServiceNow upgrades - podcast and best practices&lt;/a&gt; 3/16/18&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=a5ec2e65dbd0dbc01dcaf3231f9619ac&quot; rel=&quot;noopener&quot;&gt;Why you should give each of your sub-production instances its own unique look&lt;/a&gt; 4/12/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=f1bcea25dbd0dbc01dcaf3231f96193b&quot; rel=&quot;noopener&quot;&gt;Set up currency properties correctly&lt;/a&gt; 4/6/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=8f2e2a6ddbd0dbc01dcaf3231f9619e0&quot; rel=&quot;noopener&quot;&gt;How do you plug in a plugin? The ins and outs of plugin activation&lt;/a&gt; 3/3/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=730e6e2ddbd0dbc01dcaf3231f961927&quot; rel=&quot;noopener&quot;&gt;Limit the Number of Users with the Admin Role&lt;/a&gt; 1/5/17&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;forms&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#forms&quot; class=&quot;heading-anchor&quot;&gt;Forms&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=6b9dae69dbd0dbc01dcaf3231f9619ec&quot; rel=&quot;noopener&quot;&gt;Best practices for creating and editing forms&lt;/a&gt; 8/24/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=571da2e5dbd0dbc01dcaf3231f961915&quot; rel=&quot;noopener&quot;&gt;Choosing the correct field type when building a form&lt;/a&gt; 6/9/17&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;lists&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#lists&quot; class=&quot;heading-anchor&quot;&gt;Lists&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=0e0eaa2ddbd0dbc01dcaf3231f9619ff&quot; rel=&quot;noopener&quot;&gt;Best practices for configuring lists&lt;/a&gt; 9/11/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=1b3d2ee5dbd0dbc01dcaf3231f961933&quot; rel=&quot;noopener&quot;&gt;Where to avoid linking to a reference field when configuring a list&lt;/a&gt; 1/12/17&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;tables&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#tables&quot; class=&quot;heading-anchor&quot;&gt;Tables&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=00fd622ddbd0dbc01dcaf3231f961974&quot; rel=&quot;noopener&quot;&gt;Avoid issues when modifying shared fields in extended tables&lt;/a&gt; 3/29/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=077da269dbd0dbc01dcaf3231f961966&quot; rel=&quot;noopener&quot;&gt;When to Create a New Table vs.&amp;nbsp;When to Extend&lt;/a&gt; 1/28/17&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;reporting-and-performance-analytics&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#reporting-and-performance-analytics&quot; class=&quot;heading-anchor&quot;&gt;Reporting and Performance Analytics&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=ab8caae1dbd0dbc01dcaf3231f961913&quot; rel=&quot;noopener&quot;&gt;Best practices for creating responsive dashboards&lt;/a&gt; 12/8/17&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community/?id=community_blog&amp;amp;sys_id=018d2669dbd0dbc01dcaf3231f9619aa&quot; rel=&quot;noopener&quot;&gt;Best practices for creating and sharing reports&lt;/a&gt; 8/11/17&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;security-operations&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#security-operations&quot; class=&quot;heading-anchor&quot;&gt;Security Operations&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=f8b5b4efdb48f3804819fb2439961900&quot; rel=&quot;noopener&quot;&gt;Leverage sightings searches to gauge and crush phishing and malware attacks&lt;/a&gt; 5/14/19&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=fa6eff4ddb58b3841cd8a345ca961918&quot; rel=&quot;noopener&quot;&gt;How to get the Latest Security Operations and GRC Applications on Your Instance&lt;/a&gt; 3/25/19&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=0478e869db03a3409a64e15b8a9619d7&quot; rel=&quot;noopener&quot;&gt;Getting started with Security Incident Response on the Now Platform&lt;/a&gt; 1/24/19&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=da5c0491dba3d3049d612926ca9619a4&quot; rel=&quot;noopener&quot;&gt;3 NEW features in Security Operations will change how you work in London&lt;/a&gt; 7/27/18&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=34650042dbc693c0b61ff3231f961902&quot; rel=&quot;noopener&quot;&gt;Vulnerability Response 101—Understanding Vulnerability Response with ServiceNow&lt;/a&gt; 5/18/18&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;for-more-information&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/dawn-jureks-great-list-of-best-practices/#for-more-information&quot; class=&quot;heading-anchor&quot;&gt;For more information:&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=1e7c5592db8e53047b337a9e0f96193e&quot; rel=&quot;noopener&quot;&gt;Links to all NOWsupport resources&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenow.com/success.html&quot; rel=&quot;noopener&quot;&gt;ServiceNow Customer Success Center&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=c6e2eb55dbe92300656a5583ca96199e&quot; rel=&quot;noopener&quot;&gt;Want product updates and answers to your questions? Check out our Deskside Chats video series!&lt;/a&gt; 11/9/18&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>How to revert a bunch of records</title>
      <link href="https://jace.pro/blog/how-to-revert-a-bunch-of-records/" />
      <updated>2019-07-09T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-revert-a-bunch-of-records/</id>
      <content type="html">
				&lt;p&gt;Today I was tasked with reverting ~2k stories states to the past value. This is a daunting task as it requires someone to look at the &lt;code&gt;sys_audit&lt;/code&gt;&amp;nbsp;or&amp;nbsp;&lt;code&gt;sys_history_line&lt;/code&gt;&amp;nbsp;tables. The code I wrote was a quick fix, but I think others might find it useful.&lt;/p&gt;&lt;p&gt;Without any delay here it is;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; stories &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;rm_story&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; query &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;closed_by=eb8562c6b52c3000bb05d180e2312616^&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
query &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sys_updated_onONToday@javascript:gs.beginningOfToday()@javascript:gs.endOfToday()^&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
query &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;state=3&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
stories&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;query&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
stories&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;stories&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// for each record&lt;/span&gt;
  gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;in story: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; stories&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;number&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; storyID &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; stories&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// look up the last audit record for the state field&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; audit &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_audit&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;documentkey&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;storyID&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;fieldname&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;state&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;orderByDesc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;record_checkpoint&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setLimit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;oldvalue &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;=&amp;gt; &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;newvalue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    stories&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;state&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;oldvalue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;setting state to &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; stories&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    stories&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Knowledge 19 Hackathon, a personal look</title>
      <link href="https://jace.pro/blog/knowledge-19-hackathon-a-personal-look/" />
      <updated>2019-05-21T00:00:00Z</updated>
      <id>https://jace.pro/blog/knowledge-19-hackathon-a-personal-look/</id>
      <content type="html">
				&lt;p&gt;In my last post I said, “The hackathon is a great place to learn a new feature but it’s not a hackathon. They expect you to have the app prebuilt before you get there.” I just want to be very clarify in this post.&lt;/p&gt;&lt;p&gt;I learned a lot from the hackathon, but what they want is not a hackathon.&lt;/p&gt;&lt;p&gt;I’ll recap the events up until we left.&lt;/p&gt;&lt;h1 id=&quot;week-of-april-22nd&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-hackathon-a-personal-look/#week-of-april-22nd&quot; class=&quot;heading-anchor&quot;&gt;Week of April 22nd&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I reviewed all past Knowledge hackathons I could find and aggregated them on my &lt;a href=&quot;https://blog.jace.pro/post/2019-04-22-knowledge-hackathon-past/&quot; rel=&quot;noopener&quot;&gt;blog&lt;/a&gt;. Trying to get some ideas for what might be a winning idea if executed properly.&lt;/p&gt;&lt;h1 id=&quot;week-of-april-29th&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-hackathon-a-personal-look/#week-of-april-29th&quot; class=&quot;heading-anchor&quot;&gt;Week of April 29th&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I finally get some ideas worth anything down on paper so I don’t have to go without an idea. I am really excited about this. A past co-worker of mine Kevin, found out he’s going to K19, cause I found a unused ticket. So that’s awesome, I have a hackathon team and I have some decent ideas. I lay out some tasks for each idea.&lt;/p&gt;&lt;h1 id=&quot;may-6th&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-hackathon-a-personal-look/#may-6th&quot; class=&quot;heading-anchor&quot;&gt;May 6th&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I arrive in Vegas, it’s great. I meet up with some colleagues and get checked in. Also was given access to the “HackNow” instance. Seems security isn’t that important here so all the past submissions all exist. I’ll export that and include link at the bottom.&lt;/p&gt;&lt;h1 id=&quot;may-7th&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-hackathon-a-personal-look/#may-7th&quot; class=&quot;heading-anchor&quot;&gt;May 7th&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I see my hackathon team mates getting coffee. We talk about the ideas and pick one. Great. We do some morning labs and then meet up at the CreatorCon hackathon area. Thirty minutes after the start of the event we get our instance. Great.&lt;/p&gt;&lt;p&gt;The idea we are working on is this “LendIt” app. Using the new mobile interface allows users/ groups to indicate they have things to lend out, and if lent, who it’s lent to. Pretty simple idea but you could apply this to whatever at work or if part of group of neighbors could be something to facilitate passing around a leaf blower, or other lawn equipment.&lt;/p&gt;&lt;p&gt;Our tasks as we see them;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Build the table for the things to be lent.&lt;/li&gt;&lt;li&gt;Build a table to allow people to queue for things to be lent later.&lt;/li&gt;&lt;li&gt;Build table to support who has borrowed the thing.&lt;/li&gt;&lt;li&gt;Make some rules to control the availability and to process the queue&lt;/li&gt;&lt;li&gt;Make a Mobile App&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now we can do a lot of this stuff at the same time and so I take on the Mobile App stuff and the other two work out the business rules and table structure.&lt;/p&gt;&lt;h2 id=&quot;the-first-problem&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-hackathon-a-personal-look/#the-first-problem&quot; class=&quot;heading-anchor&quot;&gt;The first problem&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I am working on this and creating the stuff only to find that when I save the Mobile App nothing seems to be committing to the database. So after about an hour and half of banging my head on the table I get up and walk over to the “Mobile” experts and show them what’s happening. They are perplexed and bring me to another expert who has me check my version. Low and behold we found the problem. We’re not on Madrid. We’re on some beta unnamed version with a build tag of “glide-trackhinext-12-11-2015” and a build date of “11-13-2018_1928”. Well Madrid wasn’t done then and the Mobile stuff wasn’t working by then.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/X1qmPFK_D--650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/X1qmPFK_D--650.jpeg&quot; alt width=&quot;650&quot; height=&quot;190&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;the-recovery&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-hackathon-a-personal-look/#the-recovery&quot; class=&quot;heading-anchor&quot;&gt;The recovery&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;So we export our work to&amp;nbsp;&lt;a href=&quot;https://github.com/jacebenson/lendIt&quot; rel=&quot;noopener&quot;&gt;git&lt;/a&gt;&amp;nbsp;and we move to one of our Madrid PDI’s. We all have a “happy hour” we have to go to with our work stuff and that’s two hours. When we all get back we’re refreshed and good to go. I’ve taken a sorta leader role, Kevin and Joe have taken more of the “Can Do” attitude. We get it all working and then one of the judges comes by to check out our work. It must be near the end of the night, but by the time he’s come by and we’ve given a pretty poor explanation of this, and shown what we have. He in other words tells us it’s just the platform and not at the level of the other teams, but he doesn’t use those words. Nope, instead what we took from it was, it was a waste of his time, and everyone else time. Looking back on it, it reminds me to the statement made in&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=wKjxFJfcrcA&quot; rel=&quot;noopener&quot;&gt;Billy Madison&lt;/a&gt;. Rightly offended, we pack up our shit and leave.&lt;/p&gt;&lt;p&gt;At a bar about 20 minutes later we realize you know we got more out of this than any other lab and it was a good experience. No reason to let Chris get us down. So that’s the last hackathon I’ll be in at a knowledge event.&lt;/p&gt;&lt;h2 id=&quot;afterword&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-hackathon-a-personal-look/#afterword&quot; class=&quot;heading-anchor&quot;&gt;Afterword&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;It’s been a few weeks now and I didn’t want to write this while frustrated in the moment. I still feel the same way I did the night of. Thanks! Now I know. The&amp;nbsp;&lt;strong&gt;hackathon&lt;/strong&gt;&amp;nbsp;isn’t a hackathon at the knowledge events. It’s a “Did you bring something cool that we can make a product out of” event.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://jace.pro/post/2019-05-21-k19-hackathon-review/2019-app-list.xlsx&quot; rel=&quot;noopener&quot;&gt;Link of Ideas&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Notes from Knowledge 19</title>
      <link href="https://jace.pro/blog/notes-from-knowledge-19/" />
      <updated>2019-05-10T00:00:00Z</updated>
      <id>https://jace.pro/blog/notes-from-knowledge-19/</id>
      <content type="html">
				&lt;p&gt;I was very lucky to get to go to Knowledge19. Now that it’s over, before I leave I want to jot down my thoughts. Of the labs, I attended I had no technical difficulty with the WIFI or content. Others did, but somehow not me.&lt;/p&gt;&lt;p&gt;Below I’ll go over the parts I think notable.&lt;/p&gt;&lt;p&gt;Last year I went over the things to keep in mind, but here’s a link to the&amp;nbsp;&lt;a href=&quot;https://jace.pro/k18&quot; rel=&quot;noopener&quot;&gt;k18 post&lt;/a&gt;&amp;nbsp;for a refresher.&lt;/p&gt;&lt;p&gt;This year was different in that I was a speaker about the Meetups I help run. You can see the ones local to you&lt;br&gt;&lt;a href=&quot;https://www.meetup.com/pro/servicenowdevprogram/&quot; rel=&quot;noopener&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I got a lot out of this so I’ll get the boring bits out of the way;&lt;/p&gt;&lt;h2 id=&quot;registration&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#registration&quot; class=&quot;heading-anchor&quot;&gt;Registration&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Looks like they used&amp;nbsp;&lt;a href=&quot;http://g2planet.com/&quot; rel=&quot;noopener&quot;&gt;g2planet.com&lt;/a&gt;&amp;nbsp;again and this year it was better than last. This I thought was okay, but it could be improved. It also didn’t help that the schedule kept changing after I had been signed up for things.&lt;/p&gt;&lt;h2 id=&quot;mobile-app&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#mobile-app&quot; class=&quot;heading-anchor&quot;&gt;Mobile App&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This years app was much better. It could have been better but it worked for its purpose.&lt;/p&gt;&lt;h2 id=&quot;social-stuff&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#social-stuff&quot; class=&quot;heading-anchor&quot;&gt;Social Stuff&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This was great. I had been invited out to two nights out and met a ton of people. See &lt;a href=&quot;https://twitter.com/phxdev/status/1125984190359465985&quot; rel=&quot;noopener&quot;&gt;Twitter&lt;/a&gt;&amp;nbsp;for more details. Drai’s party was pretty great. A bit loud, but that’s expected being a night club and all.&lt;/p&gt;&lt;h2 id=&quot;things-learned-from-networking&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#things-learned-from-networking&quot; class=&quot;heading-anchor&quot;&gt;Things learned from networking&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;WeWork bought&amp;nbsp;&lt;a href=&quot;http://meetup.com/&quot; rel=&quot;noopener&quot;&gt;meetup.com&lt;/a&gt;&amp;nbsp;and does free hosting for paid meetups&lt;/li&gt;&lt;li&gt;ServiceNow is upping Flow Designer free transactions to 1 Million&lt;/li&gt;&lt;li&gt;No one is happy with the new licensing model with Madrid&lt;/li&gt;&lt;li&gt;I found 14 unused #know19 passes this year. Next year I’m going to try to do something with that.&lt;/li&gt;&lt;li&gt;The hackathon is a great place to learn a new feature but it’s not a hackathon. They expect you to have the app prebuilt before you get there.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;labs&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#labs&quot; class=&quot;heading-anchor&quot;&gt;Labs&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;ccw1630-extension-points-how-to-get-other-developers-to-improve-your-app&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#ccw1630-extension-points-how-to-get-other-developers-to-improve-your-app&quot; class=&quot;heading-anchor&quot;&gt;CCW1630 Extension points: How to get other developers to improve your app&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;@pheedbaq is the man behind this lab. It was really well done. He had us update a bike borrowing application. I don’t think I can properly explain this but, in short this is what I think it is. A better way to let others replace code in a scope.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/app.do#!/event/knowledge19/CCW1630&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=5c66ef9cdb9d3b0422e0fb2439961903&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccb1089-making-the-most-of-the-servicenow-mid-server&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#ccb1089-making-the-most-of-the-servicenow-mid-server&quot; class=&quot;heading-anchor&quot;&gt;CCB1089 Making the most of the ServiceNow MID Server&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This was amazing and performed by Mark Scott. I’m not sure how much he practiced it, but he came off like a pro. This talk checked all the boxes in my opinion.&lt;/p&gt;&lt;p&gt;It was Entertaining, Educational, and Actionable. Not to mention he used R to determine if a photo is a hotdog or not a hotdog just like they did in Silicon Valley on HBO.&lt;/p&gt;&lt;p&gt;In my opinion this was the best session I went to. (If you all have a recording of this on YouTube let me know and I’ll add a link.)&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=6246e75cdb9d3b0422e0fb2439961979&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccb1419-servicenow-developer-meetup-and-community-building&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#ccb1419-servicenow-developer-meetup-and-community-building&quot; class=&quot;heading-anchor&quot;&gt;CCB1419 ServiceNow Developer Meetup and community Building&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This was a really open discussion between&amp;nbsp;&lt;a href=&quot;https://www.meetup.com/RDU-ServiceNow-Developer-Meetup/members/215745765/profile/&quot; rel=&quot;noopener&quot;&gt;Andrew Barnes&lt;/a&gt;, &lt;a href=&quot;https://www.meetup.com/Orlando-ServiceNow-Developer-Meetup/members/212809016/profile&quot; rel=&quot;noopener&quot;&gt;Lily Li&lt;/a&gt;, &lt;a href=&quot;https://www.meetup.com/South-Florida-ServiceNow-Developer-Meetup/members/189027559/profile/&quot; rel=&quot;noopener&quot;&gt;Todd Volpe&lt;/a&gt;, &lt;a href=&quot;https://www.meetup.com/Munchen-ServiceNow-Developer-Meetup/members/203263765/profile/&quot; rel=&quot;noopener&quot;&gt;Melhem El-Achkar&lt;/a&gt;, and&amp;nbsp;&lt;a href=&quot;https://www.meetup.com/Sao-Paulo-ServiceNow-Developer-Meetup/members/189217600/profile/&quot; rel=&quot;noopener&quot;&gt;Fernando Luiz Goulart&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It was great. We all introduced ourselves and talked about the struggles and the best way to do things in the meetup. I had been due to talk on the 1st floor 1/2 way through this talk. One of the attendees followed me down and I met her after my talk. She’s from Mexico and wants to have one in her area. I hope it starts up. I’d love to go and see it happen.&lt;/p&gt;&lt;h3 id=&quot;bre1340-a-city-in-the-cloud-how-minneapolis-is-driving-digital-transformation-on-the-now-platform&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#bre1340-a-city-in-the-cloud-how-minneapolis-is-driving-digital-transformation-on-the-now-platform&quot; class=&quot;heading-anchor&quot;&gt;BRE1340 - A city in the cloud: How Minneapolis is driving digital transformation on the Now Platform&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I lived in Minneapolis and know the speaker and some of the developers who did a lot of the work featured in this talk.&lt;/p&gt;&lt;p&gt;I just have this to say about the talk. Gina F. did a great job! I loved the slide where you could here her passion for the city.&lt;/p&gt;&lt;p&gt;Also all the business problems they solved were amazing.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=4846235cdb9d3b0422e0fb24399619e2&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccdt0335-influence-and-learn-by-running-a-local-developer-meetup&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#ccdt0335-influence-and-learn-by-running-a-local-developer-meetup&quot; class=&quot;heading-anchor&quot;&gt;CCDT0335 - Influence and learn by running a local developer Meetup&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I had practiced this talk a few times and was fortunate enough to have a lot of support in the audience. Thanks;&lt;/p&gt;&lt;p&gt;Lida, Jarod M, Anna Baker, Casey, Kevin Karyadi, Will Weaver, Stephen Phayre., and Andrew Colson&lt;/p&gt;&lt;p&gt;I ran too fast but there were plenty of time for questions and there were a number of great questions.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=d246a75cdb9d3b0422e0fb24399619a5&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccw1547-full-stack-adventures-in-servicenow-land-part-one&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#ccw1547-full-stack-adventures-in-servicenow-land-part-one&quot; class=&quot;heading-anchor&quot;&gt;CCW1547 – Full-stack adventures in ServiceNow-land: part one&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This lab was a large lab. A lot of content to make your way through.&lt;br&gt;However it is a lab where you make end to end peer review application.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/app.do#!/event/knowledge19/CCW1547&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=b3462f5cdb9d3b0422e0fb2439961953&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccb0433-under-the-hood-of-flow-designer-and-integrationhub-with-the-engine-developers&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#ccb0433-under-the-hood-of-flow-designer-and-integrationhub-with-the-engine-developers&quot; class=&quot;heading-anchor&quot;&gt;CCB0433 Under the hood of Flow Designer and IntegrationHub with the engine developers&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I’ve been a big advocate that instead of flow designer ServiceNow should have improved the workflow engine. With that being said that isn’t happening.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Don’t use gs sleep&lt;/li&gt;&lt;li&gt;Don’t do looping delay anti patterns&lt;/li&gt;&lt;li&gt;Understand that flows aren’t versioned like workflows&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;labs-i-need-to-check-out-yet&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#labs-i-need-to-check-out-yet&quot; class=&quot;heading-anchor&quot;&gt;Labs I need to check out yet&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;ccdt1827-advanced-gliderecord-techniques&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#ccdt1827-advanced-gliderecord-techniques&quot; class=&quot;heading-anchor&quot;&gt;CCDT1827 Advanced GlideRecord Techniques&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=7e66abdcdb9d3b0422e0fb243996190d&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;lab1413-quickly-implement-an-awesome-walk-up-service-channel-for-improved-employee-experience&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#lab1413-quickly-implement-an-awesome-walk-up-service-channel-for-improved-employee-experience&quot; class=&quot;heading-anchor&quot;&gt;LAB1413 Quickly implement an awesome walk-up service channel for improved employee experience&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/app.do#!/event/knowledge19/LAB1413&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=b056639cdb9d3b0422e0fb243996193d&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;lab1542-probe-to-pattern-migration&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notes-from-knowledge-19/#lab1542-probe-to-pattern-migration&quot; class=&quot;heading-anchor&quot;&gt;LAB1542 Probe to pattern migration&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/app.do#!/event/knowledge19/LAB1542&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=6866ef9cdb9d3b0422e0fb24399619c2&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Winning ServiceNow Hackathon Ideas</title>
      <link href="https://jace.pro/blog/winning-servicenow-hackathon-ideas/" />
      <updated>2019-04-22T00:00:00Z</updated>
      <id>https://jace.pro/blog/winning-servicenow-hackathon-ideas/</id>
      <content type="html">
				&lt;p&gt;This year I’m fortunate enough to go to knowledge, and one of my favorite SN people, Robert Fedoruk, posted a&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=ctzX-ANG_Sk&amp;amp;feature=youtu.be&quot; rel=&quot;noopener&quot;&gt;YouTube video about winning hackathons&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In the spirit of sharing I’m adding a list I compiled after some searching to see what’s won before as it wasn’t aggregated anywhere I could see. I’d love to see these shared in an open way afterwards. If this makes the competition better, than that’s great and my goal here. Below is that list.&lt;/p&gt;&lt;h1 id=&quot;knowledge-things&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/winning-servicenow-hackathon-ideas/#knowledge-things&quot; class=&quot;heading-anchor&quot;&gt;Knowledge Things&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=c15d2629dbd0dbc01dcaf3231f961987&quot; rel=&quot;noopener&quot;&gt;How to win a hackathon&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;2013&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/winning-servicenow-hackathon-ideas/#2013&quot; class=&quot;heading-anchor&quot;&gt;2013&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20130831022442/http://community.servicenow.com/blog/allanleinwand/createnow-hackathon-check-out-finalist-teams-apps&quot; rel=&quot;noopener&quot;&gt;Post&lt;/a&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Place&lt;/th&gt;&lt;th&gt;App&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Winner&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/NSWwunAHhjA&quot; rel=&quot;noopener&quot;&gt;KickITnow (video)&lt;/a&gt;&lt;/td&gt;&lt;td&gt;A kind-of “corporate KickStarter” for incubating projects within an enterprise&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;TableNOW&lt;/td&gt;&lt;td&gt;a restaurant reservation application that finds nearby restaurants and displays their locations, menus, and availability. And processes reservations, of course.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;CasiNOW&lt;/td&gt;&lt;td&gt;a blackjack gambling web site that lets users buy coins for play, interact with one another, read rules and FAQs, report issues, and submit questions.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;PictionNOW&lt;/td&gt;&lt;td&gt;a variant on the popular party game “Pictionary” that replaces that game’s manual drawing tools with an electronic tablet. The pair used HTML5 to add a “canvas element” to the ServiceNow Content Management System (CMS), and wrote driver software to link the tablet with the ServiceNow platform.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;2014&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/winning-servicenow-hackathon-ideas/#2014&quot; class=&quot;heading-anchor&quot;&gt;2014&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=a76caea1dbd0dbc01dcaf3231f961993&quot; rel=&quot;noopener&quot;&gt;Post&lt;/a&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Place&lt;/th&gt;&lt;th&gt;App&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Winner&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://vimeo.com/96734925&quot; rel=&quot;noopener&quot;&gt;SchoolHub (video)&lt;/a&gt;&lt;/td&gt;&lt;td&gt;App to structure the interaction between teachers (give assignments and grades), faculty (biographies, tracking attendance), parents (check the grades, fill out all kinds of forms — absence, dietary, holiday requests) and students (survey teachers, get assignments)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;SociaLoop&lt;/td&gt;&lt;td&gt;a Social Media Campaign Management application, enabling organizations to activate all employees around social media.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;Password Vault&lt;/td&gt;&lt;td&gt;The app generates a secured password and we use orchestration to make the change a reality. The credentials are encrypted and we use Access Control List (ACL) to make sure you see only the credentials that you are supposed to see in your role.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;MudMonsters&lt;/td&gt;&lt;td&gt;“We have 35 locations, 12 monsters, many items in there,” Scott explained. “We use business rules to govern the behavior of all elements. The business rules trigger events based off of the text body in the commands. You win when you reach the final destination. If you loose, you go back to square one and you loose all items.”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;CableCarNow&lt;/td&gt;&lt;td&gt;The world famous cable cars of San Francisco are always full and the queues at the stops are way too long. “So the city needs a solution and it needs it fast.”&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;2015&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/winning-servicenow-hackathon-ideas/#2015&quot; class=&quot;heading-anchor&quot;&gt;2015&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=0a3daae5dbd0dbc01dcaf3231f9619f9&quot; rel=&quot;noopener&quot;&gt;Post&lt;/a&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Place&lt;/th&gt;&lt;th&gt;App&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Winner&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/Kpgqp1otikY?t=54&quot; rel=&quot;noopener&quot;&gt;FEMA Victim Assistance (cube talk video)&lt;/a&gt;&lt;/td&gt;&lt;td&gt;ServiceNow Saving Lives. It will be something very special.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;Cinema food ordering&lt;/td&gt;&lt;td&gt;App that would allow movie audience to scan a QR code on their seat, complete and submit an order and have it delivered to their seat.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;C’est Ne Paas (Robot)&lt;/td&gt;&lt;td&gt;Nuclear Disaster as a Service - This application would enable disaster recovery teams to send a robot into a disaster area and have it execute a task.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;Social networking management&lt;/td&gt;&lt;td&gt;Managing posts to Twitter&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;On-call scheduling&lt;/td&gt;&lt;td&gt;No Details&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;2016&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/winning-servicenow-hackathon-ideas/#2016&quot; class=&quot;heading-anchor&quot;&gt;2016&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=26ac6625dbd0dbc01dcaf3231f96191d&quot; rel=&quot;noopener&quot;&gt;Post&lt;/a&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Place&lt;/th&gt;&lt;th&gt;App&lt;/th&gt;&lt;th&gt;Category&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.linium.com/research/news-updates/vote-team-smiles-to-win-servicenow-knowledge16-hackathon&quot; rel=&quot;noopener&quot;&gt;Happiness Service&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Innovation&lt;/td&gt;&lt;td&gt;app that brings together kids awaiting organ transplants and people who want to grant their wish and donate money.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=4MbyvYW_bvk&amp;amp;feature=youtu.be&quot; rel=&quot;noopener&quot;&gt;LifeNow&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Platform&lt;/td&gt;&lt;td&gt;app for employee health tracking with wearables, and gamification for challenges and points redemption for fitness products&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;Create Doc&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=jP99ityPijU&amp;amp;feature=youtu.be&quot; rel=&quot;noopener&quot;&gt;Demo&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=FCUpDKi8tnY&quot; rel=&quot;noopener&quot;&gt;Product&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Business&lt;/td&gt;&lt;td&gt;app that automates document creation and management directly in ServiceNow&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;2017&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/winning-servicenow-hackathon-ideas/#2017&quot; class=&quot;heading-anchor&quot;&gt;2017&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=193daae5dbd0dbc01dcaf3231f96193d&quot; rel=&quot;noopener&quot;&gt;Post&lt;/a&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Place&lt;/th&gt;&lt;th&gt;App&lt;/th&gt;&lt;th&gt;Category&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://thewhitespace.io/blog/knowledge17-hackathon-greenlight/&quot; rel=&quot;noopener&quot;&gt;GreenLight&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Business&lt;/td&gt;&lt;td&gt;Presented a visualization of the carbon footprint of an enterprise. This functional visualization also allows users to actually manage and alter working elements and affect the energy consumption rates of the customer using it.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/CloudPires/LUDI&quot; rel=&quot;noopener&quot;&gt;LUDI - Voice Controlled&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Innovation&lt;/td&gt;&lt;td&gt;a voice integration application function into ServiceNow using the native voice recognition that ships as standard with the Google Chrome browser.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;GiveNow&lt;/td&gt;&lt;td&gt;Social Good&lt;/td&gt;&lt;td&gt;Enables companies to connect their employees with opportunities to volunteer in their communities&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;2018&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/winning-servicenow-hackathon-ideas/#2018&quot; class=&quot;heading-anchor&quot;&gt;2018&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=2213cba6dbbd13002b6dfb651f9619b1&quot; rel=&quot;noopener&quot;&gt;Post&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=CkzSssZCJTo&quot; rel=&quot;noopener&quot;&gt;CreatorCon Hackathon 2018 Winners Webinar&lt;/a&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Place&lt;/th&gt;&lt;th&gt;Team&lt;/th&gt;&lt;th&gt;App&lt;/th&gt;&lt;th&gt;Category&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.apnews.com/13a8fbf57e3500578146b42e597f40a0&quot; rel=&quot;noopener&quot;&gt;Team Vocalize&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=-Lp9NNPFitY&quot; rel=&quot;noopener&quot;&gt;Video&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Innovation&lt;/td&gt;&lt;td&gt;Sentiment analyses of support conversations. Based on quality of sentiment metrics, you can assign actions and tasks to prioritize follow up on conversations.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Team Appoxio&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=CkzSssZCJTo&quot; rel=&quot;noopener&quot;&gt;KSafeNow&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Social Good&lt;/td&gt;&lt;td&gt;Student Tracker&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://pathwayscg.com/&quot; rel=&quot;noopener&quot;&gt;Team Scrantonicity&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=qTOJSro9tBY&quot; rel=&quot;noopener&quot;&gt;NeutreNow&lt;/a&gt;&lt;/td&gt;&lt;td&gt;business&lt;/td&gt;&lt;td&gt;App NeutreNow to incentive healthy behavior (scroll down for full review). Tracks calory intake and calories burnt&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;2019-hackathon&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/winning-servicenow-hackathon-ideas/#2019-hackathon&quot; class=&quot;heading-anchor&quot;&gt;2019 Hackathon&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://blogs.servicenow.com/2019/servicenow-hackathon-winners-2019.html&quot; rel=&quot;noopener&quot;&gt;Post&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=5d66e3dcdb9d3b0422e0fb243996192a&quot; rel=&quot;noopener&quot;&gt;CreatorCon Hackathon winners&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=1U-XCylkk54&quot; rel=&quot;noopener&quot;&gt;Video of winner&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Place&lt;/th&gt;&lt;th&gt;Team&lt;/th&gt;&lt;th&gt;App&lt;/th&gt;&lt;th&gt;Category&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Team Scrantonicity&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=1U-XCylkk54&quot; rel=&quot;noopener&quot;&gt;Reizen by Pathways&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=5d66e3dcdb9d3b0422e0fb243996192a&quot; rel=&quot;noopener&quot;&gt;@23:37&lt;/a&gt;&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;td&gt;ServiceNow app that tracks travel expenses.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.drtstrategies.com/drt-it-smes-team-wins-2nd-place-in-servicenow-creatorcon-hackathon/&quot; rel=&quot;noopener&quot;&gt;Above the Line&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Cardio&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=5d66e3dcdb9d3b0422e0fb243996192a&quot; rel=&quot;noopener&quot;&gt;@01:29&lt;/a&gt;&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;td&gt;Taking advantage of the fact that Virtual Agent can be set up to be public facing, the runner-up team created an app that automates customer identification for the process of renting or checking out cars.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Superconnectors&lt;/td&gt;&lt;td&gt;Expand Contact Center Workforce&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=5d66e3dcdb9d3b0422e0fb243996192a&quot; rel=&quot;noopener&quot;&gt;@13:26&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Social Good&lt;/td&gt;&lt;td&gt;To create more accessibility for the hearing impaired to work in call center environments, Superconnectors created an app that leverages Service Portal and a web browser’s speech API to convert a customer’s voice to text. It then converts the service agent’s typed reply back into synthesized speech.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;2020&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/winning-servicenow-hackathon-ideas/#2020&quot; class=&quot;heading-anchor&quot;&gt;2020&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://blogs.servicenow.com/2020/knowledge-2020-hackathon-winners.html&quot; rel=&quot;noopener&quot;&gt;Post&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/blog.do?p=/post/creatorcon-hackathon-2020-review/&quot; rel=&quot;noopener&quot;&gt;Dev Post&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=wKPg08-9UH0&quot; rel=&quot;noopener&quot;&gt;Video&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Place&lt;/th&gt;&lt;th&gt;Team&lt;/th&gt;&lt;th&gt;App&lt;/th&gt;&lt;th&gt;Category&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Volteoans&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://drive.google.com/file/d/1hsys4ccOPi77W1QLqU_vSvc2ugF79nQG/view&quot; rel=&quot;noopener&quot;&gt;Clinical Care Management&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Healthcare&lt;/td&gt;&lt;td&gt;The Clinical Care Management (CCM) app provides an end-to-end digital clinical care system that helps healthcare teams gather patient medical histories.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;Sopra Steria&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://drive.google.com/open?id=1TlxGUekDeMlFx7Roe255iiqfS6MLuWot&quot; rel=&quot;noopener&quot;&gt;JetVet&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Banking&lt;/td&gt;&lt;td&gt;JetVet helps streamlines due diligence processes in procurement. The goal is to prevent corruption and unethical practices in an organization’s supply chain.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;World Class Wrakin’ Cru&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_video&amp;amp;sys_id=01ffcc38db7458502be0a851ca96197c&quot; rel=&quot;noopener&quot;&gt;KICK: Key Items Crisis Kit&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Manufacturing&lt;/td&gt;&lt;td&gt;KICK helps organizations source personal protective equipment. The app manages supply to meet emergency demand during crises like COVID-19.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;Extra Crispy Stimulus Package&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://drive.google.com/drive/folders/1P9sppJqgjf5l5ij4-327xrqjrceGM6BV?usp=sharing&quot; rel=&quot;noopener&quot;&gt;Zoom: Extra Crispy&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Telecom&lt;/td&gt;&lt;td&gt;This app helps make Zoom meetings more productive. Zoom Extra Crispy uses Predictive Intelligence, Performance Analytics and Integration Hub features in the Now Platform to intake all recordings from the Zoom cloud and create knowledge article transcripts.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;NewRocket&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_video&amp;amp;sys_id=a0867724db3854504819fb2439961989&quot; rel=&quot;noopener&quot;&gt;Reach&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Social Good&lt;/td&gt;&lt;td&gt;In stressful conditions like the current pandemic, it can be very difficult to find reliable information and access critical resources locally. The Reach app uses personalization and the ServiceNow CSM app to create a dynamic personalized hub that offers access to local data and resources. Reach can be customized and used by cities of any size.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;Click to Win&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/vEUxMH58Kvc&quot; rel=&quot;noopener&quot;&gt;AdVenture Manufaturist&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Manufacturing&lt;/td&gt;&lt;td&gt;AdVenture Manufacturist is a simulation application where a user can rapidly acquire different manufacturing assets to increase revenue while balancing the enhancement of existing assets.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;The Mighty Hacks&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/ne8B2VqJGLE&quot; rel=&quot;noopener&quot;&gt;Annexus&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Social Good&lt;/td&gt;&lt;td&gt;The vision is to build a social mobile experience that connects people across video &amp;amp; voice to create a virtual community based on their interests.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;Green Dot&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.dropbox.com/s/k9ka2baat3lxyby/CareNow%20-%20Team%20Green%20Dot.mp4?dl=0&quot; rel=&quot;noopener&quot;&gt;CareNow&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Healthcare&lt;/td&gt;&lt;td&gt;CareNow - is a Smarter way to standardise quality home care.B CareNow application aims to improve the quality of in-home care (using features like intelligent assignment, ability to raise care requests, monitoring integration, etc.), address isolation issues faced by care recipient and provide a performance monitoring system for Health care providers and regulatory body.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;Team Scrantonicity&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://pathwayscg.sharefile.com/d-sf2daf96fec94f0c9&quot; rel=&quot;noopener&quot;&gt;Connected Community&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Social Good&lt;/td&gt;&lt;td&gt;The Connected Community application serves two purposes: Connecting parties offering charitable goods or services with those who are accepting them and helping to coordinate public events related to charity and public well-being. This has value for not only the community, but also as positive PR for the businesses that host or partake in using the application.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;Carnav&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=XZMr3LG6wEk&quot; rel=&quot;noopener&quot;&gt;EcoNow&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Social Good&lt;/td&gt;&lt;td&gt;Organizations want to show their support to promote social good in a consistent and continuous way. Empower your employees to launch and coordinate social good initiatives and promote this actions within the company to get support from other fellow employees to make actions for a better community and world.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;Brahmasthra&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=k2-9JSapdXA&quot; rel=&quot;noopener&quot;&gt;Healthcare Service Management (HSM)&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Healthcare&lt;/td&gt;&lt;td&gt;Our solution helps in covering end to end hospital services. As an end user (Patient) all you must do is download an app and book appointments/pay bill/Know the medication details. Used all latest features like now mobile app, Agent Work space, Flow Designer, Virtual Agent, scoped application b Studio Development, Integration with Twilio.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;ZeTechno-Sailors&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/v54XMiRyefE&quot; rel=&quot;noopener&quot;&gt;MedicoNOW-Connect Better&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Healthcare&lt;/td&gt;&lt;td&gt;“MedicoNow app is built to provide better communication between healthcare specialists and patients. The app provides an end to end experience for patients and specialists to view/book appointments, connect via chat/VIDEO, join in social Q/A community. Works on both, large and on mobile devices.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;The Down Underscores&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=WlVHE1ZM4GE&quot; rel=&quot;noopener&quot;&gt;Resus Runner&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Healthcare&lt;/td&gt;&lt;td&gt;In todays world, our hospital emergency wards are experiencing an unprecedented level of strain. In cases where patients need to be resuscitated, our emergency doctors and nurses face a high-stress and fast-moving environment where they need simple ways to track and document the actions they take in real-time - whether this is performing CPR, administering medication or taking notes and observations about a resuscitation event. As our hospitals are stretched and new staff brought on board to deal with the increased pressure caused by COVID-19, we need better ways to bring people up to speed with understanding the processes as quickly as possible. Historically many emergency wards have used pen and paper to document these resuscitation events, often needing to recreate the timeline of actions after the fact. Digitizing and simplifying these processes can help our Medical workers to focus more on caring for their patients, and less on maintaining paperwork.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;2021&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/winning-servicenow-hackathon-ideas/#2021&quot; class=&quot;heading-anchor&quot;&gt;2021&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;A mobile-friendly platform to attend virtual classes. A better way to stream interactive online events. A system that allows office employees to order and receive supplies from drones. These are among the best ideas to emerge from the Knowledge 2021 CreatorCon Hackathon, held May 8-9.&lt;br&gt;The hackathon serves as a forum for coders to design and display innovative apps on the Now Platform that can solve real business problems.&lt;br&gt;This year, more than 100 teams competed in the hackathon. ServiceNow judges for the event—including a vice president of platform product management, senior product managers, staff engineers, and developer advocates—selected four finalists and the Grand Prize winner, as well as five targeted award winners. The Grand Prize-winning team received Oculus Quest 2 virtual reality headsets and Bose Bluetooth headphones.&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://blogs.servicenow.com/2021/creatorcon-2021-hackathon-winners.html&quot; rel=&quot;noopener&quot;&gt;Post&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/blog.do?p=/post/creatorcon-hackathon-2021-winners/&quot; rel=&quot;noopener&quot;&gt;Dev Post&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Place&lt;/th&gt;&lt;th&gt;Team&lt;/th&gt;&lt;th&gt;App&lt;/th&gt;&lt;th&gt;Category&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Winner&lt;/td&gt;&lt;td&gt;Hakuna Matata&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=w4xZWCgNsPM&quot; rel=&quot;noopener&quot;&gt;Virtual University&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Best Mobile Experience app&lt;/td&gt;&lt;td&gt;The app creates a single, easy-to-use platform for students, teachers, and administrators to manage their workloads and interactions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;Dev Without Hats&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FaMfClHR3HU&quot; rel=&quot;noopener&quot;&gt;Obsequio&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Best Now Experience app&lt;/td&gt;&lt;td&gt;This app creates a scalable, cloud-based system for desktop and mobile devices that allows users to report risk, safety, and compliance issues.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;PhilGoesDeep&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=b-fQIVFl4v4&quot; rel=&quot;noopener&quot;&gt;OBS Overlays with AES&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Best app started from AES&lt;/td&gt;&lt;td&gt;OBS Overlays with App Engine Studio&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;Arnav Solo&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=dlnXxWUMR3w&quot; rel=&quot;noopener&quot;&gt;SentinmentNow&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Using machine learning, this app helps companies monitor consumer interactions in real time and spot patterns that result in unhappy customers, such as lack of knowledge about a particular product or agent behavior that escalates disputes.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;Team Scrantonicity&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=4bWxRz0ufwY&quot; rel=&quot;noopener&quot;&gt;RAID&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Most compelling IntegrationHub spoke&lt;/td&gt;&lt;td&gt;RAID (Request Automated In-office Delivery). With this app, workers can use the Amazon Alexa voice assistant to order office supplies or personal protective equipment such as masks and have a drone deliver those items right to their desk.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finalist&lt;/td&gt;&lt;td&gt;ServiceNow’s Gaming Division&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=9w_yimPFgBE&quot; rel=&quot;noopener&quot;&gt;Virtua Agent&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Best use of Now Intelligence&lt;/td&gt;&lt;td&gt;This app transformed the chatbot into a type of digital game show host that can enable messages from one user to another, moderate Q&amp;amp;As, and assign roles to users that dynamically change.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;Alpha Monksters&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=5MANTvFGYgg&quot; rel=&quot;noopener&quot;&gt;Back2School&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;What if we tell you that your day-to-day role as a student/teacher/parent would become much easier to manage by just a few configuration adjustments via cloud-based platform utilizing Mobile UI/Web Page UI as well a Chat UI? Furthermore, imagine leveraging this for universities with affiliated colleges through platform domain separation? Why stop there? Perhaps make it available for trainings in Corporate Industry?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;Volteoans&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://drive.google.com/file/d/1LNFE91PaJquWufCtwWUz2hvJEU1DG7PV/view&quot; rel=&quot;noopener&quot;&gt;ShipmentNow&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;ShipmentNow is a digital shipping management solution built on ServiceNow to make your enterprise shipment booking, tendering, tracking easier and efficient with simple configuration and automation.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;Les 3 FrC(res&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/2uorx8j668U&quot; rel=&quot;noopener&quot;&gt;SPORTal&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;SPORTal brings people together: Be Healthy, Be Social Pick your sport &amp;amp; participate in the events that suit you best.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;AECON&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://drive.google.com/file/d/18JZ4nUaFC1MJXG4XysxocxpIp1ZHcRg_/view&quot; rel=&quot;noopener&quot;&gt;LMS Now&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;This application will bridge the gap between HRs and employees by digitizing the leave tracker system - Will reduce management efforts. increase team productivity - Integrable application will ensure greater visibility towards organization KPIs, better project planning by the Project management department Cost management by payroll and invoicing departments wrt billable hours and non-billable hours IT department can take this as a feeder into the on-call scheduler and critical/priority task assignments&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;KMD - TalentLab&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/X2YZe16mDjU&quot; rel=&quot;noopener&quot;&gt;Extended User Profile&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;“Extended User Profile is a response to the lack of interaction at the workplace due to the worldwide shift to remote work. As colleagues hide behind their computer screens, they do not form close bonds with one another, which can lead to decreased motivation, worse results and low overall incentive. The introduction of Extended User Profile - highly customizable, interactive user profiles - can be a starting point towards better employee interactions, increased workplace visibility and company-wide initiatives. As a result, employees get to express themselves freely and proactively reach out to other colleagues that share their backgrounds and interests. Other functions include social media integration, visual effects, nicknames, and more.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;CG Squad&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://drive.google.com/drive/folders/1q6nlIFxc5YxSKqArFSVWMYuDrhuIDTYM&quot; rel=&quot;noopener&quot;&gt;Educator 3000&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Educator 3000 brings the power of the Now Platform to solving the issue of education during COVID-19. Students, Teachers, classes, courses, school work, and grades can now be managed and automated using the Now Platform giving the students and teacher the space to focus on what really matters.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;Auranx&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=6KZVwVfR4OU&quot; rel=&quot;noopener&quot;&gt;WantedApp&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;WantedApp makes the recruitement process easier by making all the different steps accessible from one toom (technical tests, HR meetings, etc.)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;Wampa SNOW Beasts&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://drive.google.com/file/d/1ZrgOpIk1Rrlovd0FQ609si_ZLCojA2vL/view&quot; rel=&quot;noopener&quot;&gt;LevelUp!&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;What is the purpose of the product for the business? Yes probably to make $ but speak to monetization, pricing strategy(s). Some products are about driving customer counts, some are competition blockers.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mentioned&lt;/td&gt;&lt;td&gt;Nuvolo&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/X-qkHRPbLk4&quot; rel=&quot;noopener&quot;&gt;ServiceNow Voice&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;“We are building a Smart Vernacular Video/Audio Conference Platform using ServiceNow Agents and UI form builder &amp;amp; Mobile Platform. It enable users too have conversation in any respective language &amp;amp; translate all Audio &amp;amp; text conversation on the fly. This will help users to have cross border support without worrying about language as a barrier. For the current business use case we will be implementing this solution to the health care domain, where information and knowledge can be shared across borders in real time. Doctors and Researchers can create their ServiceNow pages using UI builder, then they will be able to schedule a web conference call, where ServiceNow Agents api can help them to translate their voice on the fly.”&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>How to restart a workflow</title>
      <link href="https://jace.pro/blog/how-to-restart-a-workflow/" />
      <updated>2019-04-05T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-restart-a-workflow/</id>
      <content type="html">
				&lt;p&gt;Restarting a workflow is sometimes needed. I found myself looking at how&lt;br&gt;to to do this today.&lt;/p&gt;&lt;p&gt;I’m posting this so I don’t have to re-do this again.&lt;/p&gt;&lt;p&gt;There are 2 ways to restart workflows.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;No code.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Delete the workflow context record. I do this by going to the record in question. E.g.&amp;nbsp;&lt;code&gt;/sc_req_item.do?sysparm_query=number=RITM0012345&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Click into the “Show Workflow Context” UI Action Link (above the related lists)&lt;/li&gt;&lt;li&gt;Click Delete on the top right of the workflow context record !!! BE SURE YOU’RE ON THE WF_CONTEXT !!!&lt;/li&gt;&lt;li&gt;Goto the RITM and update the stage to&amp;nbsp;&lt;code&gt;request_approved&lt;/code&gt;&lt;/li&gt;&lt;li&gt;That’s it.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;With Code.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Delete the workflow context record. I do this by going to the record in question. E.g.&amp;nbsp;&lt;code&gt;/sc_req_item.do?sysparm_query=number=RITM0012345&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Click into the “Show Workflow Context” UI Action Link (above the related lists)&lt;/li&gt;&lt;li&gt;Click Delete on the top right of the workflow context record !!! BE SURE YOU’RE ON THE WF_CONTEXT !!!&lt;/li&gt;&lt;li&gt;Goto the&amp;nbsp;&lt;code&gt;wf_workflow.list&lt;/code&gt;&amp;nbsp;table and find the workflow you want to start, copy it’s&amp;nbsp;&lt;code&gt;sys_id&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Run this script in a background script;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_req_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;number&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;RITM0012345&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;cfe7a62f13958340f415345fd144b075&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//wf_workflow sys_id here&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; w &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Workflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; context &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;startFlow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;operation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; vars &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; n &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;variables&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
          vars&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;variables&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; vars&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Further Reading:&lt;br&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/madrid-application-development/page/app-store/dev_portal/API_reference/Workflow/concept/c_Workflow_api.html#r_WF-startFlow_String_GR_S_A&quot; rel=&quot;noopener&quot;&gt;https://docs.servicenow.com/bundle/sandiego-application-development/page/app-store/dev_portal/API_reference/Workflow/concept/c_Workflow_api.html#r_WF-startFlow_String_GR_S_A&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Advanced Reported with Related List Conditions</title>
      <link href="https://jace.pro/blog/advanced-reported-with-related-list-conditions/" />
      <updated>2019-03-20T00:00:00Z</updated>
      <id>https://jace.pro/blog/advanced-reported-with-related-list-conditions/</id>
      <content type="html">
				&lt;p&gt;The other day I was asked, “Hey, how can I find all the access controls with NO related roles?”&lt;/p&gt;&lt;p&gt;Reporting on the lack of something is really tough (generally). In this case though Related List Condition queries shine. You can access them in the report interface on ServiceNow.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Requirement&lt;/th&gt;&lt;th&gt;Suggested Approach&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CIs with more than 1 Active Incident&lt;/td&gt;&lt;td&gt;Related List Condition&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIs with no outages last month&lt;/td&gt;&lt;td&gt;Related List Condition&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Active Incidents with No Active Tasks&lt;/td&gt;&lt;td&gt;Related List Condition&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Incidents assigned to a manager&lt;/td&gt;&lt;td&gt;Related List Condition * / Scripted Filter + Dynamic Filter Option&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Users in my assignment groups with no active incidents assigned to them&lt;/td&gt;&lt;td&gt;Scripted Filter + Dynamic Filter Option&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Finding globally available things</title>
      <link href="https://jace.pro/blog/finding-globally-available-things/" />
      <updated>2019-03-13T00:00:00Z</updated>
      <id>https://jace.pro/blog/finding-globally-available-things/</id>
      <content type="html">
				&lt;p&gt;I was in the middle of restoring my PC and thought “I wonder if I can&lt;br&gt;view all the globally accessible things?”&lt;/p&gt;&lt;p&gt;Turns out, you can.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;thing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; type_of_thing &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;eval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;typeof &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; thing&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;type_of_thing &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;object&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; prop &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; thing&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;-: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; prop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;thing &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;eval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;typeof &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; thing&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;error&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In an out of box instance I get a big output. Alot of these are old&lt;br&gt;“Global Business Rules” but some are weird.&lt;/p&gt;&lt;h1 id=&quot;globally-available&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/finding-globally-available-things/#globally-available&quot; class=&quot;heading-anchor&quot;&gt;Globally available&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;SNString&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;[native code for String.String, arity=1]&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SNRegExp&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;RegExp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;[native code, arity=0]&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideArrayRecord&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Seems to work just like GlideRecord.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sys_meta&lt;/p&gt;&lt;ul&gt;&lt;li&gt;This is super interseting.&amp;nbsp;&lt;code&gt;sys_meta&lt;/code&gt;&amp;nbsp;has a property for every&lt;br&gt;table.&amp;nbsp;&lt;code&gt;sys_meta.sys_user&lt;/code&gt;&amp;nbsp;has a property for every field.&lt;br&gt;&lt;code&gt;sys_meta.sys_user.date_format&lt;/code&gt;&amp;nbsp;has then a property for the&lt;br&gt;sys_dictionary record. The type is&lt;br&gt;&lt;code&gt;com.glide.script.FieldGlideDescriptor&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;system&lt;/p&gt;&lt;ul&gt;&lt;li&gt;This is super interesting. This might be what UI Actions have&lt;br&gt;available to them with the&amp;nbsp;&lt;code&gt;action&lt;/code&gt;&amp;nbsp;variable.&amp;nbsp;&lt;code&gt;system&lt;/code&gt;&amp;nbsp;has one&lt;br&gt;&lt;code&gt;JavaObject&lt;/code&gt;&amp;nbsp;called action.&amp;nbsp;&lt;code&gt;system.action&lt;/code&gt;&amp;nbsp;has many things.&lt;/li&gt;&lt;li&gt;canPop&lt;/li&gt;&lt;li&gt;canRunAction&lt;/li&gt;&lt;li&gt;enforceMandatoryOnUpdate&lt;/li&gt;&lt;li&gt;equals&lt;/li&gt;&lt;li&gt;get&lt;/li&gt;&lt;li&gt;getActionName&lt;/li&gt;&lt;li&gt;getActionSysId&lt;/li&gt;&lt;li&gt;getBody&lt;/li&gt;&lt;li&gt;getCategory&lt;/li&gt;&lt;li&gt;getClass&lt;/li&gt;&lt;li&gt;getCondition&lt;/li&gt;&lt;li&gt;getFromType&lt;/li&gt;&lt;li&gt;getGRList&lt;/li&gt;&lt;li&gt;getGlideURI&lt;/li&gt;&lt;li&gt;getGotoURL&lt;/li&gt;&lt;li&gt;getLabel&lt;/li&gt;&lt;li&gt;getName&lt;/li&gt;&lt;li&gt;getOnClick&lt;/li&gt;&lt;li&gt;getOnClickEscaped&lt;/li&gt;&lt;li&gt;getRedirectURL&lt;/li&gt;&lt;li&gt;getRef&lt;/li&gt;&lt;li&gt;getReturnURL&lt;/li&gt;&lt;li&gt;getRunAt&lt;/li&gt;&lt;li&gt;getTableName&lt;/li&gt;&lt;li&gt;getTarget&lt;/li&gt;&lt;li&gt;getType&lt;/li&gt;&lt;li&gt;getUniqueFieldValue&lt;/li&gt;&lt;li&gt;getValues&lt;/li&gt;&lt;li&gt;hashCode&lt;/li&gt;&lt;li&gt;isInsert&lt;/li&gt;&lt;li&gt;isNextRecord&lt;/li&gt;&lt;li&gt;isPreviousRecord&lt;/li&gt;&lt;li&gt;isRedirect&lt;/li&gt;&lt;li&gt;notify&lt;/li&gt;&lt;li&gt;notifyAll&lt;/li&gt;&lt;li&gt;openGlideRecord&lt;/li&gt;&lt;li&gt;process&lt;/li&gt;&lt;li&gt;setCategory&lt;/li&gt;&lt;li&gt;setFromType&lt;/li&gt;&lt;li&gt;setGRList&lt;/li&gt;&lt;li&gt;setGotoURL&lt;/li&gt;&lt;li&gt;setNoPop&lt;/li&gt;&lt;li&gt;setRedirectURL&lt;/li&gt;&lt;li&gt;setRequest&lt;/li&gt;&lt;li&gt;setReturnURL&lt;/li&gt;&lt;li&gt;setTarget&lt;/li&gt;&lt;li&gt;setType&lt;/li&gt;&lt;li&gt;setUniqueField&lt;/li&gt;&lt;li&gt;toString&lt;/li&gt;&lt;li&gt;wait()| Function | |&lt;/li&gt;&lt;li&gt;class| JavaObject | |&lt;/li&gt;&lt;li&gt;glideURI| JavaObject | “snd_xplore.do?” |&lt;/li&gt;&lt;li&gt;values| JavaObject | “{}” |&lt;/li&gt;&lt;li&gt;noPop| undefined | undefined |&lt;/li&gt;&lt;li&gt;request| undefined | undefined |&lt;/li&gt;&lt;li&gt;uniqueField| undefined | undefined |&lt;/li&gt;&lt;li&gt;actionSysId| null | null |&lt;/li&gt;&lt;li&gt;category| null | null |&lt;/li&gt;&lt;li&gt;redirectURL| null | null |&lt;/li&gt;&lt;li&gt;returnURL| null | null |&lt;/li&gt;&lt;li&gt;GRList&lt;/li&gt;&lt;li&gt;actionName&lt;/li&gt;&lt;li&gt;body&lt;/li&gt;&lt;li&gt;condition&lt;/li&gt;&lt;li&gt;fromType&lt;/li&gt;&lt;li&gt;gotoURL&lt;/li&gt;&lt;li&gt;insert&lt;/li&gt;&lt;li&gt;label&lt;/li&gt;&lt;li&gt;name&lt;/li&gt;&lt;li&gt;nextRecord&lt;/li&gt;&lt;li&gt;onClick&lt;/li&gt;&lt;li&gt;onClickEscaped&lt;/li&gt;&lt;li&gt;previousRecord&lt;/li&gt;&lt;li&gt;redirect&lt;/li&gt;&lt;li&gt;ref&lt;/li&gt;&lt;li&gt;runAt&lt;/li&gt;&lt;li&gt;tableName&lt;/li&gt;&lt;li&gt;target&lt;/li&gt;&lt;li&gt;type&lt;/li&gt;&lt;li&gt;uniqueFieldValue&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;gs&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;gs&lt;/code&gt;&amp;nbsp;seems to be a copy of the above&lt;br&gt;(&lt;code&gt;system.action&lt;/code&gt;)[#system]&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;global&amp;nbsp;&lt;em&gt;&lt;strong&gt;SPECIAL&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideDBObjectManager&amp;nbsp;&lt;em&gt;&lt;strong&gt;SPECIAL&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideNumberManager&amp;nbsp;&lt;em&gt;&lt;strong&gt;SPECIAL&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getUsersForRoleDelegation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getRoleDelegatorGroupOptions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getRoleDelegatorOptions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getMyRoleDelegationGroups&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getDelegatableRoles&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;cmn_notif_device_listGetViewName&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;cmn_notif_deviceGetViewName&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;cxs_table_config_srch_as_fldGetChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getBaseFilter&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getUserHomepages&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getRefColumnDictionary&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getMyRequestIDs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;closeChange&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;closeProblem&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;closeIncident&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;closeRelatedTasks&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getStatsOptions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;dmn_demand_stageGetChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getNextObjNumber&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;saListCis&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getAllMembersOfMyGroups&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getGroupMembersGivenGroupID&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getGroupMembersGivenGroupName&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;hasAccessToDocument&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;global_simple_events&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;global_events&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GetIDValue&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;emailsToUsers&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getUserDashboards&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;lastWeek&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;nowDateTime&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;now&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;isAdvancedUI&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getWeekStart&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;notifDeviceRefQual&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getGroupsInHierarchy&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getRelatedGroup&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getRelatedCI&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getRelatedRecords&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;workflowTaskTemplateReferenceQualifier&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GetGroupFilter&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getDefaultDeliveryPlan&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getDisplayValueOf&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;limitFieldLength&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;v_field_editor_lengthGetChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;v_ws_field_editor_lengthGetChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;restrictCatItemsForGuides&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;trim&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;addChoiceType&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;limitFieldType&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;v_field_editor_typeGetChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sys_userGetEmailAddress&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;incidentGetCaller&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;incident_listGetViewName&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;incidentGetViewName&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;padObjNumber&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getNextObjNumberPadded&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;cmdbCIChildren&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getDefaultContentType&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sys_dictionary_elementCanWrite&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sys_dictionary_nameCanWrite&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getDictionaryEntry&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;doesEntryFloat&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;cmdb_rel_type_suggest_relationshipGetChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;rm_release_phase_ProcessFlowList&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;idea_stageGetChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;rm_release_ProcessFlowList&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ProposedChangesExist&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sc_req_item_stage_DeliveryPlanChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sc_req_item_stageGetChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getKBMandatoryFields&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;dmn_demand_ProcessFlowList&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GetReasonForChange&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;cxs_table_field_config_fieldGetChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getRoleListIds&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getRoledUsers&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;addWFVariables&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;addDefaultVariables&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;addVariables&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;addVariableSets&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;wf_variables&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getPrimaryCompany&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getBannerSrc&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;recurseImageParents&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getBannerText&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;recurseParents&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getMyGroups&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;deleteAllRecords&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getCurrencyFilter&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;populatedFilterRefQual&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getLDAPSources&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;isMandatoryNotification&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;dynamicUserCreation&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sys_sg_master_item_tableGetChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;checkAllApprovers&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;isApprovalMine&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getMyAssignments&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getMyApprovals&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getApplicableTemplates&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getMobileLayoutCatalogs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sys_trigger_system_idGetChoices&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getDefaultKB&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;checkForUnscheduled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;createProblem&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;globalListen&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getGroupQualifier&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;getDateFilterOptions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;historyRecordPresent&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;recordHasUpdateXML&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;areAllPreviewProblemsIgnored&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;updateSetPreviewInstalled&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;kbGetText&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;kbWriteComment&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;homeGetViewName&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sc_cat_itemGetViewName&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sc_req_itemGetViewName&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;NumberManager&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 id=&quot;available-in-script-includes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/finding-globally-available-things/#available-in-script-includes&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2019-03-13-finding-global-things/#available-in-script-includes&quot; rel=&quot;noopener&quot;&gt;Available in Script Includes&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;If you define these in a script include it may cause an issue.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;CALLABLE_PREFIX&lt;/li&gt;&lt;li&gt;gc&lt;/li&gt;&lt;li&gt;getChars&lt;/li&gt;&lt;li&gt;getDocument&lt;/li&gt;&lt;li&gt;getName&lt;/li&gt;&lt;li&gt;getParameter&lt;/li&gt;&lt;li&gt;getRootElement&lt;/li&gt;&lt;li&gt;getType&lt;/li&gt;&lt;li&gt;getValue&lt;/li&gt;&lt;li&gt;initialize&lt;/li&gt;&lt;li&gt;newItem&lt;/li&gt;&lt;li&gt;process&lt;/li&gt;&lt;li&gt;request&lt;/li&gt;&lt;li&gt;responseXML&lt;/li&gt;&lt;li&gt;setAnswer&lt;/li&gt;&lt;li&gt;setError&lt;/li&gt;&lt;li&gt;type&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Import Sets.  Use them.</title>
      <link href="https://jace.pro/blog/import-sets-use-them/" />
      <updated>2019-03-01T00:00:00Z</updated>
      <id>https://jace.pro/blog/import-sets-use-them/</id>
      <content type="html">
				&lt;p&gt;I was asked to present a lab I submitted to &lt;a href=&quot;https://jace.pro/post/2018-12-02-k19-proposals/&quot; rel=&quot;noopener&quot;&gt;K19&lt;/a&gt;&amp;nbsp;at the local Minnesota ServiceNow User Group. I thought this would be great so I went down the path of making this small lab about using import sets.&lt;/p&gt;&lt;p&gt;Here’s a link to the &lt;a href=&quot;https://sndevs.github.io/meetups/decks/integrate-faster-import-sets&quot; rel=&quot;noopener&quot;&gt;deck&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The short version of this is;&lt;/p&gt;&lt;p&gt;Always use import sets for data from another system, and always store all the data you can see in that import set so you don’t have to get into the integration to do modifications.&lt;/p&gt;&lt;p&gt;You may hear reasons to not do this;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Objection:&lt;/strong&gt;&amp;nbsp;“This is just a small SolarWinds import to add to our network devices, It would be just as fast to write to the table in a script include.”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What you should think:&lt;/strong&gt;&amp;nbsp;“Sure, but then the moment they change their data or want to coalesce on something else, you’ll have to re-interrogate the data to map it.”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What you should say:&lt;/strong&gt;&amp;nbsp;&quot;Any integration needs to come in to a import set table where we will hold the data for a few days so we can transform the data to our values regardless how the data in that other system exists.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Objection:&lt;/strong&gt;&amp;nbsp;“I’ve done plenty of integrations and this one just runs on demand to get the start date of a new employee, literally just populating the variables on RITM”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What you should think:&lt;/strong&gt;&amp;nbsp;“Sure, until they change their mind and want it to do something more with some other element they were sharing.”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What you should say:&lt;/strong&gt;&amp;nbsp;&quot;We store all data seen from the integration for future use in case the need arises to use them based on future work. This simplifies the integration later for other to work on it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Objection:&lt;/strong&gt;&amp;nbsp;“This just adds overhead to what would otherwise be a simple integration.”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What you should think:&lt;/strong&gt;&amp;nbsp;&quot;It’s only overhead if you don’t do&amp;nbsp;&lt;strong&gt;all&lt;/strong&gt; your integrations that way. By being consistent anyone on your team should be able to quickly identify what needs to be changed.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What you should say:&lt;/strong&gt;&amp;nbsp;“Being consistent on this lets anyone on the team quickly work on the same integration without having to explain every nuance about the integration.”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Objection:&lt;/strong&gt;&amp;nbsp;Bringing in data from a nested source like JSON or XML doesn’t make sense.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What you should should think:&lt;/strong&gt;&amp;nbsp;There’s common ways to flatten that down.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What you should say:&lt;/strong&gt;&amp;nbsp;Below are examples of how to flatten JSON.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;flatten&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;recurse&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;cur&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cur&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; cur&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            result&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cur&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isArray&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cur&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
             &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; l&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;cur&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;l&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                 &lt;span class=&quot;token function&quot;&gt;recurse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cur&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; prop &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;[&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;l &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                result&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; isEmpty &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; p &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; cur&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                isEmpty &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;recurse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cur&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; prop &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; prop&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;p &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isEmpty &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; prop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                result&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;recurse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; obj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;last&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Benson&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;website&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://blog.jace.pro&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Normal:&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Flattened:&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;flatten&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;XMLtoJSON Flattened:&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; xmlStr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
xmlStr &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;Person&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
xmlStr &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;  &amp;lt;Name&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
xmlStr &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;    &amp;lt;First&amp;gt;Jace&amp;lt;/First&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
xmlStr &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;    &amp;lt;Last&amp;gt;Benson&amp;lt;/Last&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
xmlStr &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;  &amp;lt;/Name&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
xmlStr &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;  &amp;lt;Site&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
xmlStr &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;    https://blog.jace.pro&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
xmlStr &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;  &amp;lt;/Site&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
xmlStr &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;/Person&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; xmlObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;xmlToJSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xmlStr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//gs.info(JSON.stringify(xmlObj,&#39;&#39;,&#39;  &#39;));&lt;/span&gt;
gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;flatten&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xmlObj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*** Script: Normal:
*** Script: 
{
    &quot;name&quot;: {
        &quot;first&quot;:&quot;Jace&quot;,
        &quot;last&quot;:&quot;Benson&quot;
    },
    &quot;website&quot;:&quot;https://blog.jace.pro&quot;
}
*** Script: Flattened:
*** Script: 
{
    &quot;name.first&quot;:&quot;Jace&quot;,
    &quot;name.last&quot;:&quot;Benson&quot;,
    &quot;website&quot;:&quot;https://blog.jace.pro&quot;
}
*** Script: XMLtoJSON Flattened:
*** Script: 
{
    &quot;Person.Site&quot;:&quot;https://blog.jace.pro&quot;,
    &quot;Person.Name.Last&quot;:&quot;Benson&quot;,
    &quot;Person.Name.First&quot;:&quot;Jace&quot;
}
***/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Multirow Variable Sets in code</title>
      <link href="https://jace.pro/blog/multirow-variable-sets-in-code/" />
      <updated>2019-02-04T00:00:00Z</updated>
      <id>https://jace.pro/blog/multirow-variable-sets-in-code/</id>
      <content type="html">
				&lt;blockquote&gt;&lt;p&gt;Anyone out there in #ServiceNow / #ServiceNowDev ever built anything that allows you to print the RITM and include variables? Special bonus if it can do it with London’s multi-line variable set feature. - Rob (@rfedoruk) &lt;a href=&quot;https://twitter.com/rfedoruk/status/1092322323364003840?ref_src=twsrc%5Etfw&quot;&gt;February 4, 2019&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;In our discussions we found this new table &lt;code&gt;sc_multi_row_question_answer&lt;/code&gt;. I needed to post this before I forget, as it’s useful. Eventually I’ll update my variable scripts to pull from there too.&lt;/p&gt;&lt;p&gt;UPDATE: This now is pulled in the&amp;nbsp;&lt;a href=&quot;https://devtoolbox.jace.pro/#variable-parser&quot; rel=&quot;noopener&quot;&gt;Dev Toolbox Scoped app&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Password variable for service catalog</title>
      <link href="https://jace.pro/blog/password-variable-for-service-catalog/" />
      <updated>2019-01-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/password-variable-for-service-catalog/</id>
      <content type="html">
				&lt;p&gt;I was asked to add a password field on a catalog item and I was appalled&lt;br&gt;to find this isn’t an out of box variable type. I went ahead and made a&lt;br&gt;widget to make one that is secure but I feel we shouldn’t have to.&lt;/p&gt;&lt;p&gt;So in my case I wanted the following;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;2 Masked Password fields that verified they matched and that they&lt;br&gt;match a regex expression.&lt;/li&gt;&lt;li&gt;Store the password as a&amp;nbsp;&lt;a href=&quot;https://sn.jace.pro/glideencrypter/&quot; rel=&quot;noopener&quot;&gt;encrypted&lt;/a&gt;&amp;nbsp;value so I can&lt;br&gt;use is later but keep it&amp;nbsp;&lt;em&gt;secure&lt;/em&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Here’s the end result;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/M_u97lSG_r-552.webp 552w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/M_u97lSG_r-552.jpeg&quot; alt=&quot;Password Variable&quot; width=&quot;552&quot; height=&quot;232&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;To make this follow these steps;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Make a variable type of string, variable name of&amp;nbsp;&lt;code&gt;password&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Make a variable type of macro with label, variable name of&lt;br&gt;&lt;code&gt;password_macro&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Make a Service Portal Widget with these values;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;html-template&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/password-variable-for-service-catalog/#html-template&quot; class=&quot;heading-anchor&quot;&gt;HTML Template&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-group ng-scope ng-isolate-scope&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;field-label ng-binding ng-scope&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;tooltip-right&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-original-title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;field-decorations&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fa fa-asterisk mandatory ng-hide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
            &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Mandatory&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
            &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.25em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 
            &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Mandatory &lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
            &lt;span class=&quot;token attr-name&quot;&gt;aria-hidden&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    Enter Password
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sr-only ng-binding&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;type-string field-actual&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ng-scope&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pwd1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
             &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;password&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
             &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-control ng-pristine ng-untouched ng-valid ng-scope ng-valid-maxlength ng-empty&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
             &lt;span class=&quot;token attr-name&quot;&gt;maxlength&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
             &lt;span class=&quot;token attr-name&quot;&gt;ng-model&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;c.data.passwordInput1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
             &lt;span class=&quot;token attr-name&quot;&gt;ng-change&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;setPassword(&#39;password&#39;)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;label&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;field-label ng-binding ng-scope&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;tooltip-right&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-original-title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;field-decorations&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fa fa-asterisk mandatory ng-hide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
            &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Mandatory&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
            &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.25em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 
            &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Mandatory &lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
            &lt;span class=&quot;token attr-name&quot;&gt;aria-hidden&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    Repeat Password
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sr-only ng-binding&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;type-string field-actual&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ng-scope&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;pwd2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
             &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;password&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
             &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-control ng-pristine ng-untouched ng-valid ng-scope ng-valid-maxlength ng-empty&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
             &lt;span class=&quot;token attr-name&quot;&gt;maxlength&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
             &lt;span class=&quot;token attr-name&quot;&gt;ng-model&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;c.data.passwordInput2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
             &lt;span class=&quot;token attr-name&quot;&gt;ng-change&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;setPassword(&#39;password&#39;)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-show&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;field.messages&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-hidden&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ng-hide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;client-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/password-variable-for-service-catalog/#client-script&quot; class=&quot;heading-anchor&quot;&gt;Client Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//This is the controller, we&#39;ve included $scope in the function above because it&#39;s easy to work with&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;passwordInput &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//Simplify accessing g_form within the client script by setting it as a variable named g_form&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; g_form &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;g_form &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;setPassword&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;varname&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/*
    console.log(JSON.stringify({
        &quot;c.data.passwordInput1&quot;: c.data.passwordInput1,
        &quot;c.data.passwordInput2&quot;: c.data.passwordInput2
    },&#39;  &#39;));
    */&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;passwordInput1 &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;passwordInput2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;passwordInput1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;^([a-zA-Z0-9]{16,})$&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;passwordInput&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;passwordInput1
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;varname&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;passwordEncrypted&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hideFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;password_macro&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//hides all messages&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorShort &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Passwords must be at least 16 characters and only allow a alphanumeric value.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hideFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;password_macro&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//hides all messages&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;password_macro&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; errorShort&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorMatch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Passwords must be at least 16 characters and only allow a alphanumeric value.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;varname&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hideFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;password_macro&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//hides all messages&lt;/span&gt;
      g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;password_macro&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; errorMatch&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;server-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/password-variable-for-service-catalog/#server-script&quot; class=&quot;heading-anchor&quot;&gt;Server Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;passwordInput&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; encrypter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideEncrypter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;passwordEncrypted &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; encrypter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;encrypt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;passwordInput&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Approvals for Knowledge and how they dont work</title>
      <link href="https://jace.pro/blog/approvals-for-knowledge-and-how-they-dont-work/" />
      <updated>2019-01-12T00:00:00Z</updated>
      <id>https://jace.pro/blog/approvals-for-knowledge-and-how-they-dont-work/</id>
      <content type="html">
				&lt;p&gt;A few days ago Derek was asking about approvals, specifically approvals for Knowledge articles and why they don’t work out of the box. It’s weird and here I’ll go through it. So it seems ServiceNow started to make this work out of the box but just never finished it. Here’s the list of things they did;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Workflow&amp;nbsp;&lt;code&gt;Knowledge - Approval Publish&lt;/code&gt;&amp;nbsp;creates an approval&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A business rule called&amp;nbsp;&lt;code&gt;Approval Events (Non-Task)&lt;/code&gt;&amp;nbsp;triggers an event for the state based on the table. So searching for &lt;code&gt;kb_knowledge.approval.inserted&lt;/code&gt;&amp;nbsp;comes up empty. Here’s the code;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sendEventsNonTask&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sendEventsNonTask&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;changes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

 &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; event &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;source_table&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;    
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;cancelled&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
       event &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.approval.cancelled&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eventQueue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;requested&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
       event &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.approval.inserted&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eventQueue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;updateRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;approver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; requested to approve task&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
   &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;rejected&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
       event &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.approval.rejected&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eventQueue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; previous&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;updateRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;approver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; rejected the task.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
             current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;comments&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getJournalEntry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;notifyMyFriends&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;approved&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
       &lt;span class=&quot;token function&quot;&gt;updateRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;approver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; approved the task.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
             current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;comments&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getJournalEntry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
       &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; 
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;       
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
 &lt;span class=&quot;token comment&quot;&gt;/*Omitted remaining code...*/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;No notification is built but you could just create a new one based on the template called&amp;nbsp;&lt;code&gt;change.itil.approve.role&lt;/code&gt;&#92;&lt;/p&gt;&lt;p&gt;Subject: ${sysapproval.sys_class_name} ${sysapproval} Approval Request&#92;&lt;/p&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Short Description: ${sysapproval.short_description}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Priority: ${sysapproval.priority}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Category: ${sysapproval.category}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span title=&quot;&amp;nbsp;&quot; class=&quot;token entity named-entity&quot;&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;hr&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;${mail_script:change_request_summary}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span title=&quot;&amp;nbsp;&quot; class=&quot;token entity named-entity&quot;&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Comments:&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;${sysapproval.description}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;hr&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;${mailto:mailto.approval}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;hr&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;${mailto:mailto.rejection}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;hr&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Approval Activity:&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;${mail_script:approval_activity}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;hr&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Click here to view Approval Request: ${URI}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Click here to view ${sysapproval.sys_class_name}: ${sysapproval.URI}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I’d probably start with something like this&#92;&lt;/p&gt;&lt;p&gt;Subject: ${document_id.short_description} ${document_id.number} Approval Request&lt;/p&gt;&#92;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Short Description: ${document_id.short_description}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span title=&quot;&amp;nbsp;&quot; class=&quot;token entity named-entity&quot;&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;hr&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;${mailto:mailto.approval}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;hr&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;${mailto:mailto.rejection}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;hr&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Click here to view Approval Request: ${URI}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Click here to view ${document_id.sys_class_name}: ${document_id.URI}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;They made it really close. Just never finished it.&lt;/p&gt;&lt;p&gt;In any case, thanks Derek for the idea for the post.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>ServiceNow Order of operations</title>
      <link href="https://jace.pro/blog/servicenow-order-of-operations/" />
      <updated>2019-01-04T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenow-order-of-operations/</id>
      <content type="html">
				&lt;p&gt;Understanding&amp;nbsp;&lt;strong&gt;when&lt;/strong&gt;&amp;nbsp;something runs is critical when building these systems. ServiceNow has a very simple and great image that captures that for&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/geneva-servicenow-platform/page/script/business_rules/reference/r_HowBusinessRulesWork.html&quot; rel=&quot;noopener&quot;&gt;business rules&lt;/a&gt;.&lt;br&gt;However that doesn’t help with other scripts in the system. Bas @ Logicalis wrote something up about this on&lt;br&gt;&lt;a href=&quot;http://www.snc-blog.com/2017/02/02/script-execution-flow/&quot; rel=&quot;noopener&quot;&gt;snc-blog&lt;/a&gt; but I thought I could improve on it. Also messing with things is a way I&lt;br&gt;remember better.&lt;/p&gt;&lt;p&gt;I try to keep all the common diagrams I use on &lt;a href=&quot;https://workflow.jace.pro/?flow=BusinessRuleOrderSequence#&quot; rel=&quot;noopener&quot;&gt;https://workflow.jace.pro/&lt;/a&gt; but I realize I don’t really share when that changes.&lt;/p&gt;&lt;p&gt;Here I’ve been messing with this and I thought now is a great time to share this diagram I keep out there.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/25Ds0h0taI-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/25Ds0h0taI-650.jpeg&quot; alt=&quot;ServiceNow Order of Operations&quot; width=&quot;650&quot; height=&quot;888&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Knowledge 19: Proposals to present</title>
      <link href="https://jace.pro/blog/knowledge-19-proposals-to-present/" />
      <updated>2018-12-02T00:00:00Z</updated>
      <id>https://jace.pro/blog/knowledge-19-proposals-to-present/</id>
      <content type="html">
				&lt;p&gt;Below are my K19 proposal’s to speak. I’d like to develop these points into posts at some point so I have an embedded survey below the details of these talks&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.surveymonkey.com/results/SM-MR75LCJ9V/&quot; rel=&quot;noopener&quot;&gt;Results&lt;/a&gt;&lt;/p&gt;&lt;h1 id=&quot;integrate-repeatably-faster-by-following-these-steps&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#integrate-repeatably-faster-by-following-these-steps&quot; class=&quot;heading-anchor&quot;&gt;Integrate repeatably faster by following these steps&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;session-abstract&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#session-abstract&quot; class=&quot;heading-anchor&quot;&gt;Session Abstract&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;introduction-and-problem-statement&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#introduction-and-problem-statement&quot; class=&quot;heading-anchor&quot;&gt;Introduction and Problem Statement&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;My company is a company like others, with data in a lot of places. In this session, we’ll look at how having a consistent integration policy can help make development of those integrations easier.&lt;/p&gt;&lt;h3 id=&quot;approach-and-results&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#approach-and-results&quot; class=&quot;heading-anchor&quot;&gt;Approach and Results&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In this session, I will share how we’ve;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Improved device tracking (azure intune) for compliance, and security reasons.&lt;/li&gt;&lt;li&gt;SolarWinds import to improve discovery&lt;/li&gt;&lt;li&gt;CrashPlan import to drive compliance of legal holds and status in a central system&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;attendees-will-learn-how-to&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#attendees-will-learn-how-to&quot; class=&quot;heading-anchor&quot;&gt;Attendees will learn how to&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Make a import set from a script&lt;/li&gt;&lt;li&gt;Make import set rows from a script&lt;/li&gt;&lt;li&gt;Run transform maps against a import set from a script&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;what-is-the-objective-of-your-session&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#what-is-the-objective-of-your-session&quot; class=&quot;heading-anchor&quot;&gt;What is the objective of your session?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;To show, how and why using some consistent practices around integrations can save you a lot of time and trouble.&lt;/p&gt;&lt;h2 id=&quot;what-are-the-three-key-takeaways-you-will-want-your-audience-to-leave-with&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#what-are-the-three-key-takeaways-you-will-want-your-audience-to-leave-with&quot; class=&quot;heading-anchor&quot;&gt;What are the three key takeaways you will want your audience to leave with?&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;You can follow a common import pattern to drive most integrations to simplify development and further customizations&lt;/li&gt;&lt;li&gt;Rest API integrations that ServiceNow has to ask for data from can follow this pattern&lt;/li&gt;&lt;li&gt;After you do it once or twice you can do it for other integrations&lt;/li&gt;&lt;/ol&gt;&lt;h1 id=&quot;open-sourcing-atf-tests-with-github-and-hacktoberfest&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#open-sourcing-atf-tests-with-github-and-hacktoberfest&quot; class=&quot;heading-anchor&quot;&gt;Open Sourcing ATF tests with Github and hacktoberfest&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;session-abstract-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#session-abstract-1&quot; class=&quot;heading-anchor&quot;&gt;Session Abstract&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;introduction-and-problem-statement-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#introduction-and-problem-statement-1&quot; class=&quot;heading-anchor&quot;&gt;Introduction and Problem Statement&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;My company is a company like others, we want to upgrade without delay but due to testing are slowed sometimes. In this session, we’ll talk about how I started a repo to open source OOB Test Suites to give us a baseline for future upgrades.&lt;/p&gt;&lt;h3 id=&quot;approach-and-results-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#approach-and-results-1&quot; class=&quot;heading-anchor&quot;&gt;Approach and Results&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In this session, I will share how I started to maintain a repo for test suites in ServiceNow. I found I was participating in my second #hacktoberfest and a thought occurred. How can I get other people to build tests so I don’t have to? And it’s simple. Make a repo, share it and spread the word.&lt;/p&gt;&lt;h2 id=&quot;attendees-will-learn-how-to-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#attendees-will-learn-how-to-1&quot; class=&quot;heading-anchor&quot;&gt;Attendees will learn how to&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Contribute to an open source project for scoped applications&lt;/li&gt;&lt;li&gt;Avoid nuances for ServiceNow’s repos branches&lt;/li&gt;&lt;li&gt;Accept and Reject Pull Requests without breaking and losing data.&lt;/li&gt;&lt;li&gt;Make a project site for the project with Netlify&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;what-is-the-objective-of-your-session-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#what-is-the-objective-of-your-session-1&quot; class=&quot;heading-anchor&quot;&gt;What is the objective of your session?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;To show, how and why open sourcing some scoped applications can save you time.&lt;/p&gt;&lt;h2 id=&quot;what-are-the-three-key-takeaways-you-will-want-your-audience-to-leave-with-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#what-are-the-three-key-takeaways-you-will-want-your-audience-to-leave-with-1&quot; class=&quot;heading-anchor&quot;&gt;What are the three key takeaways you will want your audience to leave with?&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;You can open source scoped applications to share with the community work managed on git&lt;/li&gt;&lt;li&gt;Doing so can get other to contribute to help drive the progression of the project&lt;/li&gt;&lt;li&gt;It can help everyone, so, try to share in the future.&lt;/li&gt;&lt;/ol&gt;&lt;h1 id=&quot;learn-by-supporting-or-starting-your-own-local-developer-meetup&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#learn-by-supporting-or-starting-your-own-local-developer-meetup&quot; class=&quot;heading-anchor&quot;&gt;Learn by supporting or starting your own local Developer Meetup&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;session-abstract-2&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#session-abstract-2&quot; class=&quot;heading-anchor&quot;&gt;Session Abstract&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;introduction-and-problem-statement-2&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#introduction-and-problem-statement-2&quot; class=&quot;heading-anchor&quot;&gt;Introduction and Problem Statement&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Two years ago I started a Developer Meetup for ServiceNow talent to do ad-hoc labs and have happy hours. I didn’t want what happened to the SNUG’s happening to this event so I volunteered.&lt;/p&gt;&lt;h3 id=&quot;approach-and-results-2&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#approach-and-results-2&quot; class=&quot;heading-anchor&quot;&gt;Approach and Results&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Running the event has been a ride and I would do it all over again. In this session I’ll go over what it takes to run these events.&lt;/p&gt;&lt;h2 id=&quot;attendees-will-learn-how-to-2&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#attendees-will-learn-how-to-2&quot; class=&quot;heading-anchor&quot;&gt;Attendees will learn how to&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Identify how often and about what the meetup should meet about.&lt;/li&gt;&lt;li&gt;Finding content to use for labs and / or for happy hour discussions.&lt;/li&gt;&lt;li&gt;Finding hosting locations in your area.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;what-is-the-objective-of-your-session-2&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#what-is-the-objective-of-your-session-2&quot; class=&quot;heading-anchor&quot;&gt;What is the objective of your session?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;To share what it takes to run developer meetups to give attendees information to form their own OR assist their local meetup.&lt;/p&gt;&lt;h2 id=&quot;what-are-the-three-key-takeaways-you-will-want-your-audience-to-leave-with-2&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-19-proposals-to-present/#what-are-the-three-key-takeaways-you-will-want-your-audience-to-leave-with-2&quot; class=&quot;heading-anchor&quot;&gt;What are the three key takeaways you will want your audience to leave with?&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;You don’t have to host or run the event to help. There’s lot’s of opportunity to help out.&lt;/li&gt;&lt;li&gt;Attend it, it’s smaller and less formal then your ServiceNow user groups.&lt;/li&gt;&lt;li&gt;Provide feedback, it’s always useful.&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Glide Script Editor Manager a class to manage APIs</title>
      <link href="https://jace.pro/blog/glide-script-editor-manager-a-class-to-manage-apis/" />
      <updated>2018-11-21T00:00:00Z</updated>
      <id>https://jace.pro/blog/glide-script-editor-manager-a-class-to-manage-apis/</id>
      <content type="html">
				&lt;p&gt;This is a way to get the apis listed in the text editors.&lt;/p&gt;&lt;p&gt;The&amp;nbsp;&lt;strong&gt;GlideScriptEditorManager&lt;/strong&gt;&amp;nbsp;&lt;strong&gt;getApis&lt;/strong&gt;&amp;nbsp;method returns a JSON&lt;br&gt;string of context-specific APIs. The JSON returned is invalid and&lt;br&gt;incorrectly escapes&amp;nbsp;&lt;code&gt;&quot;&#39;&quot;&lt;/code&gt;&amp;nbsp;as&amp;nbsp;&lt;code&gt;&quot;&#92;&#39;&quot;&lt;/code&gt;. The script below fixes this and&lt;br&gt;outputs formatted JSON.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tables &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;catalog_client_script&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;sys_script_email&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;sys_script_include&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

tables&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gsem &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideScriptEditorManager&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; apis &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gsem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getApis&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;script&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// fix invalid JSON&lt;/span&gt;
    apis &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; apis&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;&#92;&#39;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#39;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; parsed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;apis&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; formatted &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;parsed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;formatted&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ERROR: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I’ve used this code in the past to generate markdown tables for these APIs in the past;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; thing &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; api&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;getThings&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;api&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;thing&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getThings&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//console.log(JSON.stringify(obj));&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&#39;---&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&#39;date: 2018-11-21&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&#39;category: &#92;&#39;&#92;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&#39;layout: page&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&#39;aliases:&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&#39; - &quot;/&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; thing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toLowerCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;/&quot;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&#39;title: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; thing&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&#39;---&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&#39;# &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; thing&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; prop &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prop &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;!doc&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;obj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;| Property/Method | Description |&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;| --- | --- |&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prop &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;!doc&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; prop &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;!type&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; prop &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;prototype&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; prop &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;| &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; prop &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; | &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;!doc&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; |&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prop &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;prototype&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; pprop &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;| &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; pprop &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; | &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;prop&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;pprop&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;!doc&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; |&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>UI16: angular.do - What is this?</title>
      <link href="https://jace.pro/blog/ui16-angulardo-what-is-this/" />
      <updated>2018-11-05T00:00:00Z</updated>
      <id>https://jace.pro/blog/ui16-angulardo-what-is-this/</id>
      <content type="html">
				&lt;p&gt;The other day I got a report of slowness when using the “Post” button on incident&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/DZrJ1wtZLC-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/DZrJ1wtZLC-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;156&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Turns out this little functionality uses some undocumented api to &lt;code&gt;/angular.do&lt;/code&gt;&amp;nbsp;. In this post I go over what I found out about it and how it’s not measured like others.&lt;/p&gt;&lt;p&gt;First place I looked at this report is the transactions table&amp;nbsp;&lt;code&gt;syslog_transactions_list.do&lt;/code&gt;, transactions to this endpoint seem to&amp;nbsp;&lt;strong&gt;not&lt;/strong&gt;&amp;nbsp;be tracked there or in the new Active Cluster Transactions&amp;nbsp;&lt;code&gt;loading_transactions.do&lt;/code&gt;. Which is unfortunate, because that at least shows where the delay is tracked weather it’s on a server-side transaction or something on the client or something on the network.&lt;/p&gt;&lt;p&gt;I went ahead asking HI about it;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I have a user who is reporting slowness when they use the Post button below comment/work notes… I have looked everywhere I can think of to troubleshoot how long that transaction is taking but it’s not logged anywhere. I looked at syslog transactions, and the node file browser but nothing seems to track the POSTs to /angular.do as that hits that endpoint.&lt;/p&gt;&lt;p&gt;How can I see server side these requests and what may be causing that delay?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;They pretty much told me the way to track this down is to look at the info in the console of the browser as the user.&lt;/p&gt;&lt;p&gt;All these transactions should be captured but it seems ServiceNow doesn’t seem to share this opinion.&lt;/p&gt;&lt;p&gt;I’ve&amp;nbsp;&lt;a href=&quot;https://jace.pro/post/2018-11-05-angular-do/2018-11-05-angular-do.har&quot; rel=&quot;noopener&quot;&gt;attached (raw JSONP) the HAR record&lt;/a&gt;&amp;nbsp;and found a tool online here on &lt;a href=&quot;http://www.softwareishard.com/har/viewer/&quot; rel=&quot;noopener&quot;&gt;https://softwareishard.com/har/viewer&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It looks like it takes some URL parameters as well as some post body;&lt;/p&gt;&lt;p&gt;Endpoint;&lt;/p&gt;&lt;p&gt;&lt;code&gt;/angular.do?sysparm_type=line_history&amp;amp;action=insert&amp;amp;table=incident&amp;amp;sys_id=aed745a0db1123008096a455ca961992&amp;amp;sysparm_source=from_form&amp;amp;sysparm_timestamp&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Post Body;&lt;/p&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;entries&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;field&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Fifth Comment&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Post Response;&lt;/p&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;display_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Incident&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;entries&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;display_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;INC0010010&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;short_description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tttt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;is_email&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;initials&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Incident&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;document_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aed745a0db1123008096a455ca961992&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on_adjusted&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-11-05 06:04:38&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;entries&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;journal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sys_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;963491d6db2123008096a455ca961970&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Additional comments&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;is_truncated&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;change_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JOURNAL&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;journal_input&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fifth Comment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fifth Comment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;custom&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;changes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;writable_journal_fields&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;user_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cee12e57db1023008096a455ca961971&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-11-05 14:04:38&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1541426678000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_by&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace Benson&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;display_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;INC0010010&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;short_description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tttt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;is_email&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;initials&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Incident&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;document_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aed745a0db1123008096a455ca961992&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on_adjusted&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-11-05 06:04:26&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;entries&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;journal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sys_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;a724d596db2123008096a455ca96196a&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Additional&#92;n&#92;n comments&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;is_truncated&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;change_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JOURNAL&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;journal_input&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fourth Commnet&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fourth Commnet&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;custom&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;changes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;writable_journal_fields&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;user_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cee12e57db1023008096a455ca961971&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-11-05 14:04:26&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1541426666000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_by&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace Benson&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;display_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;INC0010010&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;short_description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tttt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;is_email&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;initials&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Incident&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;document_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aed745a0db1123008096a455ca961992&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on_adjusted&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-11-05 06:04:13&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;entries&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;journal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sys_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5024d1d2db2123008096a455ca9619fa&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Additional comments&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;is_truncated&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;change_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JOURNAL&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;journal_input&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Third Comment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Third Comment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;custom&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;changes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;writable_journal_fields&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;user_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cee12e57db1023008096a455ca961971&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-11-05 14:04:13&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1541426653000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_by&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace Benson&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;display_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;INC0010010&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;short_description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tttt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;is_email&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;initials&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Incident&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;document_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aed745a0db1123008096a455ca961992&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on_adjusted&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-11-05 06:01:48&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;entries&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;journal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sys_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;70931d96db2123008096a455ca9619f0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Additional comments&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;is_truncated&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;change_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JOURNAL&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;journal_input&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Second Comment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Second Comment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;custom&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;changes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;writable_journal_fields&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;user_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cee12e57db1023008096a455ca961971&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-11-05 14:01:48&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1541426508000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_by&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace Benson&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;display_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;INC0010010&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;short_description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tttt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;is_email&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;initials&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Incident&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;document_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aed745a0db1123008096a455ca961992&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on_adjusted&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-11-05 06:01:33&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;entries&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;journal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sys_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;d9831d96db2123008096a455ca961939&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Additional comments&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;is_truncated&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;change_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JOURNAL&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;journal_input&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;First Comment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;First Comment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;custom&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;changes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;writable_journal_fields&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;user_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cee12e57db1023008096a455ca961971&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-11-05 14:01:33&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1541426493000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_by&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace Benson&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;display_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;INC0010010&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;short_description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Tttt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;is_email&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;initials&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Incident&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;document_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aed745a0db1123008096a455ca961992&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on_adjusted&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-10-18 09:26:37&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;entries&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;journal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;custom&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;changes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sys_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3c731996db2123008096a455ca96193e&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Impact&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;is_truncated&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;change_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AUDIT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;integer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3 - Low&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3 - Low&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;impact&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sys_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;78731996db2123008096a455ca96193f&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Incident state&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;is_truncated&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;change_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AUDIT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;integer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;New&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;New&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;incident_state&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sys_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;38731996db2123008096a455ca96193e&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Opened by&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;is_truncated&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;change_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AUDIT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;reference&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace Benson&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace Benson&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;opened_by&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sys_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bc731996db2123008096a455ca96193e&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Priority&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;is_truncated&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;change_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AUDIT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;old_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;integer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5 - Planning&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;sanitized_new_value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5 - Planning&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;field_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;priority&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;writable_journal_fields&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;user_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cee12e57db1023008096a455ca961971&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_on&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2018-10-18 16:26:37&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1539879997000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sys_created_by&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jace Benson&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;primary_fields&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;fields&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;plural&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Assigned&#92;n&#92;n to&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;background-color: transparent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assigned_to&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;canWrite&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Assigned to&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;plural&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Configuration items&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;background-color: transparent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmdb_ci&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;canWrite&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Configuration item&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;plural&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Incident states&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;background-color: transparent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;incident_state&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;canWrite&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Incident state&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;plural&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Impact&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;background-color&#92;n&#92;n: transparent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;impact&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;canWrite&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Impact&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;plural&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Priorities&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;background-color: transparent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;priority&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;canWrite&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Priority&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;plural&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Opened by&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;background-color: transparent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;opened_by&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;canWrite&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Opened by&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;plural&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Work notes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gold&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;work_notes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;canWrite&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Work notes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;plural&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Additional comments&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;transparent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;comments&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;canWrite&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Additional comments&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;*Email*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Sent/Received Emails&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;*Relations*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Relationship&#92;n&#92;n Changes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;*Attachments*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Attachments&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;plural&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Resolution codes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;background-color: transparent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;close_code&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;canWrite&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Resolution code&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;plural&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Close notes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;background-color&#92;n&#92;n: transparent&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;close_notes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isJournal&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;canWrite&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Resolution notes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;isActive&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;sys_timestamp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1541426678000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;KB0655923:&amp;nbsp;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0655923&quot; rel=&quot;noopener&quot;&gt;https://hi.service-now.com/kb_view.do?sysparm_article=KB0655923&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Hacktoberfest 2018 - Self contained ATF application</title>
      <link href="https://jace.pro/blog/hacktoberfest-2018-self-contained-atf-application/" />
      <updated>2018-10-24T00:00:00Z</updated>
      <id>https://jace.pro/blog/hacktoberfest-2018-self-contained-atf-application/</id>
      <content type="html">
				&lt;p&gt;DigitalOcean and Github put together an event called “Hactoberfest” where you can sign up and get a shirt after 5 pull requests.&lt;/p&gt;&lt;p&gt;I’ve made a repo to build out tests for ServiceNow’s tool to help everyone get there.&lt;/p&gt;&lt;p&gt;Check it out&amp;nbsp;&lt;a href=&quot;https://atf.jace.pro/&quot; rel=&quot;noopener&quot;&gt;on Github&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;To contribute you need a personal developer instance and the drive to make a test and / or suite to test some OOB functionality.&lt;/p&gt;&lt;p&gt;All tests should be self contained. What do I mean by that? Well, anything you reference in the test may need to be created like the user you want to impersonate, and their group memberships/roles.&lt;/p&gt;&lt;p&gt;I do intend on making a custom test as part of this to make the generation of these artifacts easier but I am still learning how the code works for those tests.&lt;br&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=398d6669dbd0dbc01dcaf3231f9619d2&quot; rel=&quot;noopener&quot;&gt;This post&lt;/a&gt; at least is a decent example of someone doing a custom test step.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>MermaidJS: Lets render that workflow in an opinionated way</title>
      <link href="https://jace.pro/blog/mermaidjs-lets-render-that-workflow-in-an-opinionated-way/" />
      <updated>2018-10-04T00:00:00Z</updated>
      <id>https://jace.pro/blog/mermaidjs-lets-render-that-workflow-in-an-opinionated-way/</id>
      <content type="html">
				&lt;p&gt;The other day I was looking at my mermaidjs flows and wanted to see how&lt;br&gt;they would render a servicenow workflow.&lt;/p&gt;&lt;p&gt;I created a UI page to do this, you have to pass it a context&lt;br&gt;&lt;code&gt;sys_id&lt;/code&gt;&amp;nbsp;today but this could be improved.&lt;/p&gt;&lt;h2 id=&quot;ui-action&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mermaidjs-lets-render-that-workflow-in-an-opinionated-way/#ui-action&quot; class=&quot;heading-anchor&quot;&gt;UI Action&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*
Name: Show Mermaid
Table: Workflow Context[wf_context]
Client: [True]
OnClick: showWorkflowContextMermaid();
Script:
*/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;showWorkflowContextMermaid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUniqueValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;/mermaid.do&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_stack&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;no&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;context&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    g_navigation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;_blank&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;ui-page&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/mermaidjs-lets-render-that-workflow-in-an-opinionated-way/#ui-page&quot; class=&quot;heading-anchor&quot;&gt;UI Page&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jelly:core&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;glide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;evaluate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
var output = [];
var wf_context = new GlideRecord(&#39;wf_context&#39;);
  if(wf_context.get(RP.getParameterValue(&#39;context&#39;))){
      var wf_activity = new GlideRecord(&quot;wf_activity&quot;);
      wf_activity.addQuery(&#39;workflow_version&#39;, wf_context.getValue(&#39;workflow_version&#39;));
      wf_activity.orderBy(&#39;x&#39;);
      // wf_activity.orderBy(&#39;y&#39;);
      var query = wf_activity.getEncodedQuery();
      wf_activity.query();
      while(wf_activity.next()){
        // gs.info(wf_activity.getValue(&#39;sys_id&#39;) + &#39;(&#39; + wf_activity.name.toString().replace(/&#92;&quot;/g,&#39;&#39;) + &#39;)&#39;);
        output.push(wf_activity.getValue(&#39;sys_id&#39;) + &#39;(&#39; + wf_activity.name.toString().replace(/&#92;&quot;/g,&#39;&#39;) + &#39;)&#39;);
        var transitions = new GlideRecord(&#39;wf_transition&#39;);
        transitions.addQuery(&#39;from&#39;,wf_activity.getValue(&#39;sys_id&#39;));
        transitions.query();
        while(transitions.next()){
          // output.push(wf_activity.getValue(&#39;sys_id&#39;) + &#39;--&amp;gt;&#39; + transitions.getValue(&#39;to&#39;));
          output.push(wf_activity.getValue(&#39;sys_id&#39;) + &#39;--&#39; + transitions.condition.name.toString() + &#39;--&amp;gt;&#39; + transitions.getValue(&#39;to&#39;));
        }
      }
     gs.info(output.toString().replace(/&#92;,/g,&#39;&#92;n&#39;));
output = output.toString().replace(/&#92;,/g,&#39;&#92;n&#39;)
  } else {
      var query = &#39;No Workflow Found&#39;;
  }
gs.info(query);
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;evaluate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mermaid&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  graph TD
  ${output}
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hidden&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      graph TD
      ${output}
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://unpkg.com/mermaid@7.1.0/dist/mermaid.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// mermaid.initialize({startOnLoad:true});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/I7ryXMIG9B-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/I7ryXMIG9B-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;923&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Getting the next N approvals</title>
      <link href="https://jace.pro/blog/getting-the-next-n-approvals/" />
      <updated>2018-09-24T00:00:00Z</updated>
      <id>https://jace.pro/blog/getting-the-next-n-approvals/</id>
      <content type="html">
				&lt;p&gt;I was talking with someone they were asking how to get the next x approvals up to 10. You can’t always control the environment you work in. He was trying to get the next x approvals. I came up with this script;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// start debugging&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;variables &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;variables&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// end debugging&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getManager&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;user&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; m &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// gs.print(m.manager.getDisplayValue() + &#39; : &#39; + m.getValue(&#39;manager&#39;)); &lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;display&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;manager&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;manager&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; approvals &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; x&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; x&lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; x&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    approvals&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getManager&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;variables&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;sys_id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getManager&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;variables&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    approvals&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getManager&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;approvals&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;x&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;sys_id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getManager&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;approvals&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;x&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// gs.print(&#39;level &#39; + x + &#39; &#39; + approvals[x]);&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;approvals&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;  &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Naming your update sets</title>
      <link href="https://jace.pro/blog/naming-your-update-sets/" />
      <updated>2018-09-20T00:00:00Z</updated>
      <id>https://jace.pro/blog/naming-your-update-sets/</id>
      <content type="html">
				&lt;p&gt;Update set names should be somewhat meaningful without having to look at&lt;br&gt;the contents of the XML. ServiceNow has some recommendations on &lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0552854&quot; rel=&quot;noopener&quot;&gt;HI&lt;/a&gt; and on the &lt;a href=&quot;https://docs.servicenow.com/bundle/kingston-application-development/page/build/system-update-sets/reference/get-started-update-sets.html&quot; rel=&quot;noopener&quot;&gt;Docs&lt;/a&gt; site.&lt;/p&gt;&lt;p&gt;With that being said, generally best to have initials, date, some key (task) or description.&lt;/p&gt;&lt;h1 id=&quot;update-set-naming-convention&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/naming-your-update-sets/#update-set-naming-convention&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-09-20-update-set-naming/#update-set-naming-convention&quot; rel=&quot;noopener&quot;&gt;Update Set Naming Convention&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Make the names meaningful to the task at hand. The update set name should consist of the following.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Related task record, version, release or sprint number&lt;/li&gt;&lt;li&gt;Brief description&lt;/li&gt;&lt;li&gt;Developer’s initials&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;For example, if working on Incident Management form layout from a Story. The update set name could be&lt;br&gt;&lt;code&gt;STRY00123_Incident Mgmt Form Layout_ABC&lt;/code&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Update Set Description&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Put in as much detail as needed to ensure that if another member of the team looks at the update set record they can see what the contents are.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;This becomes especially important when working on an entire track. If you are working on Incident Management as a whole with multiple stories assigned to you, you should list all related stories in the description of the update set record.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The update set name should consist of the following if working on an entire track:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Date, version, release or sprint number&lt;/li&gt;&lt;li&gt;Brief description&lt;/li&gt;&lt;li&gt;Developer’s initials&lt;/li&gt;&lt;li&gt;Example:&amp;nbsp;&lt;code&gt;JB-2018-09-20 Combine both inc record producers&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We added some JavaScript to pre-fill the initials, and date for consistency on the name field. Below makes the following output;&lt;br&gt;&lt;code&gt;JB-2018-09-20&lt;/code&gt;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; r &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; u &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  r &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;u&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFirstName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  r &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;u&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getLastName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  r &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;-&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; d &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideDateTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ms &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; d&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getNumericValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  r &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ms&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toISOString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;T&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  r &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Code Collaboration tools seem to always go away, so I made one that wont</title>
      <link href="https://jace.pro/blog/code-collaboration-tools-seem-to-always-go-away-so-i-made-one-that-wont/" />
      <updated>2018-09-13T00:00:00Z</updated>
      <id>https://jace.pro/blog/code-collaboration-tools-seem-to-always-go-away-so-i-made-one-that-wont/</id>
      <content type="html">
				&lt;p&gt;After issues with CollabEdit, I am now hosting my own FirePad instance on&amp;nbsp;&lt;a href=&quot;https://code.jace.pro/&quot; rel=&quot;noopener&quot;&gt;code.jace.pro&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Feel free to use this but note that as of right now its using the FirePad db from the&amp;nbsp;&lt;a href=&quot;https://firepad.io/docs/#api&quot; rel=&quot;noopener&quot;&gt;FirePad project&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Service Catalog: Auto ordering variables</title>
      <link href="https://jace.pro/blog/service-catalog-auto-ordering-variables/" />
      <updated>2018-09-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-catalog-auto-ordering-variables/</id>
      <content type="html">
				&lt;p&gt;Today I learned a trick that would have saved me hours had I known about it years ago.&lt;/p&gt;&lt;p&gt;From time to time you find yourself working on a catalog item with variables. Sometimes those variables orders are to close together to allow for new variables. It would be great if you could press a button and have the order be fixed at 100s. You could write something custom… Or you could follow these steps;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Preview Item&lt;/li&gt;&lt;li&gt;Right-click header&lt;/li&gt;&lt;li&gt;Configure variables&lt;/li&gt;&lt;li&gt;Change the order of one variable&lt;/li&gt;&lt;li&gt;OK&lt;/li&gt;&lt;li&gt;Change the order back.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now the variables are spaced in 100s&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Difference between ${URI} and ${URI_REF}</title>
      <link href="https://jace.pro/blog/difference-between-dollaruri-and-dollaruri_ref/" />
      <updated>2018-09-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/difference-between-dollaruri-and-dollaruri_ref/</id>
      <content type="html">
				&lt;p&gt;All this talk about notifications had me poking around and I learned about using&amp;nbsp;&lt;code&gt;${URI_REF}&lt;/code&gt;&amp;nbsp;instead of&amp;nbsp;&lt;code&gt;${URI}&lt;/code&gt;. It’s magical.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;${URI_REF}&lt;/code&gt;&amp;nbsp;creates a link to the current record using the records display value. It’s essentially… the same as;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
link &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;instance_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
link &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.service-now.com/&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
link &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getLink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; display &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
template&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;a href=&quot;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; url &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot;&amp;gt;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; display &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;/a&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;${URI}&lt;/code&gt;&amp;nbsp;creates a link to the current record using the text “Link”.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>ServiceNow: How to harden your instance</title>
      <link href="https://jace.pro/blog/servicenow-how-to-harden-your-instance/" />
      <updated>2018-09-05T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenow-how-to-harden-your-instance/</id>
      <content type="html">
				&lt;p&gt;I had to prepare an instance for some penetration testing. Turns out this is pretty easy.&lt;/p&gt;&lt;p&gt;To start with you need to know what ServiceNow requires of you. Here’s that&amp;nbsp;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0538598&quot; rel=&quot;noopener&quot;&gt;KB&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;At the time of writing you need these pre-requirements;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Instance must be on most recent patch of supported family.&lt;/li&gt;&lt;li&gt;Instance must be unpinned.&lt;/li&gt;&lt;li&gt;Instance cannot be production.&lt;/li&gt;&lt;li&gt;Instance must have High Security Plugin enabled.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0550654&quot; rel=&quot;noopener&quot;&gt;Instance must be hardened&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;You can test once per calendar year, extra testing incurs cost.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That hardening guide on the&amp;nbsp;&lt;s&gt;HI site&lt;/s&gt;&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/security/reference/instance-security-hardening-settings.html&quot; rel=&quot;noopener&quot;&gt;Docs&lt;/a&gt;&amp;nbsp;is thorough. We needed HI to “Check Whitelist Package Calls” and “Check Whitelist Member Calls”. This will be an issue if you’ve been granted access to use something the like&amp;nbsp;&lt;a href=&quot;https://stackoverflow.com/questions/48190244/read-zip-file-contents-using-zipfile-java-class-inside-script/48196453#48196453&quot; rel=&quot;noopener&quot;&gt;ZipFile java class&lt;/a&gt; to zip some files from the server.&lt;/p&gt;&lt;p&gt;There’s a great&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/app.do#!/share/contents/7852853_security_best_practice_audit?v=3.02&amp;amp;t=PRODUCT_DETAILS&quot; rel=&quot;noopener&quot;&gt;share&lt;/a&gt;&amp;nbsp;(&lt;a href=&quot;https://blog.jace.pro/uploads/SecurityBestPractiesAudit-V3_1.xml&quot; rel=&quot;noopener&quot;&gt;my copy&lt;/a&gt;) that gets you most the way there. I’d suggest starting there. You may&lt;br&gt;need to configure some properties like what file extensions you’ll allow but its easier to do this then to manually create each property. Also it checks for default accounts and passwords.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Service Portal: Viewing what is loaded on the page</title>
      <link href="https://jace.pro/blog/service-portal-viewing-what-is-loaded-on-the-page/" />
      <updated>2018-08-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-viewing-what-is-loaded-on-the-page/</id>
      <content type="html">
				&lt;p&gt;This is blatantly taken from &lt;a href=&quot;https://hi.service-now.com/kb_view.do?sys_kb_id=cc706ab7db19db4058dcf4621f96194e&quot; rel=&quot;noopener&quot;&gt;HI&lt;/a&gt; as this I think is useful enough to re-post nearly verbatim.&lt;/p&gt;&lt;p&gt;If you’ve ever needed to know which Client Scripts, UI Policies, and UI Actions are loading onto the page when you view a form or Service Catalog item in Service Portal, the information is readily available if&lt;br&gt;your know where to look.&lt;/p&gt;&lt;p&gt;If you are using the out-of-box “SC Catalog Item” and “Form” widgets, you can find this information in the widgets scope.&lt;/p&gt;&lt;p&gt;To view the widgets scope, hold down the CTRL key and right-click anywhere in the widget. Choose “Log to console: $scope”. Open your browser developer tools to the JavaScript console. Expand the “Object”&lt;br&gt;that has been dumped to the console.&lt;/p&gt;&lt;h1 id=&quot;form-widget&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-viewing-what-is-loaded-on-the-page/#form-widget&quot; class=&quot;heading-anchor&quot;&gt;“Form” widget&lt;/a&gt;&lt;/h1&gt;&lt;h3 id=&quot;client-scripts-are-located-at&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-viewing-what-is-loaded-on-the-page/#client-scripts-are-located-at&quot; class=&quot;heading-anchor&quot;&gt;Client Scripts are located at&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;data.f.client_script&lt;/code&gt;&lt;/p&gt;&lt;h3 id=&quot;ui-policies-are-located-at&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-viewing-what-is-loaded-on-the-page/#ui-policies-are-located-at&quot; class=&quot;heading-anchor&quot;&gt;UI Policies are located at&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;data.f.policy&lt;/code&gt;&lt;/p&gt;&lt;h3 id=&quot;ui-actions-are-located-at&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-viewing-what-is-loaded-on-the-page/#ui-actions-are-located-at&quot; class=&quot;heading-anchor&quot;&gt;UI Actions are located at&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;data.f._ui_actions&lt;/code&gt;&lt;/p&gt;&lt;h1 id=&quot;sc-catalog-item-widget&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-viewing-what-is-loaded-on-the-page/#sc-catalog-item-widget&quot; class=&quot;heading-anchor&quot;&gt;“SC Catalog Item” widget&lt;/a&gt;&lt;/h1&gt;&lt;h3 id=&quot;client-scripts-are-located-at-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-viewing-what-is-loaded-on-the-page/#client-scripts-are-located-at-1&quot; class=&quot;heading-anchor&quot;&gt;Client Scripts are located at&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;data.sc_cat_item.client_script&lt;/code&gt;&lt;/p&gt;&lt;h3 id=&quot;ui-policies-are-located-at-1&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-viewing-what-is-loaded-on-the-page/#ui-policies-are-located-at-1&quot; class=&quot;heading-anchor&quot;&gt;UI Policies are located at&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;data.sc_cat_item.policy&lt;/code&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Service Portal: Validating Date Format</title>
      <link href="https://jace.pro/blog/service-portal-validating-date-format/" />
      <updated>2018-08-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-validating-date-format/</id>
      <content type="html">
				&lt;p&gt;Someone had asked how to do some “&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=71098fa1db5cdbc01dcaf3231f961929&quot; rel=&quot;noopener&quot;&gt;How to verify a date format in service portal?&lt;/a&gt;”&lt;/p&gt;&lt;p&gt;This came up in a chat I was having this week.&lt;/p&gt;&lt;p&gt;To use the&amp;nbsp;&lt;code&gt;g_user_date_format&lt;/code&gt;,&amp;nbsp;&lt;code&gt;g_user_date_time_format&lt;/code&gt;&amp;nbsp;and &lt;code&gt;getDateFromFormat()&lt;/code&gt;, you would have to re-include the JS file that declares these variables.&lt;/p&gt;&lt;p&gt;To do that go to the widget where you get a failure message and add a new dependency to a new UI script where you copy/paste the code from &lt;a href=&quot;https://hi.service-now.com/scripts/calendar.js&quot; rel=&quot;noopener&quot;&gt;https://hi.service-now.com/scripts/calendar.js&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Then all your old calls ought to work as described in other posts.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// returns a date object you can test against for date/time &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// variables/fields&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDateFromFormat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_user_date_time_format&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// returns a date object you can test against for date &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// variables/fields&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDateFromFormat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_user_date_format&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>ServiceNow features I avoid, and you should too</title>
      <link href="https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/" />
      <updated>2018-08-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/</id>
      <content type="html">
				&lt;p&gt;From time to time I get thinking about what I avoid in this system. Below are my notes.&lt;/p&gt;&lt;h2 id=&quot;controlling-variables-state-with-fields&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#controlling-variables-state-with-fields&quot; class=&quot;heading-anchor&quot;&gt;Controlling variables state with fields&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;For example, setting the field as mandatory or readonly on&lt;br&gt;&lt;code&gt;item_option_new&lt;/code&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Problem with this is that this is yet another place to control this. You have the following already;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Variable Settings&lt;/li&gt;&lt;li&gt;Before Business Rule&lt;/li&gt;&lt;li&gt;Catalog UI Policy&lt;/li&gt;&lt;li&gt;Client Script&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;controlling-fields-state-with-fields&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#controlling-fields-state-with-fields&quot; class=&quot;heading-anchor&quot;&gt;Controlling fields state with fields&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;For example, setting the field as mandatory or readonly on&lt;br&gt;&lt;code&gt;sys_dictionary&lt;/code&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Problem with this is that this is yet another place to control this. You have the following already;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Field Settings&lt;/li&gt;&lt;li&gt;Data Policy (best as it controls the field in both the backend and the front end w/a checkbox)&lt;/li&gt;&lt;li&gt;ACL ()&lt;/li&gt;&lt;li&gt;Before Business Rule&lt;/li&gt;&lt;li&gt;UI Policy&lt;/li&gt;&lt;li&gt;Client Script&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;reverse-if-false-on-ui-policies-is-sketchy&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#reverse-if-false-on-ui-policies-is-sketchy&quot; class=&quot;heading-anchor&quot;&gt;“Reverse if false” on UI Policies is sketchy!&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;If you have UI policies condition that is based on the value of a select variable you will have problems as they will evaluate in weird ways.&lt;/p&gt;&lt;p&gt;Instead uncheck reverse if false, and make those UI Policies work well when the condition is met and abandon hope on the “Revese if false” bit.&lt;/p&gt;&lt;p&gt;Thanks Mav and Monicask&lt;/p&gt;&lt;h2 id=&quot;using-stage-fields-for-any-logic&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#using-stage-fields-for-any-logic&quot; class=&quot;heading-anchor&quot;&gt;Using stage fields for any logic&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I’ve found that this field is not as clearly set as you might think. So&lt;br&gt;I’ve started to use this only for the display of the stage to the user&lt;br&gt;and not for any other purpose.&lt;/p&gt;&lt;h2 id=&quot;putting-things-in-workflow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#putting-things-in-workflow&quot; class=&quot;heading-anchor&quot;&gt;Putting things in workflow&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Custom workflow activities (rest activity)&lt;/li&gt;&lt;li&gt;Notification activity &amp;gt; This is another place to configure emails but these emails are not subscribe-able, not easy to re-generate, and difficult to edit as you need to check out your workflow.&lt;/li&gt;&lt;li&gt;Switch activity &amp;gt; I try to minimize my need of this by keeping workflow logic concise. If that’s not possible, you can always do something like &lt;a href=&quot;https://snprotips.com/blog/2018/3/15/video-custom-output-transition-conditions-from-a-single-workflow-script-activity&quot; rel=&quot;noopener&quot;&gt;this&lt;/a&gt;&amp;nbsp;&amp;gt;&lt;br&gt;Had an issue where a workflow started with a begin then switch, and the switch did not build the context records properly so the workflow hung. Another reason to avoid Switches.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;execution-plans&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#execution-plans&quot; class=&quot;heading-anchor&quot;&gt;Execution Plans&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;These were used before Workflows. At the time I used them they were loaded with a bunch of issues. Workflow has a lot more flexibility.&lt;/p&gt;&lt;h2 id=&quot;global-business-rules&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#global-business-rules&quot; class=&quot;heading-anchor&quot;&gt;Global Business rules&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;These are loaded on every. single. record. They are bad, you should include the code you want to run not expect it to be available everywhere.&lt;/p&gt;&lt;h2 id=&quot;script-includes-written-like-global-business-rules&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#script-includes-written-like-global-business-rules&quot; class=&quot;heading-anchor&quot;&gt;Script includes written like Global Business rules&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Here this &lt;a href=&quot;https://codecreative.io/servicenow/interface-design-patterns-for-script-includes&quot; rel=&quot;noopener&quot;&gt;post&lt;/a&gt; goes over the following patterns;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Class Pattern&lt;/li&gt;&lt;li&gt;Function Pattern&lt;/li&gt;&lt;li&gt;Namespace Pattern&lt;/li&gt;&lt;li&gt;Global Include Pattern (not recommended)&lt;/li&gt;&lt;li&gt;Module Pattern&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Of these, I think the Function and Global Include Patterns should be avoided. The reason being is that they are really no better then a global Business Rule.&lt;/p&gt;&lt;h2 id=&quot;form-designer&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#form-designer&quot; class=&quot;heading-anchor&quot;&gt;Form Designer&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This gives generic column names to fields. Also this doesn’t name sections right, so some functions like&amp;nbsp;&lt;code&gt;g_form.setSectionDisplay(&#39;&#39;)&lt;/code&gt; fails to work.&lt;/p&gt;&lt;h2 id=&quot;catalog-item-designer&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#catalog-item-designer&quot; class=&quot;heading-anchor&quot;&gt;Catalog Item Designer&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Issues I’ve been told of;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;No logic available. Instead of an item with two varying options that dictate logic, you’ll need to make 2 different items for each set of logic.&lt;/li&gt;&lt;li&gt;Variables aren’t created on item_option_new, which brings up a slew of other problems.&lt;/li&gt;&lt;li&gt;Variables can’t have reference qualifiers.&lt;/li&gt;&lt;li&gt;Every change to the item, makes a new version of the item with a new sys_id so old links now no longer work.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;storing-credientials-in-code&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#storing-credientials-in-code&quot; class=&quot;heading-anchor&quot;&gt;Storing credientials in code&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Always store these in system properties as passwords or as credential records. If you store them in code the are in clear text and that’s never a good idea. At least if you put them in a credential record or a system property additional steps have to occur to decrypt the value.&lt;/p&gt;&lt;h2 id=&quot;outbound-rest-records-go-record-less&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#outbound-rest-records-go-record-less&quot; class=&quot;heading-anchor&quot;&gt;Outbound Rest Records (go record-less)&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is extra records to configure. More places to check for errors.&lt;/p&gt;&lt;h2 id=&quot;dom-manipulation&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#dom-manipulation&quot; class=&quot;heading-anchor&quot;&gt;Dom Manipulation&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;These types of changes generally break on any GUI update from SN. They are also unsupported on Service portal and Mobile.&lt;/p&gt;&lt;h2 id=&quot;avoid-using-dollar&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-features-i-avoid-and-you-should-too/#avoid-using-dollar&quot; class=&quot;heading-anchor&quot;&gt;Avoid using&amp;nbsp;&lt;code&gt;$&lt;/code&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;It’s come up often enough that when folks see&amp;nbsp;&lt;code&gt;$&lt;/code&gt;&amp;nbsp;in UI Scripts, UI Pages, and other parts of ServiceNow, they thing jQuery because that became popular and started to use that, ServiceNow assigned&amp;nbsp;&lt;code&gt;$&lt;/code&gt;&amp;nbsp;to prototypeJS, and not jQuery, as such, I’d just spell out &lt;code&gt;jQuery()&lt;/code&gt;&amp;nbsp;instead to be clear about what you are expecting to use.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>London Feature: Multi-Row Variable Sets</title>
      <link href="https://jace.pro/blog/london-feature-multi-row-variable-sets/" />
      <updated>2018-08-01T00:00:00Z</updated>
      <id>https://jace.pro/blog/london-feature-multi-row-variable-sets/</id>
      <content type="html">
				&lt;p&gt;I had to try this out and since the &lt;a href=&quot;https://docs.servicenow.com/bundle/london-it-service-management/page/product/service-catalog-management/task/t_CreateAVariableSet.html&quot; rel=&quot;noopener&quot;&gt;docs&lt;/a&gt; doesn’t show how it works here’s screenshot and video.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/lsRCvrwL03-650.webp 650w, https://jace.pro/img/lsRCvrwL03-960.webp 960w, https://jace.pro/img/lsRCvrwL03-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/lsRCvrwL03-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;342&quot; srcset=&quot;https://jace.pro/img/lsRCvrwL03-650.jpeg 650w, https://jace.pro/img/lsRCvrwL03-960.jpeg 960w, https://jace.pro/img/lsRCvrwL03-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;It’s pretty neat the content if you do a &lt;code&gt;g_form.getValue(&#39;variableSetName&#39;);&lt;/code&gt;&amp;nbsp;is a stringified JSON array.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;questions&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// returns below&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*
&quot;[
  {
    &#92;&quot;order&#92;&quot;:&#92;&quot;100&#92;&quot;,
    &#92;&quot;question&#92;&quot;:&#92;&quot;What do you need help with?&#92;&quot;,
    &#92;&quot;required&#92;&quot;:&#92;&quot;Yes&#92;&quot;,
    &#92;&quot;help_text&#92;&quot;:&#92;&quot;&#92;&quot;
  }
]&quot;
*/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Service Portal: Setting variables via URL</title>
      <link href="https://jace.pro/blog/service-portal-setting-variables-via-url/" />
      <updated>2018-07-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-setting-variables-via-url/</id>
      <content type="html">
				&lt;p&gt;The other day,&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=d1de646cdbc7d74423f4a345ca961916&quot; rel=&quot;noopener&quot;&gt;a post was made, asking how to do this&lt;/a&gt;&lt;br&gt;and I had to answer. I knew you could read the URL via&amp;nbsp;&lt;code&gt;$window&lt;/code&gt;&amp;nbsp;but that isn’t available in client scripts. How can this be done?&lt;/p&gt;&lt;p&gt;I came up with the following solution.&lt;/p&gt;&lt;p&gt;Create a Variable type “macro”, with a widget that has the following client script;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;$scope&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; $window&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// This is the controller, we&#39;ve included&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// $scope in the function above because&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// it&#39;s easy to work with&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// We are going to simplify accessing &lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// g_form within the client script by&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// setting it as a variable named g_form&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; g_form &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//We are going to simplify accessing&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// g_form within the HTML by setting&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// it as a $scope attribute&lt;/span&gt;
  $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;g_form &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// from here you can iterate over&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// the url params;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; params &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;?&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; paramsToString &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; paramsArr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; paramsToString&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;amp;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  paramsArr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;keyValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; key &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; keyValue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;=&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; keyValue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;key &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;=&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;decodeURIComponent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; message &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Setting &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; key &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; to &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      message &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; value &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; from url parameter.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Error setting field&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This will try to set all the attributes on the form so in the following url;&lt;/p&gt;&lt;p&gt;&lt;code&gt;https://dev32369.service-now.com/sp?id=sc_cat_item&amp;amp;sys_id=b480811a0f021300fc69cdbce1050ece&amp;amp;description=test&lt;/code&gt;&lt;/p&gt;&lt;p&gt;The following will tried to be set;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Parameter&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;id&lt;/td&gt;&lt;td&gt;&lt;code&gt;sc_cat_item&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;sys_id&lt;/td&gt;&lt;td&gt;&lt;code&gt;b480811a0f021300fc69cdbce1050ece&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;description&lt;/td&gt;&lt;td&gt;&lt;code&gt;test&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;P.S. Laurent Chicoine pointed out another way to do this for an individual variable. Thank you Laurent!&lt;/p&gt;&lt;p&gt;If you set the default value of the variable in question to this, then you can default it differently based on weather or not&amp;nbsp;&lt;code&gt;$sp&lt;/code&gt;&amp;nbsp;exists.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Service Portal&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// if $sp exists do this&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; $sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;var_short_description&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// UI16&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// if $sp causes an error cause its not defined do this&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;RP&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameterValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;var_short_description&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Service Portal: Add to cart is a PITA</title>
      <link href="https://jace.pro/blog/service-portal-add-to-cart-is-a-pita/" />
      <updated>2018-07-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-add-to-cart-is-a-pita/</id>
      <content type="html">
				&lt;p&gt;So it seems the first thing a lot of places have to do when setting up&lt;br&gt;the service portal is to re-setup two-step-checkout.&lt;/p&gt;&lt;p&gt;I don’t like looking it up. Here’s the steps I’ve followed to set it up;&lt;/p&gt;&lt;h2 id=&quot;adding-add-cart-on-the-form&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-add-to-cart-is-a-pita/#adding-add-cart-on-the-form&quot; class=&quot;heading-anchor&quot;&gt;Adding “Add Cart” on the form&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;On your catalog item widget, ctrl + right click the widget and open&lt;br&gt;the widget instance options.&lt;/li&gt;&lt;li&gt;Check “Show Add Cart Button”&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/seRjtQuiYl-568.webp 568w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/seRjtQuiYl-568.jpeg&quot; alt width=&quot;568&quot; height=&quot;503&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;adding-cart-on-the-header&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-add-to-cart-is-a-pita/#adding-cart-on-the-header&quot; class=&quot;heading-anchor&quot;&gt;Adding “Cart” on the header&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;From the Service Portal configuration page, select the Portal editor.&lt;/li&gt;&lt;li&gt;Goto the SP Header Menu&lt;/li&gt;&lt;li&gt;in the&amp;nbsp;&lt;em&gt;Additional options&lt;/em&gt;&amp;nbsp;section ensure you have the following content;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;enable_cart&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;displayValue&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/istanbul-servicenow-platform/page/build/service-portal/concept/enable-shopping-cart.html&quot; rel=&quot;noopener&quot;&gt;Docs&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Creating actionable email links</title>
      <link href="https://jace.pro/blog/creating-actionable-email-links/" />
      <updated>2018-07-03T00:00:00Z</updated>
      <id>https://jace.pro/blog/creating-actionable-email-links/</id>
      <content type="html">
				&lt;p&gt;The other day&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=37113a00dbc39704d58ea345ca9619e8&quot; rel=&quot;noopener&quot;&gt;Chris Perry asked&lt;/a&gt; how to create a link in a notification to assign a record to themselves and load up the newly assigned record.&lt;/p&gt;&lt;p&gt;To do this you’d have change your email to the user, so show the link and then load a page that knew the task and have it redirect. This is what I came up with. A UI page with the following code does it.&lt;/p&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jelly:core&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;glide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g2:&lt;/span&gt;evaluate&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jvar_unwrapped_url&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;jelly&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    var currentUser = gs.getUserID();
    var incidentFromURL = RP.getParameterValue(&#39;incident&#39;);
    var link = &#39;&#39;;
    var incident = new GlideRecord(&#39;incident&#39;);
    if(incident.get(&#39;number&#39;, incidentFromURL)) {
      incident.setValue(&#39;assigned_to&#39;, currentUser);
      incident.update();
      gs.addInfoMessage(incident.getDisplayValue() + &#39; has been updated.&#39;);
      //gs.sendRedirect(incident.getLink());
      link = incident.getLink();
    }
    link || &#39;incident.do?sysparm_query=number=&#39; + incidentFromURL;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g2:&lt;/span&gt;evaluate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  ${gs.getMessage(&quot;Redirecting to your the incident&quot;)}...
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;client-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/creating-actionable-email-links/#client-script&quot; class=&quot;heading-anchor&quot;&gt;Client Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;$[JS:jvar_unwrapped_url]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Zing Search engine does not respect underscore</title>
      <link href="https://jace.pro/blog/zing-search-engine-does-not-respect-underscore/" />
      <updated>2018-06-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/zing-search-engine-does-not-respect-underscore/</id>
      <content type="html">
				&lt;p&gt;I opened a HI ticket about this and they communicated that the global text search does not respect more non-alphanumeric characters.&lt;/p&gt;&lt;p&gt;It turns out that the keyword search doesn’t respect&amp;nbsp;&lt;code&gt;_&lt;/code&gt;&amp;nbsp;characters.&lt;/p&gt;&lt;p&gt;&lt;br&gt;Meaning if you search for “&lt;code&gt;this_custom_word&lt;/code&gt;” and you expect to find results, if one of those words is on the Stop list tables (&lt;code&gt;ts_index_stop&lt;/code&gt;, and&amp;nbsp;&lt;code&gt;ts_stop&lt;/code&gt;). It may not show up.&lt;/p&gt;&lt;p&gt;Something HI made me aware of. I askd if they have other delimiters, but they said &lt;code&gt;_&lt;/code&gt;&amp;nbsp;and space are delimiters.&lt;/p&gt;&lt;p&gt;If I get more information I’ll update this.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Creating a ServiceNow Property Page that rocks</title>
      <link href="https://jace.pro/blog/creating-a-servicenow-property-page-that-rocks/" />
      <updated>2018-06-12T00:00:00Z</updated>
      <id>https://jace.pro/blog/creating-a-servicenow-property-page-that-rocks/</id>
      <content type="html">
				&lt;p&gt;Sometimes you want a nice looking property page.&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_user_profile&amp;amp;user=68211265db981fc09c9ffb651f96192d&quot; rel=&quot;noopener&quot;&gt;Ben Phillips&lt;/a&gt; was nice enough to type this out in a slack channel. So I took it and put it here so I wouldn’t forget.&lt;/p&gt;&lt;p&gt;It is recommended/required to create a properties page for any custom applications you may make.&lt;/p&gt;&lt;h2 id=&quot;setting-up-the-module&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/creating-a-servicenow-property-page-that-rocks/#setting-up-the-module&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-06-11-custom-property-page/#setting-up-the-module&quot; rel=&quot;noopener&quot;&gt;Setting up the module&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Setting this up is pretty simple if you don’t need anything fancy. Just point the link to “&lt;code&gt;system_properties_ui.do&lt;/code&gt;” UI Page. Your link will look something like &lt;code&gt;system_properties_ui.do?sysparm_title=MyTitleHere&amp;amp;sysparm_category=MyCategoryHere&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/Jg8X5tTl2G-650.webp 650w, https://jace.pro/img/Jg8X5tTl2G-826.webp 826w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/Jg8X5tTl2G-650.jpeg&quot; alt width=&quot;826&quot; height=&quot;489&quot; srcset=&quot;https://jace.pro/img/Jg8X5tTl2G-650.jpeg 650w, https://jace.pro/img/Jg8X5tTl2G-826.jpeg 826w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;And the resulting properties page will look like this:&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/NdQp839BQv-650.webp 650w, https://jace.pro/img/NdQp839BQv-843.webp 843w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/NdQp839BQv-650.jpeg&quot; alt width=&quot;843&quot; height=&quot;439&quot; srcset=&quot;https://jace.pro/img/NdQp839BQv-650.jpeg 650w, https://jace.pro/img/NdQp839BQv-843.jpeg 843w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;making-a-custom-page&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/creating-a-servicenow-property-page-that-rocks/#making-a-custom-page&quot; class=&quot;heading-anchor&quot;&gt;Making a custom page&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;What if this doesn’t include all the things to verify you’ve configured&lt;br&gt;your options, or doesn’t look how you think it should? No worries.&lt;/p&gt;&lt;p&gt;You can simply make a UI Page to handle this.&lt;/p&gt;&lt;p&gt;To get your properties dynamically on your page, most of the magic is&lt;br&gt;done with just one glide jelly include:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;g2:system_properties_categorized category=&quot;MyCategoryHere&quot;/&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;This automatically prints out some HTML with the properties and values&lt;br&gt;from your property category. Since we don’t have access to alter the&lt;br&gt;elements this outputs and they are not styled like we want, I copied the&lt;br&gt;CSS from the Style Guide and pasted them into my custom properties UI&lt;br&gt;page. Here we’ve copied the props box styling from&amp;nbsp;&lt;code&gt;/login.do&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The form tag with the action and method is important because that tells&lt;br&gt;the form to run&amp;nbsp;&lt;code&gt;system_properties_update.do&lt;/code&gt;&amp;nbsp;when the user clicks Save,&lt;br&gt;more OOB functionality you can’t seem to touch. The referrer is also&lt;br&gt;important to guide what page loads after they click save.&lt;/p&gt;&lt;p&gt;Here’s an agnostic version of Ben’s markup in the HTML field of my UI&lt;br&gt;Page. Client Script and Processing Script panes are empty.&lt;/p&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jelly:core&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;glide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
        &lt;span class=&quot;token comment&quot;&gt;/* here I can script what happens onclick of the &quot;connect&quot; button. */&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
        &lt;span class=&quot;token selector&quot;&gt;.props&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 34em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;padding-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px solid lightgrey&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token selector&quot;&gt;#logo&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3em 1em 1em 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token selector&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 18px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token selector&quot;&gt;input, select&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100% &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
            &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 32px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 6px 9px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 13px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.42857&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #343d47&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #fff&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px solid #bdc0c4&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inset 0 1px 1px &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0.075&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;transition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-color ease-in-out 0.15s&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; box-shadow ease-in-out 0.15s&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token selector&quot;&gt;.center&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;margin-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;system_properties_update.do&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;POST&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;referer&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;referer&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;HIDDEN&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/this_ui_pages_url.do&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;logo&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
                &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;your_logo_135w.png&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;135&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;center&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g2:&lt;/span&gt;system_properties_categorized&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Your Property Category Name&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-group&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
                &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;form-field input_controls&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
                    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;listactions btn btn-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;submit&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;action&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;${gs.getMessage(&quot;Save&quot;)}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
                    $[SP]$[SP]&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;btn btn-default&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;connect&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Test Connection&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
                &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/VLgxCSUVoa-464.webp 464w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/VLgxCSUVoa-464.jpeg&quot; alt width=&quot;464&quot; height=&quot;442&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Special thanks to&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_user_profile&amp;amp;user=68211265db981fc09c9ffb651f96192d&quot; rel=&quot;noopener&quot;&gt;Ben Phillips&lt;/a&gt; and @nabil for the work on this.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>How to do reminders in ServiceNow</title>
      <link href="https://jace.pro/blog/how-to-do-reminders-in-servicenow/" />
      <updated>2018-06-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-do-reminders-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;This has come up often enough that it merits a post. Reminders of sorts can be set up a four ways in ServiceNow. This is the pros and cons of each.&lt;/p&gt;&lt;p&gt;There’s a four ways I know of doing this;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Scheduled Report&lt;/li&gt;&lt;li&gt;SLA Notifications&lt;/li&gt;&lt;li&gt;Scheduled Job (much like incident auto close)&lt;/li&gt;&lt;li&gt;Scheduled Events&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Each of these have their pro’s and con’s, lets get into it.&lt;/p&gt;&lt;h2 id=&quot;scheduled-report&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-do-reminders-in-servicenow/#scheduled-report&quot; class=&quot;heading-anchor&quot;&gt;Scheduled Report&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Probably the easiest to set up as it requires a report, and a scheduled report.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pro&lt;/th&gt;&lt;th&gt;Con&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;A Report, and Scheduled Report&lt;/td&gt;&lt;td&gt;Occurs at the frequency it scheduled&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;No coding required&lt;/td&gt;&lt;td&gt;Less configurable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;No email template to set up&lt;/td&gt;&lt;td&gt;Email is set based on report sharing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;sla-notifications&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-do-reminders-in-servicenow/#sla-notifications&quot; class=&quot;heading-anchor&quot;&gt;SLA Notifications&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pro&lt;/th&gt;&lt;th&gt;Con&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;No coding required&lt;/td&gt;&lt;td&gt;Occurs at the frequency it scheduled&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Specific to tasks&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;scheduled-job&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-do-reminders-in-servicenow/#scheduled-job&quot; class=&quot;heading-anchor&quot;&gt;Scheduled Job&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pro&lt;/th&gt;&lt;th&gt;Con&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Requires Scheduled Job, Event, Notification&lt;/td&gt;&lt;td&gt;Occurs at the frequency it scheduled&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Configurable due to coding&lt;/td&gt;&lt;td&gt;Requires coding&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;scheduled-events&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-do-reminders-in-servicenow/#scheduled-events&quot; class=&quot;heading-anchor&quot;&gt;Scheduled Events&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pro&lt;/th&gt;&lt;th&gt;Con&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Triggers when it’s supposed to&lt;/td&gt;&lt;td&gt;Requires Event, Notification, Business Rules, and possibly it’s own event queue&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Configurable&lt;/td&gt;&lt;td&gt;Requires coding&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Requires managing the scheduled events if the date/time changes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;scheduled-flow-trigger&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-do-reminders-in-servicenow/#scheduled-flow-trigger&quot; class=&quot;heading-anchor&quot;&gt;Scheduled Flow Trigger&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pro&lt;/th&gt;&lt;th&gt;Con&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Access be delegated using Scoped App and Flow Designer content filtering&lt;/td&gt;&lt;td&gt;Delegates can reak havoc, shouldn’t create them directly in prod.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Thansks @milligna!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Search trick on table</title>
      <link href="https://jace.pro/blog/search-trick-on-table/" />
      <updated>2018-05-26T00:00:00Z</updated>
      <id>https://jace.pro/blog/search-trick-on-table/</id>
      <content type="html">
				&lt;p&gt;During one the Let’s code happy hours, Josh Nerius made a point to call out this tip while looking for a table.&lt;/p&gt;&lt;p&gt;If you are used to typing&amp;nbsp;&lt;code&gt;sys_user&lt;/code&gt;&amp;nbsp;or&amp;nbsp;&lt;code&gt;user&lt;/code&gt;&amp;nbsp;and then scrolling and picking the table, this will save time. Try typing&amp;nbsp;&lt;code&gt;[sys_user]&lt;/code&gt;&amp;nbsp;instead as it will have an better match.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Slightlooney</title>
      <link href="https://jace.pro/blog/slightlooney/" />
      <updated>2018-05-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/slightlooney/</id>
      <content type="html">
				&lt;p&gt;A long time ago a man called “&lt;a href=&quot;https://community.servicenow.com/community?id=community_user_profile&amp;amp;user=6d5e8ae5dbd41fc09c9ffb651f96191a&quot; rel=&quot;noopener&quot;&gt;SlightlyLooney&lt;/a&gt;” used to write posts about some pretty awesome things.&lt;br&gt;I took some time a few weeks ago and made a list of his posts I rather enjoyed and thought other’s might find these posts useful. Without further ado;&lt;/p&gt;&lt;h2 id=&quot;posts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/slightlooney/#posts&quot; class=&quot;heading-anchor&quot;&gt;Posts&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=ac5e2aaddbd0dbc01dcaf3231f961941&quot; rel=&quot;noopener&quot;&gt;Why setters and getter are important&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=a60e2e2ddbd0dbc01dcaf3231f961931&quot; rel=&quot;noopener&quot;&gt;JS Question how do parseInt work&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=b14d2229dbd0dbc01dcaf3231f961917&quot; rel=&quot;noopener&quot;&gt;String Coercion&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=55bd6aa9dbd0dbc01dcaf3231f961900&quot; rel=&quot;noopener&quot;&gt;Boolean Coercion&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=e35c6aa1dbd0dbc01dcaf3231f961941&quot; rel=&quot;noopener&quot;&gt;JSUtil pitch&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=9e2e2a6ddbd0dbc01dcaf3231f96190b&quot; rel=&quot;noopener&quot;&gt;How business rules used to be cluttering global&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=067c62e1dbd0dbc01dcaf3231f9619e5&quot; rel=&quot;noopener&quot;&gt;How packages used to be&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=ee7ca2e1dbd0dbc01dcaf3231f9619be&quot; rel=&quot;noopener&quot;&gt;JS Undefined&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=9adce665dbd0dbc01dcaf3231f9619f7&quot; rel=&quot;noopener&quot;&gt;Weirdness with Java Strings coming into things&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=5d1deea5dbd0dbc01dcaf3231f961968&quot; rel=&quot;noopener&quot;&gt;GlideAggregate goodness&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=b5cc2265dbd0dbc01dcaf3231f9619c3&quot; rel=&quot;noopener&quot;&gt;AddQuery using dot walking&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=7fcce265dbd0dbc01dcaf3231f9619ad&quot; rel=&quot;noopener&quot;&gt;Dedupe array by using object&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=8c0e2a2ddbd0dbc01dcaf3231f961941&quot; rel=&quot;noopener&quot;&gt;Closures&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=a56ceaa1dbd0dbc01dcaf3231f9619fc&quot; rel=&quot;noopener&quot;&gt;Function to take any num of arguments&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=ca2ea66ddbd0dbc01dcaf3231f9619c2&quot; rel=&quot;noopener&quot;&gt;Chunking work in gliderecords&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=adcd22e9dbd0dbc01dcaf3231f96194a&quot; rel=&quot;noopener&quot;&gt;DeleteRecord and deleteMultiple&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=05cc2265dbd0dbc01dcaf3231f961918&quot; rel=&quot;noopener&quot;&gt;How sys_id is determined&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=aadc2a65dbd0dbc01dcaf3231f96196c&quot; rel=&quot;noopener&quot;&gt;Typeof and instanceof&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=518d2669dbd0dbc01dcaf3231f9619b2&quot; rel=&quot;noopener&quot;&gt;Representing things in js p1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=decc6265dbd0dbc01dcaf3231f9619eb&quot; rel=&quot;noopener&quot;&gt;Representing things in js p2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=c1bd2aa9dbd0dbc01dcaf3231f9619fe&quot; rel=&quot;noopener&quot;&gt;For in loops&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=b5bcea25dbd0dbc01dcaf3231f9619b2&quot; rel=&quot;noopener&quot;&gt;Global br vs script include&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide&quot; rel=&quot;noopener&quot;&gt;JS Guide&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=7e8de669dbd0dbc01dcaf3231f96195d&quot; rel=&quot;noopener&quot;&gt;Mid Server Heartbeats&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=1d1deea5dbd0dbc01dcaf3231f961967&quot; rel=&quot;noopener&quot;&gt;More weirdness with Java Strings&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=3f5c6aa1dbd0dbc01dcaf3231f961987&quot; rel=&quot;noopener&quot;&gt;Javascript semicolon insertion&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=c1fca2a5dbd0dbc01dcaf3231f961961&quot; rel=&quot;noopener&quot;&gt;More GlideAggregate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=7bbd6ea9dbd0dbc01dcaf3231f9619cc&quot; rel=&quot;noopener&quot;&gt;Variable Scoping&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=e94deee5dbd0dbc01dcaf3231f9619be&quot; rel=&quot;noopener&quot;&gt;Array goodness&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=00ccae25dbd0dbc01dcaf3231f9619ff&quot; rel=&quot;noopener&quot;&gt;Regex Series p1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=3a3deae5dbd0dbc01dcaf3231f9619e3&quot; rel=&quot;noopener&quot;&gt;Regex Series p2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=0eac2625dbd0dbc01dcaf3231f9619a6&quot; rel=&quot;noopener&quot;&gt;Regex Series p3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=917dee29dbd0dbc01dcaf3231f9619aa&quot; rel=&quot;noopener&quot;&gt;Regex Series p4&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=91bd6aa9dbd0dbc01dcaf3231f961981&quot; rel=&quot;noopener&quot;&gt;Regex Series p5&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=290daaa5dbd0dbc01dcaf3231f961981&quot; rel=&quot;noopener&quot;&gt;Regex Series p6&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=289ceae1dbd0dbc01dcaf3231f96192e&quot; rel=&quot;noopener&quot;&gt;Jelly 01&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=517dee29dbd0dbc01dcaf3231f961926&quot; rel=&quot;noopener&quot;&gt;Jelly 02&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=15bd2aa9dbd0dbc01dcaf3231f9619ff&quot; rel=&quot;noopener&quot;&gt;Jelly 03&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=a83eea6ddbd0dbc01dcaf3231f9619da&quot; rel=&quot;noopener&quot;&gt;Jelly 04&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=cafce2a5dbd0dbc01dcaf3231f9619c4&quot; rel=&quot;noopener&quot;&gt;Jelly 05&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=3fcce265dbd0dbc01dcaf3231f9619ac&quot; rel=&quot;noopener&quot;&gt;Jelly 06&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=6cecea65dbd0dbc01dcaf3231f961961&quot; rel=&quot;noopener&quot;&gt;Jelly 07&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=168da669dbd0dbc01dcaf3231f96198a&quot; rel=&quot;noopener&quot;&gt;Jelly 08&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=ae7ca2e1dbd0dbc01dcaf3231f9619bd&quot; rel=&quot;noopener&quot;&gt;Jelly 09&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=049d6a69dbd0dbc01dcaf3231f96195d&quot; rel=&quot;noopener&quot;&gt;Jelly 10&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=91ada2a9dbd0dbc01dcaf3231f961914&quot; rel=&quot;noopener&quot;&gt;Jelly 11&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=b84ee2addbd0dbc01dcaf3231f961903&quot; rel=&quot;noopener&quot;&gt;Jelly 12&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=613daae5dbd0dbc01dcaf3231f961947&quot; rel=&quot;noopener&quot;&gt;Jelly 13&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Prepare for an interview - it will be fun</title>
      <link href="https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/" />
      <updated>2018-05-18T00:00:00Z</updated>
      <id>https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/</id>
      <content type="html">
				&lt;p&gt;This is a extensive list of questions for both interviewers and interviewees when ServiceNow Development is involved.&lt;/p&gt;&lt;h1 id=&quot;interview-preparation&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#interview-preparation&quot; class=&quot;heading-anchor&quot;&gt;Interview Preparation&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Interviewing is exciting.&amp;nbsp; It’s a way to get uncomfortable and see what is available in job-land.&amp;nbsp; Something to keep in mind, interviews are a way for you and your employer to find a great fit for this position.&amp;nbsp;&lt;br&gt;The employer may be happy to have you, but you may not be happy in that position, so it’s crucial to get information from the interview to tell you about the technology, team, and the expectations they’ll have.&amp;nbsp; The expectations should have been set on the job posting, but it’s good to ask specifics about any you question. With that being said, when the technical questions are being asked, you should be able to see they understand the question and answer.&lt;/p&gt;&lt;p&gt;Interviews… You want to interview for a job as a ServiceNow Developer.&lt;/p&gt;&lt;h2 id=&quot;before-you-continue-i-urge-you-to-read-this-first&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#before-you-continue-i-urge-you-to-read-this-first&quot; class=&quot;heading-anchor&quot;&gt;Before you continue I urge you to read this first&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.kalzumeus.com/2012/01/23/salary-negotiation/&quot; rel=&quot;noopener&quot;&gt;https://www.kalzumeus.com/2012/01/23/salary-negotiation/&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;questions-to-ask-the-interviewer&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#questions-to-ask-the-interviewer&quot; class=&quot;heading-anchor&quot;&gt;Questions to ask the interviewer&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;technology-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#technology-questions&quot; class=&quot;heading-anchor&quot;&gt;Technology Questions&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;What release are you folks on?&lt;/li&gt;&lt;li&gt;How many licensed users are on the environment?&lt;/li&gt;&lt;li&gt;What are next major initiatives of the team?&lt;/li&gt;&lt;li&gt;What is your role in relation to the team?&lt;/li&gt;&lt;li&gt;How many people are on the team I’ll be working on?&lt;/li&gt;&lt;li&gt;What is the team culture like?&lt;/li&gt;&lt;li&gt;How does your team communicate and share ideas/files/code/assist one&lt;br&gt;another?&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;getting-expectations-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#getting-expectations-questions&quot; class=&quot;heading-anchor&quot;&gt;Getting Expectations Questions&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;What is the release process/schedule here?&lt;/li&gt;&lt;li&gt;Would the duties in this position require me to be on-call in any capacity?&lt;/li&gt;&lt;li&gt;Is this a work from home position or does it have this as a full or part time option?&lt;/li&gt;&lt;li&gt;What role would I be filling?&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;questions-to-be-prepared-to-answer&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#questions-to-be-prepared-to-answer&quot; class=&quot;heading-anchor&quot;&gt;Questions to be prepared to answer&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;behavioral-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#behavioral-questions&quot; class=&quot;heading-anchor&quot;&gt;Behavioral Questions&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Tell me about a time you’ve had to do something you disagreed with and how that interaction went.&lt;/li&gt;&lt;li&gt;Tell me about a time you’ve had been asked to fulfill a requirement and you went above and beyond.&lt;/li&gt;&lt;li&gt;Tell me about a time you’ve made a commitment and then failed to deliver.&lt;/li&gt;&lt;li&gt;Tell us about a project that didn’t have a positive outcome and how you handled the situation.&lt;/li&gt;&lt;li&gt;How would you handle a complaint brought to your attention?&lt;/li&gt;&lt;li&gt;What do you see that would be challenges working here?&lt;/li&gt;&lt;li&gt;Why should we hire you over the next candidate?&lt;/li&gt;&lt;li&gt;Why do you want to work here?&lt;/li&gt;&lt;li&gt;Have you worked on a on-call capacity before?&lt;/li&gt;&lt;li&gt;How do you educate yourself?&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;technical-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#technical-questions&quot; class=&quot;heading-anchor&quot;&gt;Technical Questions&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&quot;general-programming-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#general-programming-questions&quot; class=&quot;heading-anchor&quot;&gt;General Programming Questions&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;In all my interviews, I think I’ve only had a few of these, however they show up all the time on GlassDoor.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;How do you iterate over an array?&lt;/li&gt;&lt;li&gt;How can you give an object a dynamic property?&lt;/li&gt;&lt;li&gt;Given an array as an input: [1,2,3,4,5], return an array of modified values * 2 [1,4,6,8,10] e.g.&lt;/li&gt;&lt;li&gt;Sum the first n Fibonacci numbers [0,1,1,2,34,8,13,21,34,55,89,144,…]&lt;/li&gt;&lt;li&gt;find the first non repeating character from the string. e.g. [aaabbbcccdeee] returns d&lt;/li&gt;&lt;li&gt;Write javascript function for add(3)(4);? &lt;code&gt;function(a,b){return a+b;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Given a list 1,0,3,5,0,0,34,5,0,36 push all the zeroes to the end. Develop an in-place algorithm&lt;/li&gt;&lt;li&gt;How to Split a string&amp;nbsp;&lt;code&gt;var str = &#39;Left Right&#39;;str.split(&#39; &#39;);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Print integers 1-100 except for multiples of 3, print “Fizz”, multiples of 5 print “Buzz”, multiples of both print “FizzBuzz”&lt;/li&gt;&lt;li&gt;You have a function rand7() that generates a random integer from 1 to 7. Use it to write a function rand5() that generates a random integer from 1 to 5.&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;javascript-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#javascript-questions&quot; class=&quot;heading-anchor&quot;&gt;Javascript Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;What are the primitive types of JavaScript?&lt;/li&gt;&lt;li&gt;What’s the difference between a Value and a Reference?&lt;/li&gt;&lt;li&gt;What is variable hoisting?&lt;/li&gt;&lt;li&gt;Closures — Know that a function retains access to the scope that it was created in. Know what this lets us do, such as data hiding, memoization, and dynamic function generation.&lt;/li&gt;&lt;li&gt;&lt;code&gt;this&lt;/code&gt; — Know the rules of this binding. Know how it works, know how to figure out what it will be equal to in function, and know why it’s useful.&lt;/li&gt;&lt;li&gt;&lt;code&gt;new&lt;/code&gt; — Know how it relates to object oriented programming. Know what happens to a function called with new. Understand how the object generated by using new inherits from the function’s prototype property.&lt;/li&gt;&lt;li&gt;&lt;code&gt;apply&lt;/code&gt;,&amp;nbsp;&lt;code&gt;call&lt;/code&gt;,&amp;nbsp;&lt;code&gt;bind&lt;/code&gt; — Know how each of these functions work. Know how to use them. Know what they do to this.&lt;/li&gt;&lt;li&gt;Prototypes &amp;amp; Inheritance — Understand that inheritance in JavaScript works through the [[Prototype]] chain. Understand how to set up inheritance through functions and objects and how new helps us implement it. Know what the&amp;nbsp;&lt;strong&gt;proto&lt;/strong&gt;&amp;nbsp;and prototype properties are and what they do.&lt;/li&gt;&lt;li&gt;Asynchronous JS — Understand the event loop. Understand how the browser deals with user input, web requests, and events in general. Know how to recognize and correctly implement asynchronous code. Understand how JavaScript is both asynchronous and single-threaded.&lt;/li&gt;&lt;li&gt;Higher Order Functions — Understand that functions are first-class objects in JavaScript and what that means. Know that returning a function from another function is perfectly legal. Understand the techniques that closures and higher order functions allow us to use.&lt;/li&gt;&lt;li&gt;Understand how objects, arrays, and functions are copied and passed into functions. Know that the reference is what’s being copied. Understand that primitives are copied and passed by copying the value.&lt;/li&gt;&lt;li&gt;What’s the difference between global scope, function scope, and block scope?&lt;/li&gt;&lt;li&gt;Understand which variables are available where. Know how the JavaScript engine performs a variable lookup.&lt;/li&gt;&lt;li&gt;Understand that variable and function declarations are hoisted to the top of their available scope. Understand that function expressions are not hoisted.&lt;/li&gt;&lt;li&gt;Difference between&amp;nbsp;&lt;code&gt;==&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code&gt;===&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;css-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#css-questions&quot; class=&quot;heading-anchor&quot;&gt;CSS Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;What is the difference between display:none and visibility:hidden?&lt;/li&gt;&lt;li&gt;What can you tell me about Bootstrap?&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;xml-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#xml-questions&quot; class=&quot;heading-anchor&quot;&gt;XML Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;What is XML?&lt;/li&gt;&lt;li&gt;What is XPath?&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;web-services-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#web-services-questions&quot; class=&quot;heading-anchor&quot;&gt;Web Services Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;What is REST?&lt;/li&gt;&lt;li&gt;What is SOAP?&lt;/li&gt;&lt;li&gt;What protocol does REST use?&lt;/li&gt;&lt;li&gt;What are the differences between REST and SOAP?&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;servicenow-service-catalog-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#servicenow-service-catalog-questions&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow Service Catalog Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;What does Order guide refer to in Service Catalog?&lt;/li&gt;&lt;li&gt;What is the use of an Order Guide?&lt;/li&gt;&lt;li&gt;How will you define a Service catalog workflow?&lt;/li&gt;&lt;li&gt;What is a Content Item of service catalog?&lt;/li&gt;&lt;li&gt;What Service catalog displays?&lt;/li&gt;&lt;li&gt;Tell me about some Service catalog variable types.&lt;/li&gt;&lt;li&gt;What is workflow in relation to the catalog items and when it will&lt;br&gt;execute?&lt;/li&gt;&lt;li&gt;What is represented by order in Service catalog?&lt;/li&gt;&lt;li&gt;What is Catalog request workflow?&lt;/li&gt;&lt;li&gt;Which module is used for create a new Catalog item?&lt;/li&gt;&lt;li&gt;What is types of things are generally on a catalog?&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;servicenow-workflow-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#servicenow-workflow-questions&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow Workflow Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;Where are workflow versions captured?&lt;/li&gt;&lt;li&gt;If workflow is not published, only checked out will it be captured in update sets?&lt;/li&gt;&lt;li&gt;What does workflow timelines represent?&lt;/li&gt;&lt;li&gt;If prefix of Incident (e.g.&amp;nbsp;INC) needs to be changed, how would I do that?&lt;/li&gt;&lt;li&gt;Workflow editor and Service catalog differs in approval methodology? YES/NO, If yes, give explanation.&lt;/li&gt;&lt;li&gt;Can we validate workflow before publish?&lt;/li&gt;&lt;li&gt;If workflow checked out, can it be modified by any user? If yes or no, how?&lt;/li&gt;&lt;li&gt;What is true about Service catalog variables?&lt;/li&gt;&lt;li&gt;What is the true about SlushBucket?&lt;/li&gt;&lt;li&gt;Can you restart a workflow at a specific activity?&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;servicenow-update-sets-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#servicenow-update-sets-questions&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-16-interview/#servicenow-update-sets-questions&quot; rel=&quot;noopener&quot;&gt;ServiceNow Update Sets Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;Which field should be there in table that identifies that it should be captured in Update Sets?&lt;/li&gt;&lt;li&gt;Where are customizations stored?&lt;/li&gt;&lt;li&gt;What things are tracked in customizations?&lt;/li&gt;&lt;li&gt;What is the use of an Update Set?&lt;/li&gt;&lt;li&gt;Where update sets are stored?&lt;/li&gt;&lt;li&gt;What changes out of below would be applied in case of a merge update set?&lt;/li&gt;&lt;li&gt;What changes are not captured in update sets?&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;servicenow-email-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#servicenow-email-questions&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow Email Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;What is the default email size limit of inbound emails?&lt;/li&gt;&lt;li&gt;How ServiceNow system is configured to send an email notification after system Upgrade?&lt;/li&gt;&lt;li&gt;What all actions can be performed with inbound email?&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;servicenow-gui-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#servicenow-gui-questions&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow GUI Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;Scenario when an Interceptor can be used?&lt;/li&gt;&lt;li&gt;How to make an UI Policy global?&lt;/li&gt;&lt;li&gt;Button, Related Links and Context Menu these are?&lt;/li&gt;&lt;li&gt;How to define field attributes?&lt;/li&gt;&lt;li&gt;When does the “Submit” button appear on a form?&lt;/li&gt;&lt;li&gt;When do “UI Actions” appear on the form?&lt;/li&gt;&lt;li&gt;In which part of UI will you find help (link to wiki) option?&lt;/li&gt;&lt;li&gt;What is Icon of reference?&lt;/li&gt;&lt;li&gt;How to set display value for any field&lt;/li&gt;&lt;li&gt;If User customizes the Homepage, what happens?&lt;/li&gt;&lt;li&gt;How to change background color?&lt;/li&gt;&lt;li&gt;After save on form, which fields get stored in activities log?&lt;/li&gt;&lt;li&gt;Global Search option can be found in which part of UI?&lt;/li&gt;&lt;li&gt;How applications appear?&lt;/li&gt;&lt;li&gt;How do you modify the field behavior?&lt;/li&gt;&lt;li&gt;How do you enhance Homepage performance in case of gauges?&lt;/li&gt;&lt;li&gt;Where will you find option to edit a list?&lt;/li&gt;&lt;li&gt;What is listing in HomePage icon?&lt;/li&gt;&lt;li&gt;How to change the Development and Production instance color?&lt;/li&gt;&lt;li&gt;In which place admin can edit the HomePage?&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;servicenow-security-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#servicenow-security-questions&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow Security Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;What is security_admin role?&lt;/li&gt;&lt;li&gt;What do you mean by Elevated Privileges?&lt;/li&gt;&lt;li&gt;Why we need to impersonate?&lt;/li&gt;&lt;li&gt;If a user is not given filter_global or filter_admin role, what will be the impact?&lt;/li&gt;&lt;li&gt;ACLs can evaluate on what types of things?&lt;/li&gt;&lt;li&gt;How do ACLs executes, what are the steps they check?&lt;/li&gt;&lt;li&gt;ACL applies on?&lt;/li&gt;&lt;li&gt;In Service now which role is get option for approval a request or&lt;br&gt;same etc.?&lt;/li&gt;&lt;li&gt;What is a SSO integration?&lt;/li&gt;&lt;li&gt;What is Delegate User?&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;servicenow-database/integrations-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#servicenow-database/integrations-questions&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow Database/Integrations Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;What is Coalesce in import set?&lt;/li&gt;&lt;li&gt;Which is parent table for INC, CHG, PRB?&lt;/li&gt;&lt;li&gt;DB name for custom table?&lt;/li&gt;&lt;li&gt;Example for One to many relationship in table?&lt;/li&gt;&lt;li&gt;What is a Column and row in a table?&lt;/li&gt;&lt;li&gt;What is there stored in CMDB?&lt;/li&gt;&lt;li&gt;Where is data stored?&lt;/li&gt;&lt;li&gt;How can you import data into ServiceNow?&lt;/li&gt;&lt;li&gt;What is a sys_id?&lt;/li&gt;&lt;li&gt;Which module is used to see column structure in a table?&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;servicenow-service-level-agreement-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#servicenow-service-level-agreement-questions&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow Service Level Agreement Questions&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;What is SLA-Retroactive start?&lt;/li&gt;&lt;li&gt;What is Pause condition in SLA?&lt;/li&gt;&lt;li&gt;What is Table for SLA task?&lt;/li&gt;&lt;li&gt;What is Table for SLA Definitions?&lt;/li&gt;&lt;li&gt;SLA, OLA and UC are configured in which module?&lt;/li&gt;&lt;li&gt;What is the benefit of SLA?&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;servicenow-other&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#servicenow-other&quot; class=&quot;heading-anchor&quot;&gt;ServiceNow Other&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;How to arrange the Applications in left navigation to user?&lt;/li&gt;&lt;li&gt;How to see the current version of instance as an Admin?&lt;/li&gt;&lt;li&gt;Where can scripting occur in ServiceNow?&lt;/li&gt;&lt;li&gt;What is the difference between GlideRecord and GlideAggregate&lt;/li&gt;&lt;li&gt;Can you describe the different types of business rules?&lt;/li&gt;&lt;li&gt;What is the difference between a UI policy and UI action?&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;inspired-by&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/prepare-for-an-interview-it-will-be-fun/#inspired-by&quot; class=&quot;heading-anchor&quot;&gt;Inspired by&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenowguru.com/showcase/service-now-jedi/&quot; rel=&quot;noopener&quot;&gt;Are YOU a ServiceNow jedi?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://tekslate.com/servicenow-interview-questions-and-answers&quot; rel=&quot;noopener&quot;&gt;ServiceNow Interview Question &amp;amp; Answers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://servicenowstar.wordpress.com/2016/03/13/servicenow-intertview-question-anwers/&quot; rel=&quot;noopener&quot;&gt;servicenowstar&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Debugging with fix scripts</title>
      <link href="https://jace.pro/blog/debugging-with-fix-scripts/" />
      <updated>2018-05-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/debugging-with-fix-scripts/</id>
      <content type="html">
				&lt;p&gt;Debugging for me always starts with isolating the parts of the failing code.&lt;/p&gt;&lt;p&gt;The quickest way for me to find the issue varies but it almost always includes some variation of order of some of these;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Question&lt;/th&gt;&lt;th&gt;Debugging Tool&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Any errors or logs?&lt;/td&gt;&lt;td&gt;System Log&lt;/td&gt;&lt;td&gt;Navigate to System Logs &amp;gt; System Log. You can place alert statements in your business rule which can write information to the log.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Any errors or logs?&lt;/td&gt;&lt;td&gt;Debug Business Rule (Details)&lt;/td&gt;&lt;td&gt;Navigate to System Diagnostics &amp;gt; Debug Business Rule (Details). This debugging module displays the results business rules. Use this module to see if conditions are being met and values are being set as expected.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Did anything about this change?&lt;/td&gt;&lt;td&gt;&lt;code&gt;sys_update_xml&lt;/code&gt;&amp;nbsp;record list&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Can you reproduce the problem?&lt;/td&gt;&lt;td&gt;Background Scripts / Fix Scripts&lt;/td&gt;&lt;td&gt;See&amp;nbsp;&lt;a href=&quot;https://jace.pro/post/2018-05-13-debugging/#simulating-the-script&quot; rel=&quot;noopener&quot;&gt;Simulating the Script&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;simulating-the-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/debugging-with-fix-scripts/#simulating-the-script&quot; class=&quot;heading-anchor&quot;&gt;Simulating the script&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Different area’s have different variables available to them;&lt;/p&gt;&lt;p&gt;I’d copy the appropriate script, and then paste your code in the run function.&lt;/p&gt;&lt;h2 id=&quot;business-rules&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/debugging-with-fix-scripts/#business-rules&quot; class=&quot;heading-anchor&quot;&gt;Business Rules&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;incident&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//pick a table here&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sysId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//pick a record with a sysid here&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sysId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; previous &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
previous&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sysId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// paste your code below here&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// paste your code above here&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fix script &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;inbound-emails&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/debugging-with-fix-scripts/#inbound-emails&quot; class=&quot;heading-anchor&quot;&gt;Inbound Emails&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; emailSysId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//pick a sys_email record&#39;s sysid here&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; email &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_email&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emailSysId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;target_table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;instance&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;body_text&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lineArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;:&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        email&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;lineArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; lineArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;:&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; event &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// paste your code below here&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// paste your code above here&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fix script &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;script-actions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/debugging-with-fix-scripts/#script-actions&quot; class=&quot;heading-anchor&quot;&gt;Script Actions&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; eventSysId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//pick a sysevent record&#39;s sysid here&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; event &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysevent&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;eventSysId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;instance&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// paste your code below here&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// paste your code above here&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fix script &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;workflow-activity&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/debugging-with-fix-scripts/#workflow-activity&quot; class=&quot;heading-anchor&quot;&gt;Workflow Activity&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; workflowContextSysId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; workflowContext &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;wf_context&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;workflowContext&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;workflowContextSysId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;workflowContext&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;workflowConext&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; workflow &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;scratchpad&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;workflowContext&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;scratchpad&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// paste your code below here&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// paste your code above here&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fix script &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;transform-scripts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/debugging-with-fix-scripts/#transform-scripts&quot; class=&quot;heading-anchor&quot;&gt;Transform Scripts&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; importSetRowSysId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//sysid from your import table&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; targetTable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;// table to set the field on&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; targetSysId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// doesn&#39;t need to be set but if you know the record, you can set this sysid&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; importTable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_import_set_row&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;importTable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;importSetRowSysId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; source &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;importTable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_class_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    source&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;importTable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;targetTable&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;targetSysId &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;targetSysId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// paste your code below here (source, and target are set up from above)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// paste your code above here&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fix script &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;relationship-scripts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/debugging-with-fix-scripts/#relationship-scripts&quot; class=&quot;heading-anchor&quot;&gt;Relationship Scripts&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* global GlideAggregate, GlideRecord, gs */&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; parent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//applies to table&lt;/span&gt;
parent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;ad6ce161db560740d9ca72ec0f9619f5&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//specific record to test.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;task&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//queries from table&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//set the above gr&#39;s to have access like you would on the form.&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;refineQuery&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; parent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// paste your code below here&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;// paste your code above here&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;relationship &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; parent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;mail-scripts&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/debugging-with-fix-scripts/#mail-scripts&quot; class=&quot;heading-anchor&quot;&gt;Mail Scripts&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//set the current table name&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sysid &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//set the current sysid&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; eventsysid &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//set to the event sysid on a past sysevent&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//current, template, email, email_action, event&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;eventsysid&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  event &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysevent&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;eventsysid&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; current &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sysid&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; template &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;space&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; returnStr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; x&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;x&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;num&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;x&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      returnStr &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; returnStr&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; email &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;addAddress&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;setBody&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;setFrom&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;setReplyTo&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;reply&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Set ReplyTo: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; reply&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;setSubject&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;subj&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Set Subject to: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; subj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;addAddress&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;c&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//doing nothing this is a placeholder&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;setBody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;html&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// paste your code below here&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// paste your code above here&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;relationship &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUserName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;debugging-tools&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/debugging-with-fix-scripts/#debugging-tools&quot; class=&quot;heading-anchor&quot;&gt;Debugging Tools&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Debugging Tool&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;System Dictionary&lt;/td&gt;&lt;td&gt;Navigate to System Definition &amp;gt; Dictionary. The dictionary provides a list of all tables within your instance and can be invaluable when trying to locate information. One example is verifying the column exists on the table or a parent table of your record.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;System Log&lt;/td&gt;&lt;td&gt;Navigate to System Logs &amp;gt; System Log. You can place alert statements in your business rule which can write information to the log.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Debug Business Rule (Details)&lt;/td&gt;&lt;td&gt;Navigate to System Diagnostics &amp;gt; Debug Business Rule (Details). This debugging module displays the results business rules. Use this module to see if conditions are being met and values are being set as expected.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Alert Messages&lt;/td&gt;&lt;td&gt;There are system functions that allow you to print messages to the page, the field or the log file. See Scripting alert, info, and error messages.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Business Rule Examples&lt;/td&gt;&lt;td&gt;Sometimes you can find what you’re looking for in scripts others have written, including business rule error messages, or by building an OR query.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GlideRecord Information&lt;/td&gt;&lt;td&gt;This is the basic syntax used to query the database for information. See Using GlideRecord to query tables. GlideRecord also includes aggregation support.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Create Item from Script</title>
      <link href="https://jace.pro/blog/create-item-from-script/" />
      <updated>2018-05-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/create-item-from-script/</id>
      <content type="html">
				&lt;p&gt;I made this a while ago to save me some time of having to interact with the GUI. Works well enough, and will get updates to become a scoped app or script include… It’s a start.&lt;/p&gt;&lt;p&gt;Toss it in a fix script and adjust the bottom to your details while in the correct scope/update set. Then you have to figure out containers.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createCatalog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/*
     * Expecting a string (name)
     */&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; catalogExists &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_catalog&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    catalogExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;title&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    catalogExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;catalogExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; catalogExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sc_catalog &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_catalog&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_catalog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_catalog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;description &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//sc_catalog.sys_name = name;&lt;/span&gt;
        sc_catalog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_catalog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;active &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; sc_catalog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createCategory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; catalogId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/*
     * Expecting a string (name)
     * Expecting a string (catalogId)
     */&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; categoryExists &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_catalog&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    categoryExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;title&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    categoryExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;categoryExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; categoryExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sc_category &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_category&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_category&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_category&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_catalog &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; catalogId&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_category&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_category&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; sc_category&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;itemObj&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; categoryId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; catalogId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/*
     * Expecting an object (itemObj)
     * name
     * short_description
     * .
     * Expecting a string (categoryId)
     * Expecting a string (catalogId)
     */&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; itemExists &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_cat_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    itemExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; itemObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    itemExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;category&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; categoryId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    itemExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_catalogs&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; catalogId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    itemExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;itemExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; itemExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sc_cat_item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_cat_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_cat_item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_cat_item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;category &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; categoryId&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_cat_item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_catalogs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; catalogId&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_cat_item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; itemObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_cat_item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;short_description &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; itemObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;short_description&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        sc_cat_item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;description &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; itemObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;short_description&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; sc_cat_item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createVariables&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;varArr&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; itemId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/*
     * Expecting an array of object containing;
     * name (String)
     * question_text (String)
     * order (Number)
     * value (String)
     * type (Number)
     * *  1 = Yes/No
     * *  2 = MultiLine Text
     * *  3 = Multiple Choice (required &quot;choices&quot; = array {&quot;name&quot;,&quot;value&quot;,&quot;order&quot;})
     * *  4 = Numeric Scale (optional &quot;numericScaleMin&quot;, &quot;numericScaleMax&quot;)
     * *  5 = Select Box (required &quot;choices&quot; = array {&quot;name&quot;,&quot;value&quot;,&quot;order&quot;})
     * *  6 = Single Line Text
     * *  7 = Checkbox
     * *  8 = Reference (requires &quot;table&quot;, &quot;qual&quot;)
     * *  9 = Date
     * * 10 = Date/Time
     * * 11 = Label
     * * 12 = Break
     * * 13 = UNLISTED
     * * 14 = Macro
     * * 15 = UI Page
     * * 17 = Macro with Label
     * * 18 = Lookup Select Box (requires &quot;table&quot;, &quot;qual&quot;)
     * * 19 = Container Start
     * * 20 = Container End
     * * 21 = List Collector
     * * 22 = Lookup Multiple Choice
     * below are the additional required sometimes things
     * table (string)
     * choices (array) of {name, value, order}
     * qual (string)
     */&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; varArr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        varArr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;varArr&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    varArr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;varObj&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; variableSysid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; variableExists &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;item_option_new&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        variableExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        variableExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;cat_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; itemId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;variableExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;//return variableExists.sys_id;&lt;/span&gt;
            variableSysid &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; variableExists&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; variable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;item_option_new&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cat_item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; itemId&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;_&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;question_text &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;undefined&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;//varObj.question_text = varObj.name.replace(/_/g, &#39; &#39;);&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; arrayOfQs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;question_text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                arrayOfQs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;question&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;question_text &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;charAt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toUpperCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                  varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;question_text &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; question&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                  varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;question_text &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;question_text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;question_text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;question_text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;order &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;undefined&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sc_item_option &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;item_option_new&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;cat_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; itemId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;orderByDesc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setLimit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;order &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;order&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;order &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;order &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;order&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cat_item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; itemId&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;undefined&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;default_value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;default_html_value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reference &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lookup_table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;list_table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reference_qual &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;qual&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reference_qual_condition &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;qual&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            variableSysid &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; variable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;//return variable.insert();&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;choices&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;choices &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;undefined&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;choices &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;undefined&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;choices len: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;choices&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            varObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;choices&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; choice &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;question_choice&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                choice&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                choice&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;question &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; variableSysid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                choice&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                choice&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                choice&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;order &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;order&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                choice&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createUIPolicy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;itemId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; policy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;catalog_ui_policy&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    policy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;short_description &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Initial UI Policy&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    policy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;applies_to &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    policy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;catalog_item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; itemId&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; policyId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; policy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sc_item_option &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;item_option_new&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;cat_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; itemId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;orderByDesc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;order&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; policyAction &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;catalog_ui_policy_action&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        policyAction&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;catalog_item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; itemId&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        policyAction&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ui_policy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; policyId&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        policyAction&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;catalog_variable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;IO:&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        policyAction&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; catalog &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createCatalog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Custom Catalog&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; category &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createCategory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Categories are Silly&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; catalog&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Burger Request&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;short_description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Request a burger&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; category&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; catalog&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; variables &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;How delicious should it be?&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;choices&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Disgusting&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;disgusting&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;100&#39;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Tolerable&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;tolerable&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;200&#39;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Average&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;average&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;300&#39;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Good&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;good&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;400&#39;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Great&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;great&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;500&#39;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Special Instructions&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;


&lt;span class=&quot;token function&quot;&gt;createVariables&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;variables&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;createUIPolicy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>What is g_ck</title>
      <link href="https://jace.pro/blog/what-is-g_ck/" />
      <updated>2018-05-13T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-g_ck/</id>
      <content type="html">
				&lt;p&gt;What is&amp;nbsp;&lt;code&gt;g_ck&lt;/code&gt;&amp;nbsp;and why should I care?&lt;/p&gt;&lt;p&gt;&lt;code&gt;g_ck&lt;/code&gt;&amp;nbsp;is the current sessions token for authentication.&lt;/p&gt;&lt;h2 id=&quot;why-would-you-want-to-use-this-or-know-about-this&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-g_ck/#why-would-you-want-to-use-this-or-know-about-this&quot; class=&quot;heading-anchor&quot;&gt;Why would you want to use this or know about this&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;It’s useful for making rest requests while on the system to the system.&lt;/p&gt;&lt;p&gt;You might be thinking, “That seems silly”. Trust me it does. If you want to let a page load then have it load the rest of the content later, doing this is great.&lt;/p&gt;&lt;h2 id=&quot;how-do-i-use-it&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/what-is-g_ck/#how-do-i-use-it&quot; class=&quot;heading-anchor&quot;&gt;How do I use it&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;First, you have to make sure you have it, once you understand it, you can generate it if you don’t have access to it with the following code server side;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; g_ck &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSession&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSessionToken&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If on a UI Macro or UI Page, wrap that with&amp;nbsp;&lt;code&gt;&amp;lt;g:evaluate&amp;gt;&lt;/code&gt;&amp;nbsp;tags. If on a Service Portal, toss that in your server script.&lt;/p&gt;&lt;p&gt;Once you have it you can use it in place of authentication, if you omit it, you will be asked to authenticate.&lt;/p&gt;&lt;p&gt;Below is a slightly modified script generated from the API Explorer.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; requestBody &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; endpoint &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;origin &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/api/now/table/sys_user?&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
endpoint &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sysparm_query=active%3Dtrue&amp;amp;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
endpoint &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sysparm_fields=user_name&amp;amp;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
endpoint &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sysparm_limit=1&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; client&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;XMLHttpRequest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;get&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; endpoint&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setRequestHeader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Accept&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;application/json&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setRequestHeader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Content-Type&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;application/json&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Eg. UserName=&quot;admin&quot;, Password=&quot;admin&quot; for this code sample.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Generally this is what it shows.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// client.setRequestHeader(&#39;Authorization&#39;, &#39;Basic &#39;+btoa(&#39;admin&#39;+&#39;:&#39;+&#39;admin&#39;));&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// If you&#39;re already authenticated. You can use X-UserToken&lt;/span&gt;
client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setRequestHeader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;X-UserToken&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_ck&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onreadystatechange&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;readyState &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;DONE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// Going to console log instead&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// document.getElementById(&quot;response&quot;).innerHTML=this.status + this.response;&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requestBody&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*
 * Response I get
 * {&quot;result&quot;:[{&quot;user_name&quot;:&quot;abel.tuter&quot;}]}
 */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Service Portal: Broadcast, emit, and on, should I use them?</title>
      <link href="https://jace.pro/blog/service-portal-broadcast-emit-and-on-should-i-use-them/" />
      <updated>2018-05-13T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-broadcast-emit-and-on-should-i-use-them/</id>
      <content type="html">
				&lt;p&gt;Broadcasting messages seems great when you first learn about them and start to use them but it seems they, like everything, has its pros and cons. As such I’d avoid them for the following reasons.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;It’s all client side, meaning it can be spoofed and modified.&lt;/li&gt;&lt;li&gt;Its difficult to track down where something broke. Imagine you have 3 scripts all calling the same broadcast message to update a title or breadcrumb, and then one fails.&lt;/li&gt;&lt;li&gt;It’s hard for another developer to pick up where you left off, since there’s no clear cut methods to pass along data and information.&lt;/li&gt;&lt;li&gt;That leaves too lots of variables in how the data is delivered (browser plugins, internet speeds, etc) and can cause issues in production.&lt;/li&gt;&lt;li&gt;Its not scale-able, if you ever need to build around that, it becomes a monstrosity.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;One way around this would be to instead drop the data into a table, and then trigger a data refresh. With an event broadcast that will pull the data from the table, server side and update the data object., This also ensures someone’s connection does not time out in the middle of building the page, or isn’t blocked from working via a browser plugin&lt;/p&gt;&lt;p&gt;Another way would be to subscribe to the updates via a “Data Service”.&lt;br&gt;A full example can be seen on the&amp;nbsp;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW1088/creatorcon_18_CCW1088_5_sharing_data_and_events&quot; rel=&quot;noopener&quot;&gt;CCW1088 Lab&lt;/a&gt;.&lt;br&gt;Other examples around and about angular include;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://jsfiddle.net/jeremylikness/zba74rk3/&quot; rel=&quot;noopener&quot;&gt;Working example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://csharperimage.jeremylikness.com/2014/12/the-top-5-mistakes-angularjs-developers.html&quot; rel=&quot;noopener&quot;&gt;Blog about&lt;br&gt;it&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;But this is the gist of it, create a Angular Provider. Associate it to all the appropriate widgets. Below is the code from the lab above;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;amb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; watcher&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dataUpdatedHandlers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;table&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;watcher&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      watcher&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unsubscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; filter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; watcherChannel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; amb&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getChannelRW&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      amb&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      watcher &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; watcherChannel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        dataUpdatedHandlers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fn&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function-variable function&quot;&gt;onDataUpdated&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;callbackFn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      dataUpdatedHandlers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;callbackFn&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function-variable function&quot;&gt;initRecordWatcher&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;table&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then Add this JavaScript to each client controller on the widgets that will update the data;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;workspaceData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;initRecordWatcher&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;options&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;filter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
workspaceData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;onDataUpdated&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rows &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rows &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rows&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Add this JavaScript to the client controller on the widget that is displaying this data;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;workspaceData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;onDataUpdated&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;counters&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;runCounter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;counter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It does seem more complicated but then you don’t require&amp;nbsp;&lt;code&gt;$scope&lt;/code&gt;&amp;nbsp;or&lt;br&gt;&lt;code&gt;$rootScope&lt;/code&gt;&amp;nbsp;in your widgets and it should be more clear how they are&lt;br&gt;working together.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Knowledge 18 Notes</title>
      <link href="https://jace.pro/blog/knowledge-18-notes/" />
      <updated>2018-05-11T00:00:00Z</updated>
      <id>https://jace.pro/blog/knowledge-18-notes/</id>
      <content type="html">
				&lt;p&gt;I was very lucky to get to go to Knowledge18 and before I leave I just want to write this down as to not forget it.&lt;/p&gt;&lt;p&gt;Of the labs, I attended I had no technical difficulty with the wifi or content. Others did, but somehow not me.&lt;/p&gt;&lt;p&gt;Below I’ll go over the parts I think notable.&lt;/p&gt;&lt;h2 id=&quot;things-to-keep-in-mind-in-general&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#things-to-keep-in-mind-in-general&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#things-to-keep-in-mind-in-general&quot; rel=&quot;noopener&quot;&gt;Things to keep in mind in general&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;If there are repeating classes the later ones will be better but the speaker may have lost their voice&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Know the difference between the different types of events.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Breakouts are talks&lt;/li&gt;&lt;li&gt;Labs are step by step instruction with an instructor in the room to field questions and assist&lt;/li&gt;&lt;li&gt;Workshops are the same as labs but CreatorCon&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Look up the content of the event. If it’s not a current feature, it’s probably a new feature and might be a “this will be nice but you don’t get it for two releases”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Look up the presenters of the event. If it’s a partner, be careful as it may be more of a success story of how some implementation or product they used was successful.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;registration&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#registration&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#registration&quot; rel=&quot;noopener&quot;&gt;Registration&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Looks like they used&amp;nbsp;&lt;a href=&quot;http://g2planet.com/&quot; rel=&quot;noopener&quot;&gt;g2planet.com&lt;/a&gt;&amp;nbsp;which this year was pretty poor in my opinion. Hard to tell what you had already selected until you tried to add an event to the agenda&lt;/p&gt;&lt;p&gt;Suggestions to improve - Use what you used for 2016’s registration or make your own.&lt;/p&gt;&lt;h2 id=&quot;mobile-app&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#mobile-app&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#mobile-app&quot; rel=&quot;noopener&quot;&gt;Mobile App&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This was terrible. I literally wrote my schedule down each day as it was more convenient to do that. Thankfully none of my classes moved after I arrived.&lt;/p&gt;&lt;p&gt;Suggestions to improve - Don’t provide a mobile app. It would have been easier and then we’d been complaining about the website.&lt;/p&gt;&lt;h2 id=&quot;social-stuff&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#social-stuff&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#social-stuff&quot; rel=&quot;noopener&quot;&gt;Social Stuff&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This was great. With the way, my rep helped us get around and with all the folks.&lt;/p&gt;&lt;h2 id=&quot;labs&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#labs&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#labs&quot; rel=&quot;noopener&quot;&gt;Labs&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;lab1012-manage-duplicate-cis-effortlessly-to-keep-your-cmdb-clean&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#lab1012-manage-duplicate-cis-effortlessly-to-keep-your-cmdb-clean&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#lab1012-manage-duplicate-cis-effortlessly-to-keep-your-cmdb-clean&quot; rel=&quot;noopener&quot;&gt;LAB1012 Manage Duplicate CIs Effortlessly to Keep Your CMDB Clean&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This was an awesome lab. It showed a new feature that lets you merge and handle the remaining duplicate ci’s and their relationships in a very flexible way.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/knowledge18/LAB1012&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_search&amp;amp;q=LAB1012&quot; rel=&quot;noopener&quot;&gt;On-demand Library&lt;br&gt;URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccw0194-advanced-identification-engine-for-discovery&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#ccw0194-advanced-identification-engine-for-discovery&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#ccw0194-advanced-identifcation-engine-for-discovery&quot; rel=&quot;noopener&quot;&gt;CCW0194 Advanced Identification Engine for Discovery&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This really was all about using the horizontal patterns to discover configuration items which in my case would have been great three weeks prior as I had to self-teach myself it. It did confirm that I did learn this properly. There’s a great youtube video where they show how to do most of this.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW0194&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_search&amp;amp;q=CCW0194&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=R_49vxeGz78&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=R_49vxeGz78&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;lab0272-discovery-and-service-mapping-in-a-cloud-first-world-paas/iaas&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#lab0272-discovery-and-service-mapping-in-a-cloud-first-world-paas/iaas&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#lab0272-discovery-service-mapping-in-a-cloud-first-world-paasiaas&quot; rel=&quot;noopener&quot;&gt;LAB0272 Discovery &amp;amp; Service Mapping in a Cloud First World - PaaS/IaaS&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Again this was a great session had I taken it three weeks prior. It did confirm I did learn the right topics and it focused on the Cloud Services Plugin v2.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/knowledge18/LAB0272&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_search&amp;amp;q=LAB0272&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;lab0299-threat-hunting-awareness-and-sharing-with-security-operations&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#lab0299-threat-hunting-awareness-and-sharing-with-security-operations&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#lab0299-threat-hunting-awareness-and-sharing-with-security-operations&quot; rel=&quot;noopener&quot;&gt;LAB0299 Threat Hunting, Awareness and Sharing with Security Operations&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This was a nice overview of what the Secops application brings to ServiceNow. I thought of it to something akin to an overview of how GRC would work except you were guided along setting it up.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/knowledge18/LAB0299&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_search&amp;amp;q=LAB0299&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccw1088-service-portal-advanced-widget-development&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#ccw1088-service-portal-advanced-widget-development&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#ccw1088-service-portal-advanced-widget-development&quot; rel=&quot;noopener&quot;&gt;CCW1088 – Service Portal: Advanced Widget Development&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This lab was great in that I learned about the directives and how you can use them and share them across widgets. I also learned about a different way to have widgets communicate to each other than the broadcast and emitted events.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW1088&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_search&amp;amp;q=CCW1088&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;labs-i-need-to-check-out-yet&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#labs-i-need-to-check-out-yet&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#labs-i-need-to-check-out-yet&quot; rel=&quot;noopener&quot;&gt;Labs I need to check out yet&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;ccw0343-using-event-management-to-monitor-your-servicenow-instance-health&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#ccw0343-using-event-management-to-monitor-your-servicenow-instance-health&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#ccw0343-using-event-management-to-monitor-your-servicenow-instance-health&quot; rel=&quot;noopener&quot;&gt;CCW0343 Using Event Management to Monitor Your ServiceNow Instance Health&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW0343&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_search&amp;amp;q=CCW0343&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccw0504-agent-intelligence-deployment-best-practices&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#ccw0504-agent-intelligence-deployment-best-practices&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#ccw0504-agent-intelligence-deployment-best-practices&quot; rel=&quot;noopener&quot;&gt;CCW0504 Agent Intelligence - Deployment Best Practices&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW0504&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_search&amp;amp;q=CCW0504&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccw0471-test-driven-development-with-servicenow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#ccw0471-test-driven-development-with-servicenow&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#ccw0471-test-driven-development-with-servicenow&quot; rel=&quot;noopener&quot;&gt;CCW0471 Test Driven Development with ServiceNow&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW0471&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_search&amp;amp;q=CCW0471&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccw1224-best-practices-for-scripted-rest-apis&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#ccw1224-best-practices-for-scripted-rest-apis&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#ccw1224-best-practices-for-scripted-rest-apis&quot; rel=&quot;noopener&quot;&gt;CCW1224 Best Practices for Scripted REST APIs&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW1224&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_search&amp;amp;q=CCW1224&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccw0682-advanced-scripting-and-json&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#ccw0682-advanced-scripting-and-json&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#ccw0682-advanced-scripting-and-json&quot; rel=&quot;noopener&quot;&gt;CCW0682 Advanced Scripting and JSON&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW0682&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_search&amp;amp;q=CCW0682&quot; rel=&quot;noopener&quot;&gt;On-demand Library URL&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ccw1358-advanced-techniques-for-creating-high-usability-chatbot-conversations&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/knowledge-18-notes/#ccw1358-advanced-techniques-for-creating-high-usability-chatbot-conversations&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-05-10-k18/#ccw1358-advanced-techniques-for-creating-high-usability-chatbot-conversations&quot; rel=&quot;noopener&quot;&gt;CCW1358 Advanced Techniques for Creating High Usability Chatbot Conversations&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/event/creatorcon18/CCW1358&quot; rel=&quot;noopener&quot;&gt;Lab URL&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>How to get help faster on the ServiceNow community</title>
      <link href="https://jace.pro/blog/how-to-get-help-faster-on-the-servicenow-community/" />
      <updated>2018-05-09T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-get-help-faster-on-the-servicenow-community/</id>
      <content type="html">
				&lt;p&gt;Often I find questions posted on &lt;a href=&quot;https://community.servicenow.com/&quot; rel=&quot;noopener&quot;&gt;community.servicenow.com&lt;/a&gt;&amp;nbsp;to be disappointing in that a lot of extra back and forth has to happen before someone can get the help they desire.&lt;/p&gt;&lt;p&gt;I think following stack overflow’s “&lt;a href=&quot;https://stackoverflow.com/help/how-to-ask&quot; rel=&quot;noopener&quot;&gt;What makes a good question&lt;/a&gt;” page would help a lot of these posts. With that said, I’ve summarized what I think are the important bits. If you follow these recommendation, I think you will either a) get help sooner, b) solve your own problem and be on your faster then jotting down a partial question.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Make a good to-the-point title for the question or as StackOverflow says, “Write a title that summarizes the specific problem”. This helps because it lets those who&amp;nbsp;&lt;em&gt;can&lt;/em&gt;&amp;nbsp;help, know they can without going into the post. You might be thinking, I can’t sum it up it’s too complex. No problem, try to think how you’d ask a busy colleague, and put that into the subject. If you’re still having trouble, write the title last after all the details are fresh.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Good:&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=d84503addbd8dbc01dcaf3231f96191b&quot; rel=&quot;noopener&quot;&gt;Set Value form variable in the request form to Table field&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Good:&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=96db0be1db9cdbc01dcaf3231f961921&quot; rel=&quot;noopener&quot;&gt;How to disable attachment confirmations?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Good:&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=8cb9d5bedbf517004e1df4621f96198f&quot; rel=&quot;noopener&quot;&gt;How can I set an override reference qualifier to a group&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Bad: &lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=3b932544db8a9340fc5b7a9e0f9619a5&quot; rel=&quot;noopener&quot;&gt;NetApp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Bad:&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=19121900dbc29f404837f3231f9619b1&quot; rel=&quot;noopener&quot;&gt;Photo Masking&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Bad:&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=4b34dac8db461f403882fb651f961903&quot; rel=&quot;noopener&quot;&gt;Not Available for Module script&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Introduce the problem or write it as you might have explained using the&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Rubber_duck_debugging&quot; rel=&quot;noopener&quot;&gt;rubber duck debugging method&lt;/a&gt;. In the body of your question, start by expanding on the summary you put in the title. Explain how you encountered the problem you’re trying to solve, and any difficulties that have prevented you from solving it yourself. The first paragraph in your question is the second thing most readers will see, so make it as engaging and informative as possible.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Help others reproduce the problem. Include enough code to allow others to reproduce the problem.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Do not ask on a old thread for help to a new issue. Make a new question.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Code Search Updated</title>
      <link href="https://jace.pro/blog/code-search-updated/" />
      <updated>2018-04-23T00:00:00Z</updated>
      <id>https://jace.pro/blog/code-search-updated/</id>
      <content type="html">
				&lt;p&gt;After some back and forth between the creator of the&amp;nbsp;&lt;code&gt;sn_codesearch&lt;/code&gt;&amp;nbsp;app &lt;a href=&quot;https://community.servicenow.com/community?id=community_user_profile&amp;amp;user=bf225e65dbd81fc09c9ffb651f9619d6&quot; rel=&quot;noopener&quot;&gt;Cory Seering&lt;/a&gt; I have a better understanding of how this works.&lt;/p&gt;&lt;p&gt;This scoped app now uses its own search group to search 49 tables instead of the default 29.&lt;/p&gt;&lt;p&gt;It now includes everything OOB I can think of that could run code server/client side.&lt;/p&gt;&lt;h2 id=&quot;setup&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/code-search-updated/#setup&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-04-22-code-search-update/#setup&quot; rel=&quot;noopener&quot;&gt;Setup&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Open Studio on your environment&lt;/li&gt;&lt;li&gt;Import from source&lt;/li&gt;&lt;li&gt;Paste in the following URL:&lt;br&gt;&lt;a href=&quot;https://github.com/jacebenson/servicenow-code.git&quot; rel=&quot;noopener&quot;&gt;https://github.com/jacebenson/servicenow-code.git&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;update&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/code-search-updated/#update&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-04-22-code-search-update/#update&quot; rel=&quot;noopener&quot;&gt;Update&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;For those who already installed it;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Open Studio on your environment&lt;/li&gt;&lt;li&gt;Select&amp;nbsp;&lt;code&gt;Code&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Source Control-Apply Remote Changes&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This will make the app much smaller as it also moves the scopes from before.&lt;/p&gt;&lt;h2 id=&quot;usage&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/code-search-updated/#usage&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-04-22-code-search-update/#usage&quot; rel=&quot;noopener&quot;&gt;Usage&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;After you import this you can start to use it by navigating to&amp;nbsp;&lt;code&gt;/code&lt;/code&gt; on your instance.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Setting up Automated Testing Framework (ATF)</title>
      <link href="https://jace.pro/blog/setting-up-automated-testing-framework-atf/" />
      <updated>2018-04-20T00:00:00Z</updated>
      <id>https://jace.pro/blog/setting-up-automated-testing-framework-atf/</id>
      <content type="html">
				&lt;p&gt;Here’s our set up.&lt;/p&gt;&lt;h2 id=&quot;scheduled-runner&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-automated-testing-framework-atf/#scheduled-runner&quot; class=&quot;heading-anchor&quot;&gt;Scheduled Runner&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We created a local admin account in our non-productions.&lt;/p&gt;&lt;p&gt;Then we added a powershell script to launch the browser to the scheduled&lt;br&gt;runner.&lt;/p&gt;&lt;h2 id=&quot;test-configurations&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-automated-testing-framework-atf/#test-configurations&quot; class=&quot;heading-anchor&quot;&gt;Test configurations&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I prefer making the records user, the user’s membership as part of the&lt;br&gt;test to ensure I have a clean, working state instead of picking a user&lt;br&gt;who may have that role.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a base Test, a test you will have everyone start from that&lt;br&gt;does the following;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Create a user&lt;/li&gt;&lt;li&gt;Create a user membership&lt;/li&gt;&lt;li&gt;Impersonate the new user&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;Do the actual test.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;some-items-to-remember&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/setting-up-automated-testing-framework-atf/#some-items-to-remember&quot; class=&quot;heading-anchor&quot;&gt;Some items to remember&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Don’t test code you don’t own.&lt;/li&gt;&lt;li&gt;Test’s should be independent.&lt;/li&gt;&lt;li&gt;Test good/bad path. Meaning, if you add functionality for x group,&lt;br&gt;verify it doesn’t exist for y group.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=1a4e66addbd0dbc01dcaf3231f96192f&quot; rel=&quot;noopener&quot;&gt;Community Blog&lt;/a&gt; for further reading.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/other-document/nowforum/sydney/hands-on-lab2-automated-testing-framework.pdf&quot; rel=&quot;noopener&quot;&gt;Further Reading&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>How to work with Out of Box things</title>
      <link href="https://jace.pro/blog/how-to-work-with-out-of-box-things/" />
      <updated>2018-04-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-work-with-out-of-box-things/</id>
      <content type="html">
				&lt;p&gt;This is something I’ve been told differently how to manage out of the box records. I go over the pros and cons of them here.&lt;/p&gt;&lt;h1 id=&quot;ways-to-work-with-out-of-box-things-in-servicenow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-work-with-out-of-box-things/#ways-to-work-with-out-of-box-things-in-servicenow&quot; class=&quot;heading-anchor&quot;&gt;Ways to work with Out of Box things in ServiceNow&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;jakarta-and-later&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-work-with-out-of-box-things/#jakarta-and-later&quot; class=&quot;heading-anchor&quot;&gt;Jakarta and later&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You should always add comments why you are changing and out of box (oob) script and change as little as possible so when upgrading its clear what you changed and why its different.&lt;/p&gt;&lt;p&gt;With an update in Jakarta, the recommended approach is to update the OOB record with comments of why you’ve changed what you changed, so when you are comparing the upgraded version and the customized version its easy to see what you did and why you did it.&lt;/p&gt;&lt;h2 id=&quot;pre-jakara&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-work-with-out-of-box-things/#pre-jakara&quot; class=&quot;heading-anchor&quot;&gt;Pre-Jakara&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Knowing&amp;nbsp;&lt;em&gt;why&lt;/em&gt;&amp;nbsp;things were updated in the past might help understand more.&lt;/p&gt;&lt;h3 id=&quot;comment-oob-and-add-comments&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-work-with-out-of-box-things/#comment-oob-and-add-comments&quot; class=&quot;heading-anchor&quot;&gt;Comment OOB and add comments&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Comment out code, and adding notes stating why you change it. This had the following pros/cons&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pros&lt;/th&gt;&lt;th&gt;Cons&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Least amount of work&lt;/td&gt;&lt;td&gt;Upgrade would show any changes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;No referencing newly created scripts as new code is in oob record&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;inactive-and-make-new&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-work-with-out-of-box-things/#inactive-and-make-new&quot; class=&quot;heading-anchor&quot;&gt;Inactive and make new&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Inactivate if possible, then, Copy. This is hard to see if anything has been added to the OOB because deactivating doesn’t trigger a customer update.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pros&lt;/th&gt;&lt;th&gt;Cons&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Would never get accidentally upgraded&lt;/td&gt;&lt;td&gt;Upgrade will not show this as needing updating&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;May require many updates to the newly created thing if its referenced all over.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;comment-oob-add-comments-inactive-and-make-new&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-work-with-out-of-box-things/#comment-oob-add-comments-inactive-and-make-new&quot; class=&quot;heading-anchor&quot;&gt;Comment OOB, add comments, inactive and make new&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Add Comment stating you are making a copy, inactivate it. Copy it. This will ensure the OOB thing comes up in a skipped update.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pros&lt;/th&gt;&lt;th&gt;Cons&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Would never get accidentally upgraded&lt;/td&gt;&lt;td&gt;You still have to make a new thing&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Update difference still shows up so you can compare&lt;/td&gt;&lt;td&gt;May require lots of updates to the newly created thing if its referenced all over.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;further-reading-and-thanks&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-work-with-out-of-box-things/#further-reading-and-thanks&quot; class=&quot;heading-anchor&quot;&gt;Further Reading and Thanks&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-platform-administration/page/customer-support/task/t_ResolveASkippedUpdate.html&quot; rel=&quot;noopener&quot;&gt;Resolving a skipped update&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Thanks Andrew Barnes for the helpful input on this!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Certifications SN Offers</title>
      <link href="https://jace.pro/blog/certifications-sn-offers/" />
      <updated>2018-04-11T00:00:00Z</updated>
      <id>https://jace.pro/blog/certifications-sn-offers/</id>
      <content type="html">
				&lt;p&gt;After hearing about how certifications are changing I read up on it some. I found the site confusing, so I made this post to put the useful thoughts together.&lt;/p&gt;&lt;h1 id=&quot;certifications&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/certifications-sn-offers/#certifications&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-04-10-certifications/#certifications&quot; rel=&quot;noopener&quot;&gt;Certifications&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;As of 7/1/2018 you’re need to take a class to register for the exams&amp;nbsp;&lt;a href=&quot;https://jace.pro/post/2018-04-10-certifications/certifications-faq.pdf&quot; rel=&quot;noopener&quot;&gt;according to this pdf Old version&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/other-document/servicenow-certification-faq.pdf&quot; rel=&quot;noopener&quot;&gt;SN FAQ&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I was looking for a list of the certifications SN offers. As of today this is all I can find. Here’s my sources;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenow.com/services/training-and-certification/training-paths.html&quot; rel=&quot;noopener&quot;&gt;Training Paths&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenow.com/services/training-and-certification/training-paths/certified-implementation-specialist.html&quot; rel=&quot;noopener&quot;&gt;CIS Training Path&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=a2dc2a65dbd0dbc01dcaf3231f96197e&quot; rel=&quot;noopener&quot;&gt;Community Article&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.webassessor.com/wa.do?page=enterCatalog&amp;amp;branding=SERVICE_NOW&quot; rel=&quot;noopener&quot;&gt;Webassessor to register for exam&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cert&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Blueprint&lt;/th&gt;&lt;th&gt;Path&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CSA&lt;/td&gt;&lt;td&gt;Certified System Administrator&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/ServiceNow-Sys-Admin-Exam-Specs.pdf&quot; rel=&quot;noopener&quot;&gt;CSA Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=cc4919c6dbdeb700760a710439961966&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;CSA&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-ITSM&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - IT Service Management&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-itsm-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS ITSM Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=7f7c2b24db1e7300de3cdb85ca961931&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;ITSM&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-SM&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Service Mapping&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-sm-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS SM Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=6ebbefe0db1e7300de3cdb85ca961967&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;SM&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-SAM&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Software Asset Management&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-sam-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS SAM Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=da5113e8db9a7300de3cdb85ca9619cd&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;SAM&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-FM&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Finacial Management&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-fm-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS FM Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-CSM&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Customer Service Management&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-csm-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS CSM Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=cd8843e0db9a7300de3cdb85ca9619fe&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;CSM&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-HR&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Human Resources&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-hr-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS HR Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=14bd0fe4db9a7300de3cdb85ca961937&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;HR&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-VR&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Vulnerability Response&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-vr-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS VR Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=dfa1bb28db1e7300de3cdb85ca9619d5&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;VR&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-APM&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Application Portfolio Mgmt&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-apm-implementation-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS APM Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=fb09db24dbda7300de3cdb85ca9619b0&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;APM&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-CM&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Cloud Management&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-cm-exam-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS CM Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=111ca324db1e7300de3cdb85ca961906&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;CM&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-D&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Discovery&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-discovery-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS Discovery Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=06eaebecdbda7300de3cdb85ca961957&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;Discovery&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-EM&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Event Management&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-event-management-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS Event Management Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=264b2be0db1e7300de3cdb85ca9619bd&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;EM&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-FSM&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Field Service Management&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-fsm-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS FSM Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=d1490324db9a7300de3cdb85ca961938&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;FSM&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-PPM&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Project Portfolio Management&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-ppm-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS PPM Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=898857e0dbda7300de3cdb85ca96198c&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;PPM&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-RCI&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Risk and Compliance&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/cis-rci-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CIS RCI Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=9e9b43a4db9a7300de3cdb85ca9619c3&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;RCI&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-SIR&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Security Incident Response&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/blueprint-cis-sir-certification.pdf&quot; rel=&quot;noopener&quot;&gt;CIS SIR Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=24213328db1e7300de3cdb85ca96194b&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;SIR&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CIS-VRM&lt;/td&gt;&lt;td&gt;Certified Implementation Specialist - Vendor Risk Management&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/blueprint-cis-vrm.pdf&quot; rel=&quot;noopener&quot;&gt;CIS-VRM Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=876cc3a4db9a7300de3cdb85ca9619a4&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;VRM&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CAD&lt;/td&gt;&lt;td&gt;Certified Application Developer&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/exam-blueprint.pdf&quot; rel=&quot;noopener&quot;&gt;CAD Blueprint&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://nowlearning.service-now.com/lxp?id=overview&amp;amp;sys_id=39ade764db1e7300de3cdb85ca9619ee&amp;amp;type=path&quot; rel=&quot;noopener&quot;&gt;CAD&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;code&gt;*&lt;/code&gt;&amp;nbsp;No Certification Documentation could be found, but it’s listed as if&lt;br&gt;one exists on the&amp;nbsp;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/tp-certification-guide.pdf&quot; rel=&quot;noopener&quot;&gt;Certification Guide&lt;/a&gt;&amp;nbsp;-&amp;nbsp;&lt;a href=&quot;https://jace.pro/post/2018-04-10-certifications/certifications-guide.pdf&quot; rel=&quot;noopener&quot;&gt;locally incase SN updates/takes down original&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Learning Resources&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenow.com/services/training-and-certification/training-paths/saif.html&quot; rel=&quot;noopener&quot;&gt;Saif Fundamentals&lt;/a&gt;&amp;nbsp;$0&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenow.com/services/training-and-certification/foundations-elearning.html&quot; rel=&quot;noopener&quot;&gt;Servicenow Foundations eLearning&lt;/a&gt;&amp;nbsp;$0&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://nowlearning.service-now.com/&quot; rel=&quot;noopener&quot;&gt;NowLearning&lt;/a&gt;&amp;nbsp;$$$&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=9a376af4db017f4014d6fb2439961901&amp;amp;anchor=answer_48f25e0ddbc57780e0e80b55ca96197c&quot; rel=&quot;noopener&quot;&gt;post&lt;/a&gt;&amp;nbsp;was made about&amp;nbsp;&lt;strong&gt;why&lt;/strong&gt;&amp;nbsp;training is mandatory. I can’t find my source but some folks have said&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;@NOWsupport Why are certificates for all things changing to a “you must take a class to test” method on 7/1/2018 for #servicenow certs? - Jace Benson 👨‍💻⚙️ (@jacebenson) &lt;a href=&quot;https://twitter.com/jacebenson/status/1012773334176731141?ref_src=twsrc%5Etfw&quot;&gt;June 29, 2018&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;We’ve found that knowledge &amp;amp; experience gained in the classroom is critical for success in these roles - both on projects and in the pass rates of exams. Here are some details that may help: &lt;a href=&quot;https://t.co/hbASiiqqqd&quot;&gt;https://t.co/hbASiiqqqd&lt;/a&gt; - Now Support (@Nowsupport) &lt;a href=&quot;https://twitter.com/Nowsupport/status/1014278703495467008?ref_src=twsrc%5Etfw&quot;&gt;July 3, 2018&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Discovery Patterns for AWS</title>
      <link href="https://jace.pro/blog/discovery-patterns-for-aws/" />
      <updated>2018-04-05T00:00:00Z</updated>
      <id>https://jace.pro/blog/discovery-patterns-for-aws/</id>
      <content type="html">
				&lt;p&gt;Patterns are a new and interesting thing in ServiceNow.&lt;/p&gt;&lt;h1 id=&quot;discovery-patterns&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/discovery-patterns-for-aws/#discovery-patterns&quot; class=&quot;heading-anchor&quot;&gt;Discovery Patterns&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;This is a work in progress, but wanted to share as I will otherwise never get this down on paper.&lt;/p&gt;&lt;p&gt;First of all let me prefix this with what I had to do to trigger the pattern for AWS I wanted to use.&lt;/p&gt;&lt;p&gt;Also heres a link to the &lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-it-operations-management/page/product/discovery/task/t-UseSMPatternForDisco.html&quot; rel=&quot;noopener&quot;&gt;Docs&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;set-up&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/discovery-patterns-for-aws/#set-up&quot; class=&quot;heading-anchor&quot;&gt;Set up&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This &lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=c5ec8b29db9cdbc01dcaf3231f9619bf&quot; rel=&quot;noopener&quot;&gt;post&lt;/a&gt; and this&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=R_49vxeGz78&quot; rel=&quot;noopener&quot;&gt;YouTube video&lt;/a&gt; helped me understand how to get started.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a Process Classifier&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Relate the Horizontal Pattern and the&amp;nbsp;&lt;em&gt;specific pattern&lt;/em&gt;&amp;nbsp;listed on the same line.&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;Create a New Web Service/Region/Logical Data Center&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Default endpoint&amp;nbsp;&lt;code&gt;https://rds.amazonaws.com&lt;/code&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Regional endpoint&amp;nbsp;&lt;code&gt;us-west&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Logical Data Center [&lt;code&gt;cmp_discovery_ldc_config&lt;/code&gt;] record with the&lt;br&gt;aws account, data center related.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;From the aws account record Create the discovery schedule.&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Update the type to “Cloud services”&lt;/li&gt;&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;Update mid server capabilities to include&amp;nbsp;&lt;code&gt;all&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;understanding-patterns&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/discovery-patterns-for-aws/#understanding-patterns&quot; class=&quot;heading-anchor&quot;&gt;Understanding patterns&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Patterns use Groovy as a backend to parse any scripts in the steps.&lt;/p&gt;&lt;p&gt;That means you have no access to normal script includes to change the data.&lt;/p&gt;&lt;p&gt;With that being said you&amp;nbsp;&lt;em&gt;can&lt;/em&gt;&amp;nbsp;do most what you did in probes sensors in the pattern and it’s pre/post script handlers.&lt;/p&gt;&lt;p&gt;Patterns are limited to following actions;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Step&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Library Reference&lt;/td&gt;&lt;td&gt;This seems like it allows repeatable steps&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Match&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Get Process&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LDAP Query&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SNMP Query&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WMI Method Invocation&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WMI Query&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Parse Command Output&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Parse File&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Parse Variable&lt;/td&gt;&lt;td&gt;This is what is used to map a payload to fields&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Create Relation/Reference&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Filter Table&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Merge Table&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Transform Table&lt;/td&gt;&lt;td&gt;This is what is used to set fields if extra processing needs to be done&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Union Tables&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Change User&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Find Matching URL&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Parse URL&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Put File&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Set Parameter Value&lt;/td&gt;&lt;td&gt;This allows you to set reference-able variables in&amp;nbsp;&lt;code&gt;EVAL&lt;/code&gt;&amp;nbsp;scripts and other fields&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unchange User&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloud REST Call&lt;/td&gt;&lt;td&gt;This allows SN to make REST calls via the midserver to get data for this pattern&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;pre-/-post-processing-values&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/discovery-patterns-for-aws/#pre-/-post-processing-values&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2018-04-04-disco-patterns-aws/#pre-post-processing-values&quot; rel=&quot;noopener&quot;&gt;Pre / Post Processing values&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;These are records on [&lt;code&gt;sa_pattern_prepost_script&lt;/code&gt;] where you can massage the data before and after it writes to the database. This &lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=c0ac2225dbd0dbc01dcaf3231f96198d&quot; rel=&quot;noopener&quot;&gt;post&lt;/a&gt; was helpful in my understanding of it.&lt;/p&gt;&lt;p&gt;If you’re working with the payload, this is the payload for all the found responses. If you want to change a “account id” to a reference (&lt;code&gt;sys_id&lt;/code&gt;) of a account table, you’ll need to iterate over the array of the items and update each account_id.&lt;/p&gt;&lt;p&gt;This is my understanding of the payloadObj structure;&lt;/p&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    items&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            className&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmdb_ci_thing&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;the name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            u_account&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;account id you set here&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I handled this with a pre-script&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*
* 1. Pre sensor: You can change payload before it will be proccesed by Identification Engine.
*     Use IEJsonUtility to add relevant information to the payload
*     Input parameters in Pre sensor mode: payload, patternId
* 2. Post sensor: You can update/add missing info to the DB based on result (Json) from
*     Identification Engine
*     Output parameters in Post sensor mode: payload
*/&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; rtrn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//parsing the json string to a json object&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; payloadObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//put your business logic here&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;handleAccountData&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payloadObj&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;  &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;AWS Service Account ID to GR&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; returnStr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Did not replace account value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;i&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;payloadObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; payloadObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;className &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmdb_ci_cloud_database&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; account_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;u_account&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; saGR &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;aws_account_admin&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;saGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;account_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; account_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;values&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;u_account &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; saGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                returnStr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Did replace account value&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; returnStr&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
rtrn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&#39;status&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&#39;message&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleAccountData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string-property property&quot;&gt;&#39;isSuccess&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&#39;patternId&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; patternId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string-property property&quot;&gt;&#39;payload&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;payloadObj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//you can return a message and a status, on top of the input variables that you MUST return.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//returning the payload as a Json String is mandatory in case of a pre sensor script, and optional in case of post sensor script.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//if you want to stop the payload processing due to your business logic - you can set isSucess to false.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Instance options can change CSS</title>
      <link href="https://jace.pro/blog/instance-options-can-change-css/" />
      <updated>2018-03-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/instance-options-can-change-css/</id>
      <content type="html">
				&lt;p&gt;Turns out you can apply CSS to a instance record&lt;/p&gt;&lt;p&gt;I had no idea you could do this. This may have saved me from cloning widgets had I known.&lt;/p&gt;&lt;p&gt;If you&amp;nbsp;&lt;code&gt;ctrl+right-click&lt;/code&gt;&amp;nbsp;a widget and open the &lt;code&gt;Instance in Page Editor&lt;/code&gt;&amp;nbsp;you can apply CSS to supersede the css defined in the widget.&lt;/p&gt;&lt;p&gt;This is a short and sweet tip.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Where are the logs?</title>
      <link href="https://jace.pro/blog/where-are-the-logs/" />
      <updated>2018-02-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/where-are-the-logs/</id>
      <content type="html">
				&lt;p&gt;A&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/thread/292580&quot; rel=&quot;noopener&quot;&gt;post was made&lt;/a&gt;&amp;nbsp;and I was working through some security tasks of my one. I felt inspired to make a post about it. Below is a list of logs we need to review for ServiceNow&lt;/p&gt;&lt;p&gt;Can anyone provide us with Names, Tables, and Sources for the logs listed?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Authentication successes and failures&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://.service-now.com/sysevent_list.do?sysparm_query=sys_created_onONToday%40javascript%3Ags.daysAgoStart(0)%40javascript%3Ags.daysAgoEnd(0)%5Ename%3Dlogin&quot; rel=&quot;noopener&quot;&gt;Successes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://.service-now.com/sysevent_list.do?sysparm_query=sys_created_onONToday%40javascript%3Ags.daysAgoStart(0)%40javascript%3Ags.daysAgoEnd(0)%5Ename%3Dlogin.failed&quot; rel=&quot;noopener&quot;&gt;Failures&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Authorization (access control) failures&lt;/p&gt;&lt;ul&gt;&lt;li&gt;This would be verbose and you wouldn’t want this.&lt;/li&gt;&lt;li&gt;Do you mean code failures? They would show up as errors in the logs… but not explicitly listed for an acl, an code error.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Application startups and shutdowns&lt;/p&gt;&lt;ul&gt;&lt;li&gt;So. Application startups depends on what you mean “applications”. If you mean NODES than thats on &lt;code&gt;sys_cluster_state&lt;/code&gt;&amp;nbsp;in the payload look for&amp;nbsp;&lt;code&gt;servlet.started&lt;/code&gt; xml node.&lt;/li&gt;&lt;li&gt;If you mean something else I don’t think that’s how this works.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Configuration changes&lt;/p&gt;&lt;ul&gt;&lt;li&gt;this is available on&amp;nbsp;&lt;code&gt;sys_update_xml&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Changes to code files or memory&lt;/p&gt;&lt;ul&gt;&lt;li&gt;This is the same as configuration changes. Servicenow has no files you can change like a traditional server, at least not that we can access.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Application errors and system events e.g.&amp;nbsp;syntax and runtime errors, connectivity problems, performance issues, third party service error messages, file system errors&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://.service-now.com/syslog_list.do?sysparm_query=sys_created_onONToday%40javascript%3Ags.daysAgoStart(0)%40javascript%3Ags.daysAgoEnd(0)%5Elevel%3D2&quot; rel=&quot;noopener&quot;&gt;Errors&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Input validation failures e.g.&amp;nbsp;protocol violations, unacceptable encodings, invalid parameter names and values&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I’d guess this would be in the syslog_list, but I’m not sure the types of items you’re expecting.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Output validation failures e.g.&amp;nbsp;database record set mismatch, invalid data encoding&lt;/p&gt;&lt;ul&gt;&lt;li&gt;I’d guess this would be in the syslog_list, but I’m not sure the types of items you’re expecting.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Session management failures e.g.&amp;nbsp;cookie session identification value modification&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Acceptance of EULA/terms of use&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Not ootb, but if you applied &lt;a href=&quot;https://www.servicenowguru.com/system-definition/login-terms-conditions-dialog/&quot; rel=&quot;noopener&quot;&gt;servicenowguru’s&lt;/a&gt; then you’d look on the “Terms Acceptance table”. I can’t find the update set to download.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Personal data usage notification/consent&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Not sure what you mena by this. Do you mean like HIPAA, PII and the like? If so there’s nothing to say this ssn, or address is added as a comment in the system. You’d have to add that via a customization.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Attack detection e.g.&amp;nbsp;excessive authentication failures, file upload virus detection&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;See&amp;nbsp;&lt;a href=&quot;https://.service-now.com/sysevent_list.do?sysparm_query=sys_created_onONToday%40javascript%3Ags.daysAgoStart(0)%40javascript%3Ags.daysAgoEnd(0)%5Ename%3Dlogin.failed&quot; rel=&quot;noopener&quot;&gt;Auth Failures&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;There is no virus checking to my knowledge of uploaded files, you can control the upload types and sizes from these properties&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;glide.ui.strict_customer_uploaded_content_types&lt;/code&gt;&amp;nbsp;restricts what can be loaded vs downloaded to stop xss&lt;/li&gt;&lt;li&gt;&lt;code&gt;glide.security.file.mime_type.validation&lt;/code&gt;&amp;nbsp;restricts the file’s mime type on upload&lt;/li&gt;&lt;li&gt;&lt;code&gt;glide.ui.strict_customer_uploaded_static_content&lt;/code&gt;&amp;nbsp;restricts the files somehow&lt;/li&gt;&lt;li&gt;&lt;code&gt;glide.attachment.extensions&lt;/code&gt;&amp;nbsp;restricts the files extensions allowed to be uploaded&lt;/li&gt;&lt;li&gt;&lt;code&gt;glide.image_provider.security_enabled&lt;/code&gt; restricts access to uploads to authenticated users&lt;/li&gt;&lt;li&gt;&lt;code&gt;glide.ui.attachment.download_mime_types&lt;/code&gt;&amp;nbsp;restricts downloadable mime types&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Any other logs that would help identify suspicious, unacceptable, unexpected behavior, or other possibly malicious activities.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title> Versions of libraries</title>
      <link href="https://jace.pro/blog/versions-of-libraries/" />
      <updated>2018-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/versions-of-libraries/</id>
      <content type="html">
				&lt;p&gt;Sometimes you just want to know the versions of software you’re using.&lt;/p&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jelly:core&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;glide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;inline&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ng_head_inline_script.xml&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;requires&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;scripts/angular_includes_1.4.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;requires&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;styles/css_includes_doctype.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;requires&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;scripts/lib/jquery_includes.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;requires&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;styles/heisenberg/heisenberg_all.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;requires&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;scripts/heisenberg/heisenberg_all.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;evaluate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        var midVersion = gs.getProperty(&#39;mid.version&#39;).split(&#39;-&#39;)[0].toLowerCase();
        var ecma3Versions = [
          &#39;geneva&#39;,
          &#39;fuji&#39;,
          &#39;eureka&#39;,
          &#39;dublin&#39;,
          &#39;calgary&#39;,
          &#39;berlin&#39;
        ];
        var ecma3 = (function (){
          for(var version in ecma3Versions){
            if(midVersion == version){
              return true;
            }
          }
          return false;
        })();

        //var currentContext = Context.getCurrentContext(),
        //var rhinoVersion = currentContext.getImplementationVersion();
        if(ecma3){
          rhinoVersion = &quot;Unknown ECMA3 ES3&quot;;//https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino/Download_Rhino
        } else {
          rhinoVersion = &quot;1.7 R5 ECMA5 ES5&quot;;
        }
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;evaluate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
        &lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; document &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ready&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; jQuery &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;undefined&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#jQueryVersion&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;jQuery&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;jquery&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; angular &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;undefined&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#angularVersion&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;angular&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;version&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;full&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;

    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;container&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Instance Version:&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;rhinoVersion&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;${midVersion}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Rhino version:&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;rhinoVersion&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;${rhinoVersion}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;jQuery version:&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jQueryVersion&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;...&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Angular version:&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;angularVersion&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Bootstrap version:&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;bootstrapversion&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;col-md-6&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://docs.servicenow.com/bundle/kingston-servicenow-platform/page/build/service-portal/concept/portal-css.html&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;3.3.6&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;


&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>How to print out all the variables (OLD)</title>
      <link href="https://jace.pro/blog/how-to-print-out-all-the-variables-old/" />
      <updated>2018-02-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-to-print-out-all-the-variables-old/</id>
      <content type="html">
				&lt;p&gt;Let me preface this code with there is another way to do this but it’s undocumented.&lt;br&gt;That is using the&amp;nbsp;&lt;code&gt;GlideappVariablePoolQuestionSet&lt;/code&gt;&amp;nbsp;class as&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/thread/245758&quot; rel=&quot;noopener&quot;&gt;posted here by Chuck Tomasi&lt;/a&gt;.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*jslint eqeq: true*/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/*global GlideRecord, current*/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tablestart &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;div &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
tablestart &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;class=&quot;nmmcbg&quot; width=&quot;100%&quot; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
tablestart &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;style=&quot;background-color: LightGoldenRodYellow;&quot;&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; d &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;div style=&quot;display:inline;font-weight:bold;&quot; class=&quot;nmmcbold&quot;&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;/div&amp;gt;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_req_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;=&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; vtp &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; v &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_item_option_mtom&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;request_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;orderBy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_item_option.order&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;vtp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/*****************************
    This code dynamically pulls the questions from the forms in the order 
    they are presented (numerically) and then displays them in a 
    consistant readable format.
    Right now nothing links to any records but can with some slight 
    changes to this code.
  *****************************/&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; questionType &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;item_option_new&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    question &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;item_option_new&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    question &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; answer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;answer &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/*if the value is blank, don&#39;t print*/&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Yes / No&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Multi Line Text&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Multiple Choice&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Numeric Scale&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Select Box&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Single Line Text&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Check Box&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Reference&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; reftable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;item_option_new&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reference&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; referencegr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;reftable&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        referencegr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;=&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        referencegr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;referencegr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; referencegr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          vtb &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Date&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Date/Time&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;/*
    if (questionType == 11) { //Label
        //Do nothing
    }
    if (questionType == 12) { //Break
        //Do nothing
    }
    if (questionType == 13) { //Not Listed
        //Do nothing
    }
    if (questionType == 14) { //Macro
        //Do nothing
    }
    if (questionType == 15) { //UI Page
        //Do nothing
    }
    */&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Wide Single Line Text&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;/*
    if (questionType == 17) { //Macro with Label
        //Do nothing
    }
    */&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Lookup Select Box&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lstable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;item_option_new&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lookup_table&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lsbgr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lstable&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        lsbgr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;=&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        lsbgr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lsbgr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; lsbgr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;/*
    if (questionType == 19) { //Container Start
        //Do nothing
    }
    if (questionType == 20) { //Container End
        //Do nothing
    }
    */&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//List Collector&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; listarray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;,&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; listarray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; listtable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_item_option&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;item_option_new&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;list_table&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; igr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;listtable&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          igr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;=&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; listarray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          igr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;igr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;- &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; igr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//displayvalues&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;//vtp +=  &#39;i = &#39; + i + &#39;- &#39; + listarray&amp;lt;i&amp;gt; + &#39;&#92;n&#39;;//sys_ids&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;questionType &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;22&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Lookup Multiple Choice //success&lt;/span&gt;
        vtp &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; question &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; wn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
wn &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; tablestart&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
wn &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; vtp&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
wn &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;/div&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// then either write wn pre and appended with [code] tags in a journal &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// field, or put it in a mail script.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;further-reading&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-to-print-out-all-the-variables-old/#further-reading&quot; class=&quot;heading-anchor&quot;&gt;Further Reading&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/thread/149636#733514&quot; rel=&quot;noopener&quot;&gt;Community Thread&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Serice Portal Record Producer Redirects</title>
      <link href="https://jace.pro/blog/serice-portal-record-producer-redirects/" />
      <updated>2018-02-10T00:00:00Z</updated>
      <id>https://jace.pro/blog/serice-portal-record-producer-redirects/</id>
      <content type="html">
				&lt;p&gt;I was asked to set up the redirect from a record producer on the Service Portal. This was no problem in the past CMS, and the normal GUI. The &lt;a href=&quot;https://docs.servicenow.com/bundle/kingston-it-service-management/page/product/service-catalog-management/concept/c_PopulatingRecordData.html&quot; rel=&quot;noopener&quot;&gt;docs&lt;/a&gt; say it should be a simple line of code like;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;producer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url_redirect&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;home.do&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//for CMS and GUI redirects&lt;/span&gt;
producer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;portal_redirect&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;?id=page&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//for Service Portal redirects&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This&amp;nbsp;&lt;em&gt;does not&lt;/em&gt;&amp;nbsp;work unless you change the Instance Options&lt;br&gt;(control-right click, to get to “Instance Options”).&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/RgY9Vnd-Sx-650.webp 650w, https://jace.pro/img/RgY9Vnd-Sx-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/RgY9Vnd-Sx-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;584&quot; srcset=&quot;https://jace.pro/img/RgY9Vnd-Sx-650.jpeg 650w, https://jace.pro/img/RgY9Vnd-Sx-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;This is the same widget that renders your other catalog items and they all will redirect too.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Service Portal Pasting Images</title>
      <link href="https://jace.pro/blog/service-portal-pasting-images/" />
      <updated>2018-01-04T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-pasting-images/</id>
      <content type="html">
				&lt;p&gt;In the past I’ve tried to set up image pasting before with&amp;nbsp;&lt;a href=&quot;https://share.servicenow.com/app.do#/detailV2/4fa0b76f137826001d2abbf18144b065/overview&quot; rel=&quot;noopener&quot;&gt;Lars Tange’s solution&lt;/a&gt;, but that didn’t look how I liked it, as it had a specific field for pasting attachments.&lt;/p&gt;&lt;p&gt;I am cleaning up some of my former stories and thought I’d do a cusory search and found this &lt;a href=&quot;https://community.servicenow.com/message/1227642#1227642&quot; rel=&quot;noopener&quot;&gt;post&lt;/a&gt;&amp;nbsp;by Christopher Decugis about how he modified it to work. It works great. Below I’ll go over what you need to do if you want this on your portal as well.&lt;/p&gt;&lt;p&gt;We don’t have access to the body tag or the top level div, so you will have to do this for every page you want it to work on. We use three forms on our portal, so&amp;nbsp;&lt;code&gt;sc_cat_item&lt;/code&gt;,&amp;nbsp;&lt;code&gt;ticket&lt;/code&gt;, and&amp;nbsp;&lt;code&gt;form&lt;/code&gt;. You might have more, be aware you might have to add it for each page you want to allow it work on.&lt;/p&gt;&lt;p&gt;On the top level div that is displayed, you need to add &lt;code&gt;ng-paste=&quot;paste($event)&quot;&lt;/code&gt;&amp;nbsp;and then in the client script you need to add the following function;&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;$scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;paste&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; files &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; clipData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;originalEvent&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;clipboardData&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  angular&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;clipData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;clipData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;image.*&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      files&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;clipData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;key&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAsFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;attachmentHandler&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;onFileSelect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;files&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Pasting Images in the classic UI</title>
      <link href="https://jace.pro/blog/pasting-images-in-the-classic-ui/" />
      <updated>2018-01-04T00:00:00Z</updated>
      <id>https://jace.pro/blog/pasting-images-in-the-classic-ui/</id>
      <content type="html">
				&lt;p&gt;Sometime ago I looked for the ability to paste images onto a form and have it attach in both the &lt;a href=&quot;https://jace.pro/Service-Portal/Pasting-Images-on-the-Portal/&quot; rel=&quot;noopener&quot;&gt;portal&lt;/a&gt;, and the&lt;br&gt;standard ui.&lt;/p&gt;&lt;p&gt;I found this &lt;a href=&quot;https://community.servicenow.com/message/851339#851339&quot; rel=&quot;noopener&quot;&gt;post&lt;/a&gt;&amp;nbsp;back then by Niklas Johansson. I modified this some and got it to work by making the following modifications.&lt;/p&gt;&lt;p&gt;&lt;em&gt;This does not work on IE11 or IE Edge.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;This uses the following bits;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;UI Script (to load the functions to be called in client scripts)&lt;/li&gt;&lt;li&gt;Client Script(s) (to add the ability on a form by form basis, or all when associated to&amp;nbsp;&lt;code&gt;global&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Script Include (to handle the upload of the pasted file)&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;ui-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/pasting-images-in-the-classic-ui/#ui-script&quot; class=&quot;heading-anchor&quot;&gt;UI Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// API Name: addPasteEvent&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// UI Type: Desktop&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Global: Checked&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Script: Below&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Thanks to Marius Kluften for the Microsoft bits&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addPasteEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onpaste&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; items &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;clipboardData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//;  || event.originalEvent.clipboardData).items;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// find pasted image among pasted items&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; blob &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; imageIndex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; htmlIndex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// In case a html text is present in the clipboard&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                imageIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;text/html&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                htmlIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; imageFile&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;imageIndex &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            imageFile &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;imageIndex&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAsFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// If html is present in the clipboard, check if the object is from an office product (word/excel etc.)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;imageFile&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;htmlIndex &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                items&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;htmlIndex&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAsString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;schemas-microsoft-com:office:office&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;token function&quot;&gt;processBlob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;imageFile&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;processBlob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;imageFile&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;processBlob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;blob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;blob &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; reader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FileReader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        reader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onload&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;attachClipboardData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        reader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;readAsDataURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;blob&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;attachClipboardData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isNewRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearMessages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addErrorMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Save record to allowing pasting of images&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; recordSysID &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUniqueValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; recordTable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTableName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; temp &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;data:&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; contentType &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; temp&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; fileName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Screenshot.&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; contentType&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;/&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; content &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; temp&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;base64,&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; attach &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideAjax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;pasteAttachment&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Specify the script include name after completing step 2&lt;/span&gt;
        attach&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;attachScreenshot&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        attach&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_tableName&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; recordTable&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        attach&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; recordSysID&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        attach&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_content_type&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; contentType&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        attach&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_value&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; content&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        attach&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_filename&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fileName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        attach&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getXML&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;getResponse&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getResponse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearMessages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addInfoMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Screenshot attached.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;client-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/pasting-images-in-the-classic-ui/#client-script&quot; class=&quot;heading-anchor&quot;&gt;Client Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onLoad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Type appropriate comment here, and begin script below&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//will not work on service portal as it requires&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;addPasteEvent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;script-include&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/pasting-images-in-the-classic-ui/#script-include&quot; class=&quot;heading-anchor&quot;&gt;Script Include&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Name pasteAttachment&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Client Callable: Checked&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; pasteAttachment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Class&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
pasteAttachment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extendsObject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;AbstractAjaxProcessor&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;attachScreenshot&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; StringUtil &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; GlideStringUtil&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; StringUtil&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;base64DecodeAsBytes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_value&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tableName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_tableName&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; filename &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_filename&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; content_type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_content_type&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; attachment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Attachment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    attachment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tableName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sys_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filename&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; content_type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;pasteAttachment&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;history&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/pasting-images-in-the-classic-ui/#history&quot; class=&quot;heading-anchor&quot;&gt;History&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;2018-11-10: This was updated to clarify options on the UI&lt;br&gt;Script and the Script Include.&lt;/li&gt;&lt;li&gt;2018-11-12: Thanks Marius Kluften for the update about&lt;br&gt;pasting the Microsoft nuances.&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>RIP Wiki</title>
      <link href="https://jace.pro/blog/rip-wiki/" />
      <updated>2017-12-09T00:00:00Z</updated>
      <id>https://jace.pro/blog/rip-wiki/</id>
      <content type="html">
				&lt;p&gt;With all the announcements that ServiceNow is ending their Wiki, it makes me a little sad. I had once contributed to the pages before it locked down. With that being said, I learned a lot from the wiki. This was the second best resource next to the old joomla forum.&lt;/p&gt;&lt;p&gt;A lot of nights at my help desk job I remember visiting the “Recent Changes” to see new features that were made before they could get locked down. I found ServiceNow updates a little earlier than I should have because of this.&lt;/p&gt;&lt;p&gt;To get ready for this post I looked at the wayback machine to remember.&lt;/p&gt;&lt;p&gt;ServiceNow Wiki, you will be missed.&lt;/p&gt;&lt;p&gt;Take a look into the past&lt;/p&gt;&lt;h2 id=&quot;wiki-2006&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rip-wiki/#wiki-2006&quot; class=&quot;heading-anchor&quot;&gt;Wiki ~2006&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/0qnbra09O1-650.webp 650w, https://jace.pro/img/0qnbra09O1-960.webp 960w, https://jace.pro/img/0qnbra09O1-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/0qnbra09O1-650.jpeg&quot; alt=&quot;ServiceNow Wiki&#39;s site (mediawiki) 2007&quot; title=&quot;ServiceNow Wiki&#39;s site (mediawiki) 2007&quot; width=&quot;1400&quot; height=&quot;695&quot; srcset=&quot;https://jace.pro/img/0qnbra09O1-650.jpeg 650w, https://jace.pro/img/0qnbra09O1-960.jpeg 960w, https://jace.pro/img/0qnbra09O1-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;ServiceNow Wiki&#39;s site (mediawiki) 2007&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20060818164044/http://wiki.service-now.com:80/index.php?title=Main_Page&quot; rel=&quot;noopener&quot;&gt;wiki.service-now.com circa 2006&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;wiki-2012&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rip-wiki/#wiki-2012&quot; class=&quot;heading-anchor&quot;&gt;Wiki ~2012&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/V8x0LLn57C-650.webp 650w, https://jace.pro/img/V8x0LLn57C-960.webp 960w, https://jace.pro/img/V8x0LLn57C-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/V8x0LLn57C-650.jpeg&quot; alt=&quot;ServiceNow Wiki&#39;s site (mediawiki) 2012&quot; title=&quot;ServiceNow Wiki&#39;s site (mediawiki) 2012&quot; width=&quot;1400&quot; height=&quot;679&quot; srcset=&quot;https://jace.pro/img/V8x0LLn57C-650.jpeg 650w, https://jace.pro/img/V8x0LLn57C-960.jpeg 960w, https://jace.pro/img/V8x0LLn57C-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;ServiceNow Wiki&#39;s site (mediawiki) 2012&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20120630005208/http://wiki.servicenow.com:80/index.php?title=Main_Page&quot; rel=&quot;noopener&quot;&gt;wiki.servicenow.com circa 2012&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;wiki-2017&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/rip-wiki/#wiki-2017&quot; class=&quot;heading-anchor&quot;&gt;Wiki ~2017&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/sRnKmguPXs-650.webp 650w, https://jace.pro/img/sRnKmguPXs-960.webp 960w, https://jace.pro/img/sRnKmguPXs-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/sRnKmguPXs-650.jpeg&quot; alt=&quot;ServiceNow Wiki&#39;s site (mediawiki) 2017&quot; title=&quot;ServiceNow Wiki&#39;s site (mediawiki) 2017&quot; width=&quot;1400&quot; height=&quot;663&quot; srcset=&quot;https://jace.pro/img/sRnKmguPXs-650.jpeg 650w, https://jace.pro/img/sRnKmguPXs-960.jpeg 960w, https://jace.pro/img/sRnKmguPXs-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;ServiceNow Wiki&#39;s site (mediawiki) 2017&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20171208185714/http://wiki.servicenow.com/index.php?title=Main_Page#gsc.tab=0&quot; rel=&quot;noopener&quot;&gt;wiki.servicenow.com circa 2017&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>ServiceNow licensing (circa 2017)</title>
      <link href="https://jace.pro/blog/servicenow-licensing-circa-2017/" />
      <updated>2017-12-03T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenow-licensing-circa-2017/</id>
      <content type="html">
				&lt;p&gt;This is out of date. This was written in 2017 and it’s been years since then. Models have changed some but I am keeping this post up as it may be useful to some. If you have licensing details you would like to share I’d love to hear about them. If you have public sources I’m even more curious. Reach out to me!&lt;/p&gt;&lt;h2 id=&quot;original-content&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#original-content&quot; class=&quot;heading-anchor&quot;&gt;Original Content&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Before I say anything about ServiceNow Licensing is that your milage may vary and you’ll need to ask your account representative or sales representative to get the correct answer about if something is or is not included with your license.&lt;/p&gt;&lt;p&gt;With that being said, ServiceNow’s licensing has a been a pain point for some on the community for years. As of 2017-10-17 theres a lot of information and since every company has it’s own contract with ServiceNow, it seems they don’t generally reply officially to any of them, however I’ll try to aggregate the important bits below.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Question&lt;/th&gt;&lt;th&gt;Related info&lt;/th&gt;&lt;th&gt;Link&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;What roles exist for most Products SN licenses?&lt;/td&gt;&lt;td&gt;There are generally three roles; Requesters, Approvers, *Fulfillers-&lt;/td&gt;&lt;td&gt;Communigy ThreadWiki Link to Counting Licenses&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The documentation about their licensing is this old&amp;nbsp;&lt;a href=&quot;https://web.archive.org/web/20160924200229/http://wiki.servicenow.com:80/index.php?title=Counting_Licensed_Users&quot; rel=&quot;noopener&quot;&gt;wiki page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Publicly available licensing information&lt;/p&gt;&lt;p&gt;With that being said, this information is based on the sources I found publicly available via&amp;nbsp;&lt;a href=&quot;http://lmgtfy.com/?q=service-now.com+agreement+filetype%3Apdf&quot; rel=&quot;noopener&quot;&gt;Google&lt;/a&gt;. I found the following with that exact search;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://rivcocob.org/agenda/2016/03_29_16_files/03-27.pdf&quot; rel=&quot;noopener&quot;&gt;City of Riverside, CA&lt;/a&gt;&amp;nbsp;(page 8)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.douglas.co.us/archives/documents/contracts/2013_fourthqtr/Contract%20Copies/Service%20Now-533130.pdf&quot; rel=&quot;noopener&quot;&gt;Douglas County Colorado&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Enterprise&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://ociowa.atlassian.net/wiki/download/attachments/14614532/OCIO%20UA%20thru%20CC%20%20051915.pdf?api=v2&quot; rel=&quot;noopener&quot;&gt;WA Office of the Chief Information Officer Office&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.carahsoft.com/application/files/9414/3569/2932/ServiceNow_EULA.PDF&quot; rel=&quot;noopener&quot;&gt;Carahsoft&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://das.ohio.gov/Portals/0/DASDivisions/InformationTechnology/IS/Telecom/ServiceNow/ServiceNow%20OSU%20Subscription%20License%20Agreement%207-17-08.pdf&quot; rel=&quot;noopener&quot;&gt;Ohio State University Medical Center&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Express&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.tulsacounty.org/agendalinks/BOCC112116/Agreement-%20IT-%20ServiceNow,%20Inc.pdf&quot; rel=&quot;noopener&quot;&gt;Tulsa County&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;taxonomy-and-user-types&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#taxonomy-and-user-types&quot; class=&quot;heading-anchor&quot;&gt;Taxonomy and User Types&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow sells six standard offerings. All customers must first purchase one of the below standard offerings.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;ServiceNow Service Suite – Comprised of ServiceNow developed applications designed to address the core ITIL framework use cases (Incident, Problem, Change, Release, Request, Asset, IT Cost) as well as ServiceNow developed applications designed to address the service delivery needs of other organizations within the enterprise, including HR, Facilities, Field Service, Finance, Legal and Marketing.&lt;/li&gt;&lt;li&gt;ServiceNow Project Portfolio Suite – ServiceNow developed applications (SDLC, Project Portfolio, Resource, Demand, Test) that cover the portfolio planning, test and development processes.&lt;/li&gt;&lt;li&gt;ServiceNow IT Business Suite – ServiceNow developed applications (IT GRC, Vendor) designed to govern and measure the business of IT.&lt;/li&gt;&lt;li&gt;ServiceNow IT Financial Application – ServiceNow developed application designed to provide insight into spend for CIO’s seeking to align investment to business goals.&lt;/li&gt;&lt;li&gt;ServiceNow CreateNow Development Suite – The licensing for customers to build their own applications on top of the Service Automation Platform.&lt;/li&gt;&lt;li&gt;ServiceNow Service Suite With CreateNow – Comprised of ServiceNow Service Suite plus&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;CreateNow to provide customers the most flexibility to utilize ServiceNow developed applications “out of the box” as well as build their own applications on top of the Service Automation Platform – including the capability to create service applications from a template. Once one of the above standard offerings is purchased, there are a number of options and add ons available that extend the customer’s ServiceNow investment:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;ServiceNow Orchestration Core Enables the customer to orchestrate activities outside the customer’s ServiceNow environment. OrchestrationCore:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Allows customers to automate discrete tasks or processes that interact with external systems or services. (This capability includes “Orchestration Activities”).&lt;/li&gt;&lt;li&gt;Includes Orchestration Activity Packs for Microsoft Active Directory, Exchange, PowerShell and SSH.&lt;/li&gt;&lt;li&gt;Provides the capability to manage the configuration settings of a physical or virtual server. (This capability includes “Orchestration Configuration Automation Application”)&lt;/li&gt;&lt;li&gt;Provides the capability to reset User’s passwords that are stored and pre authenticated in a credential store outside Customer’s instance (e.g.&amp;nbsp;Active Directory). (Before Fuji, this capability had been “Orchestration Password Reset Application” – a separate ServiceNow Orchestration Add on product.)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ServiceNow Orchestration Cloud Provisioning Application – Cloud provisioning package to manage the life-cycle of provisioning virtual and/or public cloud infrastructure. (Requires purchase of Orchestration Core). Includes VMware vSphere and Amazon EC2 Activity Packs&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ServiceNow Orchestration Event Application – Dynamically creates alerts from infrastructure events generated by third party monitoring tools.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ServiceNow ServiceWatch - ServiceWatch discovers and maps business services, creating and maintaining a service-centric CMDB. Subsequently, it monitors the nodes and relationships between the nodes that make up each service as well as the performance and availability of each business service.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ServiceNow IT Operations (ITOM) Suite – Complete ITOM offering which includes OrchestrationCore, Cloud Provisioning, Event and ServiceWatch Applications.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ServiceNow Discovery – Locates physical and virtual devices connected to an enterprise network and identifies the relationships between those devices, as well as identifies the software installed on each.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ServiceNow Performance Analytics – Provides advanced analytics and time series analysis for key performance indicators(KPIs.)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Public Catalog – Supports service catalog deployments that extend outside the organization to an unknown number of Requesters.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;user-types-for-standard-packages&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#user-types-for-standard-packages&quot; class=&quot;heading-anchor&quot;&gt;User Types for Standard Packages&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Every employee or contractor given access to the subscription service by the customer must be assigned a unique username and password that may not be shared or transferred. Employees and contractors that have a user profile in the subscription service which is not designated as “active” may not be given access to the subscription service. The following describes the types of users required for each subscription model:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Fulfillers: (formerly referred to as process users): Fulfillers have full admin, developer, or usage rights within a purchased offering. This includes the creation, editing, or deletion of any record in the system. A Fulfiller is any user given a role in the subscription service by the customer other than the Approver role.&lt;/li&gt;&lt;li&gt;Requesters: (formerly referred to as end users): Requesters create, edit, and view their own requests. Requests can be submissions through the service catalog or incidents submitted through the ServiceNow web or mobile interfaces. They can also access the ServiceNow Knowledge Base to perform self service. A Requester is any user checked as “active” on his or her user profile in the subscription service other than a Fulfiller or Approver.&lt;/li&gt;&lt;li&gt;Approvers: Approvers can do everything a Requester does as well as approve or deny a record routed to the user (including adding related comments/work notes, however no other field may be modified). The Approver may perform the functionalities listed below for any approval generated via a ServiceNow built or custom built application. An Approver is any user given the ServiceNow provided “Approver” role in the subscription service by the customer and no other role.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;non-user-licensing&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#non-user-licensing&quot; class=&quot;heading-anchor&quot;&gt;Non-user Licensing&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Thing&lt;/th&gt;&lt;th&gt;Cost per&lt;/th&gt;&lt;th&gt;Subscribed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Performance Analytics&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Notify&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Discovery&lt;/td&gt;&lt;td&gt;Discovered Server&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Orchestration Core&lt;/td&gt;&lt;td&gt;Running Node&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Orchestration Cloud provisioning&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Orchestration (new model)&lt;/td&gt;&lt;td&gt;Per transaction&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Event&lt;/td&gt;&lt;td&gt;Something&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ServiceWatch&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IT Operations (ITOM)&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Public Catalog&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Password reset (part of ITOM)&lt;/td&gt;&lt;td&gt;10k resets/yr&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;service-suite&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#service-suite&quot; class=&quot;heading-anchor&quot;&gt;Service Suite&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The Service Suite is designed to address service requirements in any service domain including:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Core ITIL framework use case applications, formerly contained in the “IT Service Automation Suite” and now referred to as “IT Service” applications. Included are Incident, Problem, Change, Release, Request, Asset, and IT Cost.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Service delivery needs of other organizations within the enterprise having workflow / case requirements, including:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;HR Service Streamlines HR service delivery by offering a self service catalog to users and out-of-the-box request and fulfill process automation. The HR specific service catalog presents predefined items for services such as benefits or employee relations to employees.&lt;/li&gt;&lt;li&gt;Facilities Service Simplifies facilities service delivery by offering a self service catalog to users containing out of the box request, and automating the assignment and fulfillment process. The facilities specific service catalog presents pre defined items for services such as security or HVAC to employees.&lt;/li&gt;&lt;li&gt;Field Service Enables the of work requested and assigned to remote or mobile field technicians.&lt;/li&gt;&lt;li&gt;Finance Service Enables the finance department to define its services and fulfill requests – including financial reports, procurement and payroll queries through workflow capabilities and knowledge; provides visibility into resource utilization and service delivery performance through dashboards.&lt;/li&gt;&lt;li&gt;Legal Service Enables the legal department to define its services and fulfill requests – including contracts, legal research and policy queries through workflow capabilities and knowledge; provides visibility into resource utilization and service delivery performance through dashboards.&lt;/li&gt;&lt;li&gt;Marketing Service Enables the marketing department to define its services and fulfill requests --including creative services, campaign operations and website publishing through workflow capabilities and knowledge; provides visibility into resource utilization and service delivery performance through dashboards.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;service-suite-with-createnow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#service-suite-with-createnow&quot; class=&quot;heading-anchor&quot;&gt;Service Suite With CreateNow&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The Service Suite With CreateNow is comprised of everything in the Service Suite and also includes CreateNow custom application development use rights. This combination provides customers with the most flexibility because they can utilize ServiceNow developed service applications “out of the box” as well as build their own applications on top of the Service Automation Platform. CreateNow use rights are required to utilize the Service Suite capability to create service applications from a template.&lt;/p&gt;&lt;h3 id=&quot;project-portfolio-suite&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#project-portfolio-suite&quot; class=&quot;heading-anchor&quot;&gt;Project Portfolio Suite&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The Project Portfolio Suite addresses the prioritization and delivery of projects and services. This suite provides support for both waterfall and agile methodologies including Scrum. Included in this package are Project Portfolio, Resource, Demand, Test and Software Development Lifecycle (SDLC).&lt;/p&gt;&lt;h3 id=&quot;it-business-suite&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#it-business-suite&quot; class=&quot;heading-anchor&quot;&gt;IT Business Suite&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The IT Business Suite (ITBM) extends the ServiceNow portfolio by providing the compliance and performance metrics necessary to manage IT services. Included in this package are Governance, Risk, and Compliance (GRC), andVendor Performance .&lt;/p&gt;&lt;h3 id=&quot;it-financial-application&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#it-financial-application&quot; class=&quot;heading-anchor&quot;&gt;IT Financial Application&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In addition to the application suites listed above, ServiceNow separately offers IT Financial built on the complete Service Automation Platform. IT Financial is a ServiceNow developed application designed to provide insight into spend for CIO’s seeking to align investment to business goals. Users can classify general ledger records, define a reporting structure, define allocation rules and view summary reports. The IT Financial application is independently subscribed to based on the numbers of users required. IT Financial is a strategic product that adds valuable insight on spend for a very small number of key individuals, such asthe CIO, CFO and business unit IT VPs, with pricing reflecting that value.&lt;/p&gt;&lt;h2 id=&quot;user-licensing&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#user-licensing&quot; class=&quot;heading-anchor&quot;&gt;User Licensing&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Application&lt;/th&gt;&lt;th&gt;Service Mgt&lt;/th&gt;&lt;th&gt;Service Mgt Createnow&lt;/th&gt;&lt;th&gt;Project Portfolio&lt;/th&gt;&lt;th&gt;Business Mgt&lt;/th&gt;&lt;th&gt;Finance Mgt&lt;/th&gt;&lt;th&gt;Create Now&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Incident&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Problem&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Change&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Release&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Asset&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Request&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IT Cost&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Project Portfolio&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Resource&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Demand&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Software Development Lifecycle&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Test&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IT Governance, Risk, and Compliance&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Vendor Performance&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HR Service&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Facilities Service&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Field Service&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finance Service&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Legal Service&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Marketing Service&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IT Financial&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Custom Application Development&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Service Automation Platform&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;Note Licensing here means they are a Fulfiller below! Also Custom App means can use any number of custom applications e.g.&amp;nbsp;regular old u_tables, or scoped applications Project with financial plugins - is different&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;what-requires-a-role&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#what-requires-a-role&quot; class=&quot;heading-anchor&quot;&gt;What requires a Role&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Function&lt;/th&gt;&lt;th&gt;Requester&lt;/th&gt;&lt;th&gt;Time Card&lt;/th&gt;&lt;th&gt;Approver&lt;/th&gt;&lt;th&gt;Fulfiller&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Create one’s own request&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;View one’s own request&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Modify one’s own request&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Search the Service Catalog&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Search the Knowledge Base&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Access public pages&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Take Surveys&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Set one’s own notification preferences&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;View assets assigned to user&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Access and post to Live Feed&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Initiate Chat Sessions&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Participate in a Watch List&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;View a report published to them&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Approve requests routed to user via email&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Update and submit one’s own time card&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;View/Approve requests routed to user via system&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Create any record&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Delete any record&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Modify any record&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Drill through any report&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Create any report&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Delete any report&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Modify any report&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Perform development activities&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Perform Administrative activities&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Included&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;related-reading&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-licensing-circa-2017/#related-reading&quot; class=&quot;heading-anchor&quot;&gt;Related reading&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Cost of extending tables:&amp;nbsp;&lt;a href=&quot;https://web.archive.org/web/20170224171442/servicenow.implementation.blog/financial-implications-of-extending-tables&quot; rel=&quot;noopener&quot;&gt;https://servicenow.implementation.blog/financial-implications-of-extending-tables/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Custom Table Guide:&amp;nbsp;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/legal/custom-table-guide.pdf&quot; rel=&quot;noopener&quot;&gt;https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/legal/custom-table-guide.pdf&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Automated Testing (ATF) opinions</title>
      <link href="https://jace.pro/blog/automated-testing-atf-opinions/" />
      <updated>2017-12-03T00:00:00Z</updated>
      <id>https://jace.pro/blog/automated-testing-atf-opinions/</id>
      <content type="html">
				&lt;p&gt;This is a list of items I think the ATF Tests should include.&lt;/p&gt;&lt;p&gt;I think every test should have the following steps;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create users to use to for test (Server&amp;gt;Insert Record on sys_user)&lt;/li&gt;&lt;li&gt;Create role(s) for the newly created user, as you may not always&lt;br&gt;know a good user to test as.(Server&amp;gt;Insert Record on&lt;br&gt;sys_user_has_role)&lt;/li&gt;&lt;li&gt;Impersonate the user(Server&amp;gt;Impersonate)&lt;/li&gt;&lt;li&gt;Use Server&amp;gt;Record Validation to test most field values&lt;/li&gt;&lt;li&gt;Use Form validation for User Experience testing.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Tests should also follow these as well&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Track Tests in update set with the code&lt;/li&gt;&lt;li&gt;Group Tests by tag. &amp;nbsp;Tag for Application, Testing Schedule, and&lt;br&gt;Feature/Effort/Sprint&lt;/li&gt;&lt;li&gt;Tests should be small units to test and not dependent on eachother.&lt;/li&gt;&lt;li&gt;Tests should be part of the estimate of work when sizing work.&lt;/li&gt;&lt;li&gt;Tests should run on a schedule.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=1a4e66addbd0dbc01dcaf3231f96192f&quot; rel=&quot;noopener&quot;&gt;Community Blog&lt;/a&gt;&lt;br&gt;for further reading.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/other-document/nowforum/sydney/hands-on-lab2-automated-testing-framework.pdf&quot; rel=&quot;noopener&quot;&gt;Further Reading&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/blog/automated-testing-atf-opinions/hands-on-lab2-automated-testing-framework.pdf&quot;&gt;Saved Off on 2018-12-26&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>ServiceNow Learning</title>
      <link href="https://jace.pro/blog/servicenow-learning/" />
      <updated>2017-11-30T00:00:00Z</updated>
      <id>https://jace.pro/blog/servicenow-learning/</id>
      <content type="html">
				&lt;p&gt;This post is a extension of this&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=f10eaa2ddbd0dbc01dcaf3231f961925&quot; rel=&quot;noopener&quot;&gt;post&lt;/a&gt;. Below I go over the videos, and the interactive site.&lt;/p&gt;&lt;h2 id=&quot;official-documentation&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#official-documentation&quot; class=&quot;heading-anchor&quot;&gt;Official Documentation&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;There’s 2 places that have this;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/&quot; rel=&quot;noopener&quot;&gt;Docs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/&quot; rel=&quot;noopener&quot;&gt;Developer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;foundations-elearning-videos&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#foundations-elearning-videos&quot; class=&quot;heading-anchor&quot;&gt;Foundations eLearning (videos)&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The foundations course covers six modules. You will get an introduction and overview of how to interact with and navigate through this Foundations course. It also covers on how to navigate using filters and breadcrumbs and what you can see and do as a System Administrator.&lt;/p&gt;&lt;p&gt;Both of these end up on the same videos as listed in sub sections.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.servicenow.com/services/training-and-certification/foundations-elearning.html&quot; rel=&quot;noopener&quot;&gt;ServiceNow Foundations eLearning&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_article&amp;amp;sys_id=a2dc2a65dbd0dbc01dcaf3231f96197e&quot; rel=&quot;noopener&quot;&gt;ServiceNow Foundations Videos&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;user-experience&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#user-experience&quot; class=&quot;heading-anchor&quot;&gt;User Experience&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=yDmGTeEDp5g&quot; rel=&quot;noopener&quot;&gt;What is ServiceNow and How Can It Help Me Do My Job?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FiDEWppxPdQ&quot; rel=&quot;noopener&quot;&gt;Quick Tour of the ServiceNow Platform&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=8hXXvimSw5c&quot; rel=&quot;noopener&quot;&gt;How to Request Something&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=cCFPFqcAftk&quot; rel=&quot;noopener&quot;&gt;How to Report an Issue&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Ly3wjS0W4RI&quot; rel=&quot;noopener&quot;&gt;How to Use the Knowledge Base&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;getting-started&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#getting-started&quot; class=&quot;heading-anchor&quot;&gt;Getting Started&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=CHlGvbqirQs&quot; rel=&quot;noopener&quot;&gt;Platform Architecture&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=IFBNuBQsip0&quot; rel=&quot;noopener&quot;&gt;Platform Applications&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=wSqg05k65Ew&quot; rel=&quot;noopener&quot;&gt;Tables, Records, and Fields&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=RPUCUwvpfPE&quot; rel=&quot;noopener&quot;&gt;Locating Resources&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;user-interface&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#user-interface&quot; class=&quot;heading-anchor&quot;&gt;User Interface&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ZG3bHNEuaGY&quot; rel=&quot;noopener&quot;&gt;Overview&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=sHdX575mPhk&quot; rel=&quot;noopener&quot;&gt;Application Navigator&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=a2ylc__MEl0&quot; rel=&quot;noopener&quot;&gt;Lists&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=2Eq2oxVllOU&quot; rel=&quot;noopener&quot;&gt;Forms&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;process-user-and-manager-capabilities&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#process-user-and-manager-capabilities&quot; class=&quot;heading-anchor&quot;&gt;Process User and Manager Capabilities&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=9qWgCOx50Tk&quot; rel=&quot;noopener&quot;&gt;Getting Started with the ITIL Role&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;system-configuration&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#system-configuration&quot; class=&quot;heading-anchor&quot;&gt;System Configuration&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=w_WYRJJ7Sho&quot; rel=&quot;noopener&quot;&gt;Performing Basic Setup in your instance&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=EofCa_bXy28&quot; rel=&quot;noopener&quot;&gt;Application Menus and Modules&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=147I32N8hyk&quot; rel=&quot;noopener&quot;&gt;Form Layout and Design&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=bc5EUz51qu4&quot; rel=&quot;noopener&quot;&gt;Overview Pages(Homepages)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=VUQwql3Rki8&quot; rel=&quot;noopener&quot;&gt;Business Rules&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=C2FMo3l1swk&quot; rel=&quot;noopener&quot;&gt;Inbound Email Actions and Notifications&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;service-catalog&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#service-catalog&quot; class=&quot;heading-anchor&quot;&gt;Service Catalog&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Q25mSVIycaQhttp://&quot; rel=&quot;noopener&quot;&gt;Service Catalog Administration Overview&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=tWnC37-UmqA&quot; rel=&quot;noopener&quot;&gt;Creating Service Catalog Categories&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=mVGOzQcNme0&quot; rel=&quot;noopener&quot;&gt;Creating Service Catalog Items&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zeaOTmDmLf4&quot; rel=&quot;noopener&quot;&gt;Creating Service Catalog Record Producers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=2_Fvw5wqRD8&quot; rel=&quot;noopener&quot;&gt;Creating Service Catalog Execution Plans and Workflows&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;it-service-management&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#it-service-management&quot; class=&quot;heading-anchor&quot;&gt;IT Service Management&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ryxjWBOq3sQ&quot; rel=&quot;noopener&quot;&gt;Incident Management&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=3f_v7HqRgM0&quot; rel=&quot;noopener&quot;&gt;Change Management&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Ux1fub8KzT0&quot; rel=&quot;noopener&quot;&gt;Problem Management&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;community-and-chat&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#community-and-chat&quot; class=&quot;heading-anchor&quot;&gt;Community and Chat&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Need to talk to someone, the community has people on it all the time.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://discord.gg/QaMwnGd&quot; rel=&quot;noopener&quot;&gt;Discord&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://sndevs.slack.com/&quot; rel=&quot;noopener&quot;&gt;Slack&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/&quot; rel=&quot;noopener&quot;&gt;Community&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;get-a-developer-instance&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#get-a-developer-instance&quot; class=&quot;heading-anchor&quot;&gt;Get a Developer Instance&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;You can get your own instance to mess around from&amp;nbsp;&lt;a href=&quot;https://developer.service-now.com/&quot; rel=&quot;noopener&quot;&gt;developer.service-now.com&lt;/a&gt;. This is required for the Developer training courses.&lt;/p&gt;&lt;h2 id=&quot;developer-training-courses-interactive&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#developer-training-courses-interactive&quot; class=&quot;heading-anchor&quot;&gt;Developer Training Courses (interactive)&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Self-paced developer training modules are available with the ServiceNow Developer program. They are step-by-step, guides on how parts of the platform work.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/training/landing&quot; rel=&quot;noopener&quot;&gt;Landing Page&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This interactive course seems to have these items;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/trainlist/app_store_learn_dev_site_walkthrough_kingston_c_DeveloperSiteIntro&quot; rel=&quot;noopener&quot;&gt;Developer Site Walkthrough&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_buildneedit_kingston_build_the_needit_application?v=kingston&quot; rel=&quot;noopener&quot;&gt;Build the NeedIt Application&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_securingapps_kingston_securing_applications?v=kingston&quot; rel=&quot;noopener&quot;&gt;Securing Applications&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_automatingapps_kingston_automating_application_logic?v=kingston&quot; rel=&quot;noopener&quot;&gt;Automating Application logic&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_atf_kingston_automated_test_framework?v=kingston&quot; rel=&quot;noopener&quot;&gt;Automated Test Framework&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_angularjs_kingston_building_apps_with_angularjs?v=kingston&quot; rel=&quot;noopener&quot;&gt;Building Apps with AngularJS&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_buildmyfirstapp_kingston_build_my_first_application?v=kingston&quot; rel=&quot;noopener&quot;&gt;Build My First Application&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_scripting_kingston_scripting_in_servicenow?v=kingston&quot; rel=&quot;noopener&quot;&gt;Scripting in ServiceNow&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_importingdata_kingston_importing_data_into_servicenow?v=kingston&quot; rel=&quot;noopener&quot;&gt;Importing Data into ServiceNow&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_rest_kingston_rest_integrations?v=kingston&quot; rel=&quot;noopener&quot;&gt;REST Integrations&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/trainlist/app_store_learnv2_serviceportal_kingston_service_portal?v=kingston&quot; rel=&quot;noopener&quot;&gt;Service Portal&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;youtube-channels&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#youtube-channels&quot; class=&quot;heading-anchor&quot;&gt;YouTube Channels&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_blog&amp;amp;sys_id=4d6eaeaddbd0dbc01dcaf3231f961964&quot; rel=&quot;noopener&quot;&gt;TechNow spans videos on two channels, NowCommunity, and Nowsupport&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community?id=community_forum&amp;amp;sys_id=d6295a2ddbd897c068c1fb651f9619f1&quot; rel=&quot;noopener&quot;&gt;Ask the Expert Sessions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/user/servicenowdemo&quot; rel=&quot;noopener&quot;&gt;nowSupport&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/user/ServiceNowCommunity&quot; rel=&quot;noopener&quot;&gt;nowCommunity&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCdXorgCT87YlFRN9n8oJ7_A&quot; rel=&quot;noopener&quot;&gt;ServiceNow Dev Program&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;other-resources&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#other-resources&quot; class=&quot;heading-anchor&quot;&gt;Other Resources&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.udemy.com/courses/search/?q=ServiceNow&quot; rel=&quot;noopener&quot;&gt;Udemy ServiceNow System Admin and App Developer Udemy Courses&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://quizlet.com/class/2490040/&quot; rel=&quot;noopener&quot;&gt;System Administration Exam Flashcards&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://quizlet.com/217493821/servicenow-application-developer-certification-flash-cards/&quot; rel=&quot;noopener&quot;&gt;Application Developer Exam Flashcards&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.classmarker.com/online-test/start/?quiz=yb752a207d482ecf&quot; rel=&quot;noopener&quot;&gt;Practice Exam - Classmarker Practice Exam&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;prepare-for-the-certification&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#prepare-for-the-certification&quot; class=&quot;heading-anchor&quot;&gt;Prepare for the certification&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Cert&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Blueprint&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CSA&lt;/td&gt;&lt;td&gt;Certified System Administrator&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/servicenow-sys-admin-exam-specs.pdf&quot; rel=&quot;noopener&quot;&gt;Blueprint&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CAD&lt;/td&gt;&lt;td&gt;Certified Application Developer&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/blueprint-cad-kingston.pdf&quot; rel=&quot;noopener&quot;&gt;Blueprint&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;ServiceNow has lots certifications now and they people interept them differently.&lt;br&gt;Ultimately they show the following about the person&lt;/p&gt;&lt;ul&gt;&lt;li&gt;They are willing to pay some money&lt;/li&gt;&lt;li&gt;They are willing to take a class&lt;/li&gt;&lt;li&gt;They are willing to take a test and pass&lt;/li&gt;&lt;li&gt;They are willing to take a quiz each family release&lt;/li&gt;&lt;li&gt;They are willing to pay a renewal fee every two years&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;code&gt;*&lt;/code&gt;&amp;nbsp;No Certification Documentation could be found, but it’s listed as if one exists&amp;nbsp;&lt;a href=&quot;https://www.servicenow.com/content/dam/servicenow/other-documents/training/tp-certification-guide.pdf&quot; rel=&quot;noopener&quot;&gt;on the Certification Guide&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;taking-the-certification&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/servicenow-learning/#taking-the-certification&quot; class=&quot;heading-anchor&quot;&gt;Taking the certification&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Update [July 1, 2018]: As of 7/1/2018, its stated you need to take the class before testing for the certification. The webassesor link still works and lists the classes for me.&lt;/p&gt;&lt;p&gt;ServiceNow uses onsite testing and at home testing. For the at home testing you’ll need a detached webcam.&lt;/p&gt;&lt;p&gt;The cost is $150 per certification.&lt;/p&gt;&lt;p&gt;The CSA and CAD certification has a 90 minute time limit. The rest have a 130 minute time limit.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.webassessor.com/wa.do?page=publicHome&amp;amp;branding=SERVICE_NOW&quot; rel=&quot;noopener&quot;&gt;Webassesor site to register&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>How event processors work</title>
      <link href="https://jace.pro/blog/how-event-processors-work/" />
      <updated>2017-11-30T00:00:00Z</updated>
      <id>https://jace.pro/blog/how-event-processors-work/</id>
      <content type="html">
				&lt;p&gt;Here’s my understanding of how the&amp;nbsp;&lt;code&gt;sys_trigger&lt;/code&gt;&amp;nbsp;“process events” works, also known as the&amp;nbsp;&lt;strong&gt;event processor&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Frequently it wakes a Java process that reads the&amp;nbsp;&lt;code&gt;sysevent&lt;/code&gt;&amp;nbsp;table.&lt;/p&gt;&lt;p&gt;It looks for events which have no named queue where the process date is in the past which have no “claimed by” yet and are in a state of ready. It orders by “process on” and limits to 100 at a time.&lt;/p&gt;&lt;p&gt;The 100 “oldest” unprocessed events are claimed and a worker start going through them sequentially. As they are completed, the state changes. When all 100 are done, the thread goes back to slep and waits to be woken again by the scheduled job.&lt;/p&gt;&lt;p&gt;Now there are a couple “process event” records. You can also write your own. This&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=db344b29dbd8dbc01dcaf3231f9619b4#874843&quot; rel=&quot;noopener&quot;&gt;community post&lt;/a&gt;&amp;nbsp;goes over the items you need;&lt;/p&gt;&lt;p&gt;These sys_trigger records are ephemeral it seems, one runs and it spawns another and the old one is deleted&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Trigger the event server-side with a queue;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Insert a new record as a copy of the original “events process” job where you change the script.&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;/* from */
fcScriptName=javascript&#92;&#92;&#92;&#92;:gs.processDelegatedEvents();
/* to */
fcScriptName=javascript&#92;&#92;&#92;&#92;:gs.processDelegatedEvents(&#39;my_queue_name&#39;);&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;extra-sources&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/how-event-processors-work/#extra-sources&quot; class=&quot;heading-anchor&quot;&gt;Extra Sources&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://support.servicenow.com/kb?id=kb_article_view&amp;amp;sysparm_article=KB0676909&quot; rel=&quot;noopener&quot;&gt;KB0676909&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>What is the Megaphone application?</title>
      <link href="https://jace.pro/blog/what-is-the-megaphone-application/" />
      <updated>2017-11-11T00:00:00Z</updated>
      <id>https://jace.pro/blog/what-is-the-megaphone-application/</id>
      <content type="html">
				&lt;p&gt;Megaphone is some hidden application ServiceNow made but didn’t release.&lt;/p&gt;&lt;p&gt;This is not visible unless you change the module roles from&amp;nbsp;&lt;code&gt;maint&lt;/code&gt;&amp;nbsp;to&amp;nbsp;&lt;code&gt;admin&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;This uses the table,&amp;nbsp;&lt;code&gt;sys_broadcast_message&lt;/code&gt;&amp;nbsp;and that creates a message as depicted in this&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/community?id=community_question&amp;amp;sys_id=64cfcb65dbdcdbc01dcaf3231f9619f6&amp;amp;anchor=answer_7a0c6be1db181fc01dcaf3231f9619e7&amp;amp;view_source=searchResult&quot; rel=&quot;noopener&quot;&gt;thread&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/jAPkGr47kw-650.webp 650w, https://jace.pro/img/jAPkGr47kw-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/jAPkGr47kw-650.jpeg&quot; alt=&quot;Screenshot of a form for the hidden Megaphone application in ServiceNow&quot; title=&quot;Screenshot of a form for the hidden Megaphone application in ServiceNow&quot; width=&quot;960&quot; height=&quot;302&quot; srcset=&quot;https://jace.pro/img/jAPkGr47kw-650.jpeg 650w, https://jace.pro/img/jAPkGr47kw-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Screenshot of a form for the hidden Megaphone application in ServiceNow&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Intake Processes I have Seen</title>
      <link href="https://jace.pro/blog/intake-processes-i-have-seen/" />
      <updated>2017-11-11T00:00:00Z</updated>
      <id>https://jace.pro/blog/intake-processes-i-have-seen/</id>
      <content type="html">
				&lt;p&gt;This is the different team intake processes I’ve seen during my work with ServiceNow.&lt;/p&gt;&lt;h1 id=&quot;intake-process&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/intake-processes-i-have-seen/#intake-process&quot; class=&quot;heading-anchor&quot;&gt;Intake Process&lt;/a&gt;&lt;/h1&gt;&lt;h2 id=&quot;light-agile&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/intake-processes-i-have-seen/#light-agile&quot; class=&quot;heading-anchor&quot;&gt;Light Agile&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This process is in use by a team of three developers running two sprints on a two week span. Each member is rotated through the support sprint every third week.&lt;/p&gt;&lt;h3 id=&quot;light-agile-sprint-ceremonies&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/intake-processes-i-have-seen/#light-agile-sprint-ceremonies&quot; class=&quot;heading-anchor&quot;&gt;Light Agile Sprint Ceremonies&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ceremonies&lt;/th&gt;&lt;th&gt;Frequency&lt;/th&gt;&lt;th&gt;Attendees&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Team Standup&lt;/td&gt;&lt;td&gt;Monday Every Week&lt;/td&gt;&lt;td&gt;Development Team and Manager&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Team Standup&lt;/td&gt;&lt;td&gt;Wednesday, Thursday Every Week&lt;/td&gt;&lt;td&gt;Development Team&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Planning&lt;/td&gt;&lt;td&gt;Wednesday Every Other Week&lt;/td&gt;&lt;td&gt;Development Team, Process Owners, Story Requestors&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;light-agile-support-sprint&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/intake-processes-i-have-seen/#light-agile-support-sprint&quot; class=&quot;heading-anchor&quot;&gt;Light Agile Support Sprint&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Responsibilities&lt;/th&gt;&lt;th&gt;Frequency&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Handle Incoming incidents&lt;/td&gt;&lt;td&gt;As needed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Verify new story requirements&lt;/td&gt;&lt;td&gt;When available&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Size new stories&lt;/td&gt;&lt;td&gt;When available&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Split large stories into smaller ones&lt;/td&gt;&lt;td&gt;When available&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Move update sets to test and sandbox&lt;/td&gt;&lt;td&gt;Every other Tuesday&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Move update sets to production&lt;/td&gt;&lt;td&gt;Every other Wednesday&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;light-agile-development-sprint&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/intake-processes-i-have-seen/#light-agile-development-sprint&quot; class=&quot;heading-anchor&quot;&gt;Light Agile Development Sprint&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Responsibilities&lt;/th&gt;&lt;th&gt;Frequency&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Assign Stories to self&lt;/td&gt;&lt;td&gt;When available&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Develop Features&lt;/td&gt;&lt;td&gt;All the time&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Update Story to UAT when done&lt;/td&gt;&lt;td&gt;When available&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pull in stories if sprint is short&lt;/td&gt;&lt;td&gt;When available&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;heavy-agile-process&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/intake-processes-i-have-seen/#heavy-agile-process&quot; class=&quot;heading-anchor&quot;&gt;Heavy Agile Process&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This process is in use by a team of eight developers running one sprints on a three week span. Two members are rotated through the kanban group every four weeks.&lt;/p&gt;&lt;h3 id=&quot;heavy-agile-sprint-ceremonies&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/intake-processes-i-have-seen/#heavy-agile-sprint-ceremonies&quot; class=&quot;heading-anchor&quot;&gt;Heavy Agile Sprint Ceremonies&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ceremonies&lt;/th&gt;&lt;th&gt;Frequency&lt;/th&gt;&lt;th&gt;Attendees&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Team Standup&lt;/td&gt;&lt;td&gt;Every day&lt;/td&gt;&lt;td&gt;Development Team, and Scrum Master&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Planning&lt;/td&gt;&lt;td&gt;Wednesday Every Third Week&lt;/td&gt;&lt;td&gt;Development Team, Process Owners, and Product Owner&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Retrospective&lt;/td&gt;&lt;td&gt;Tuesday Every First Week&lt;/td&gt;&lt;td&gt;Development Team, and Scrum Master&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sizing&lt;/td&gt;&lt;td&gt;As needed&lt;/td&gt;&lt;td&gt;Development Team, and Product Owner&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;heavy-agile-kanban-group&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/intake-processes-i-have-seen/#heavy-agile-kanban-group&quot; class=&quot;heading-anchor&quot;&gt;Heavy Agile Kanban Group&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Product Owner sets importance of incoming work. Each lane or queue can have a predetermined number of items. When I was there were these four lanes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ready&lt;/li&gt;&lt;li&gt;Working&lt;/li&gt;&lt;li&gt;User Acceptance Testing&lt;/li&gt;&lt;li&gt;Ready for Release&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This was to allow the Product Owner more flexibility to get work done outside the Scrum Process and to assist the Release Team.&lt;/p&gt;&lt;h3 id=&quot;heavy-agile-development-sprint&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/intake-processes-i-have-seen/#heavy-agile-development-sprint&quot; class=&quot;heading-anchor&quot;&gt;Heavy Agile Development Sprint&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Responsibilities&lt;/th&gt;&lt;th&gt;Frequency&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Assign Stories to self&lt;/td&gt;&lt;td&gt;When available&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Develop Features&lt;/td&gt;&lt;td&gt;All the time&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Update Story to UAT when done&lt;/td&gt;&lt;td&gt;When available&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;heavy-agile-support-and-release-group&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/intake-processes-i-have-seen/#heavy-agile-support-and-release-group&quot; class=&quot;heading-anchor&quot;&gt;Heavy Agile Support and Release Group&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Responsibilities&lt;/th&gt;&lt;th&gt;Frequency&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Handle Incoming incidents&lt;/td&gt;&lt;td&gt;As needed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Move update sets to test and sandbox&lt;/td&gt;&lt;td&gt;Every other Tuesday&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Move update sets to production&lt;/td&gt;&lt;td&gt;Every other Wednesday&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Code Search</title>
      <link href="https://jace.pro/blog/code-search/" />
      <updated>2017-11-03T00:00:00Z</updated>
      <id>https://jace.pro/blog/code-search/</id>
      <content type="html">
				&lt;p&gt;I’ve created one of these to improve on the one on&amp;nbsp;&lt;a href=&quot;https://share.servicenow.com/&quot; rel=&quot;noopener&quot;&gt;share&lt;/a&gt;. This is a scoped application for Service-now to allow easier searching all code sources.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/ChY_0P6XVl-650.webp 650w, https://jace.pro/img/ChY_0P6XVl-960.webp 960w, https://jace.pro/img/ChY_0P6XVl-1233.webp 1233w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/ChY_0P6XVl-650.jpeg&quot; alt=&quot;Screenshot of the scoped application from 2017&quot; title=&quot;Screenshot of the scoped application from 2017&quot; width=&quot;1233&quot; height=&quot;884&quot; srcset=&quot;https://jace.pro/img/ChY_0P6XVl-650.jpeg 650w, https://jace.pro/img/ChY_0P6XVl-960.jpeg 960w, https://jace.pro/img/ChY_0P6XVl-1233.jpeg 1233w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Screenshot of the scoped application from 2017&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 id=&quot;features&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/code-search/#features&quot; class=&quot;heading-anchor&quot;&gt;Features&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Table of Contents of results&lt;/li&gt;&lt;li&gt;Inline code that is found&lt;/li&gt;&lt;li&gt;Sys ID Search&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;setup&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/code-search/#setup&quot; class=&quot;heading-anchor&quot;&gt;Setup&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Open Studio on your environment&lt;/li&gt;&lt;li&gt;Import from source&lt;/li&gt;&lt;li&gt;Paste in the following URL:&amp;nbsp;&lt;code&gt;https://github.com/jacebenson/servicenow-code.git&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;usage&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/code-search/#usage&quot; class=&quot;heading-anchor&quot;&gt;Usage&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;After you import this, you can start to use it by navigating to&amp;nbsp;&lt;code&gt;/code&lt;/code&gt;&amp;nbsp;on your instance.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Discovery Affinity Issue</title>
      <link href="https://jace.pro/blog/discovery-affinity-issue/" />
      <updated>2017-11-02T00:00:00Z</updated>
      <id>https://jace.pro/blog/discovery-affinity-issue/</id>
      <content type="html">
				&lt;p&gt;If you are using discovery and credential affinity, and you have an IP address not updating appropriately, look at&amp;nbsp;&lt;code&gt;dscy_credentials_affinity&lt;/code&gt;&amp;nbsp;for the ip address that should be set.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>My general setup for software</title>
      <link href="https://jace.pro/blog/my-general-setup-for-software/" />
      <updated>2017-10-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/my-general-setup-for-software/</id>
      <content type="html">
				&lt;p&gt;Here’s the software I use for my workstation;&lt;/p&gt;&lt;p&gt;Ninite can install most of the software I need for my workstation.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://ninite.com/7zip-chrome-discord-edge-firefox-libreoffice-paint.net-vscode-zoom/&quot; rel=&quot;noopener&quot;&gt;Ninite&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.google.com/chrome/browser/desktop/&quot; rel=&quot;noopener&quot;&gt;Chrome&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.mozilla.org/en-US/firefox/new/&quot; rel=&quot;noopener&quot;&gt;Firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/windows/microsoft-edge&quot; rel=&quot;noopener&quot;&gt;Microsoft Edge&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.7-zip.org/&quot; rel=&quot;noopener&quot;&gt;7-Zip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://zoom.us/&quot; rel=&quot;noopener&quot;&gt;Zoom&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://discordapp.com/&quot; rel=&quot;noopener&quot;&gt;Discord&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot; rel=&quot;noopener&quot;&gt;Visual Studio Code&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.paint.net/&quot; rel=&quot;noopener&quot;&gt;Paint.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.libreoffice.org/&quot; rel=&quot;noopener&quot;&gt;LibreOffice&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.winscp.net/eng/download.php&quot; rel=&quot;noopener&quot;&gt;WinDirStat&lt;/a&gt;&lt;/li&gt;&lt;li&gt;*&lt;a href=&quot;https://git-scm.com/&quot; rel=&quot;noopener&quot;&gt;Git&lt;/a&gt;&lt;/li&gt;&lt;li&gt;*&lt;a href=&quot;https://obsidianmd.com/&quot; rel=&quot;noopener&quot;&gt;ObsidianMd&lt;/a&gt;&lt;/li&gt;&lt;li&gt;*&lt;a href=&quot;https://screencast-o-matic.com/&quot; rel=&quot;noopener&quot;&gt;Screencast&lt;/a&gt;&lt;/li&gt;&lt;li&gt;*&lt;a href=&quot;https://insomnia.rest/&quot; rel=&quot;noopener&quot;&gt;Insomnia&lt;/a&gt;&lt;/li&gt;&lt;li&gt;*&lt;a href=&quot;https://bitwarden.com/&quot; rel=&quot;noopener&quot;&gt;Bitwarden&lt;/a&gt;&lt;/li&gt;&lt;li&gt;*&lt;a href=&quot;https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701?hl=en-us&amp;amp;gl=US&quot; rel=&quot;noopener&quot;&gt;Windows Terminal&lt;/a&gt;&lt;/li&gt;&lt;li&gt;*&lt;a href=&quot;https://www.mmhmm.app/home&quot; rel=&quot;noopener&quot;&gt;mmhmm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;*&lt;a href=&quot;https://obsproject.com/&quot; rel=&quot;noopener&quot;&gt;OBS&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;* Needs to be installed manually.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Lookup Select Attributes</title>
      <link href="https://jace.pro/blog/lookup-select-attributes/" />
      <updated>2017-10-29T00:00:00Z</updated>
      <id>https://jace.pro/blog/lookup-select-attributes/</id>
      <content type="html">
				&lt;p&gt;A former colleague asked me, “Hey, do you remember how to make variables dependent on each other?” It might have been her asking me. In any case, I was looking for a way to do this that wasn’t a client script which would build these dependencies.&lt;/p&gt;&lt;p&gt;I found it. For lookup select boxes and lookup multiple choices there is an attribute available called&amp;nbsp;&lt;code&gt;ref_qual_elements&lt;/code&gt;&amp;nbsp;that you can set with a comma-separated list of other variables. What happens when you change the value of one of the listed variables is a server call is made and the options are re-evaluated and unset.&lt;/p&gt;&lt;p&gt;This is great if those options are pretty static. If you let users disable options, items that use these variables that are in progress won’t display these option.&lt;/p&gt;&lt;p&gt;Here’s the&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/istanbul-it-service-management/page/product/service-catalog-management/reference/variable-attributes.html&quot; rel=&quot;noopener&quot;&gt;official documentation about this variable attribute&lt;/a&gt;. It doesn’t describe it as a way to save time, it will have to do.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Weird service portal instance</title>
      <link href="https://jace.pro/blog/weird-service-portal-instance/" />
      <updated>2017-10-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/weird-service-portal-instance/</id>
      <content type="html">
				&lt;p&gt;Today I was working on a widget&amp;nbsp;&lt;a href=&quot;https://jace.pro/post/2017-10-26-sp-accept-reject/&quot; rel=&quot;noopener&quot;&gt;Accept / Reject Solution&lt;/a&gt;. I found a share (link defunct) that looked like it would meet my needs. It looked great, until I tried rejecting a custom extended task table.&lt;/p&gt;&lt;p&gt;I couldn’t set it to work so I backed it out and determined I’d roll my own, that share updated a existing&amp;nbsp;&lt;code&gt;sp_instance&lt;/code&gt;. After I backed out the update set that&amp;nbsp;&lt;code&gt;sp_instance&lt;/code&gt;&amp;nbsp;record was still there. I couldn’t get it to fall off the page regardless what I tried;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Record didn’t exist at this point so couldn’t delete it.&lt;/li&gt;&lt;li&gt;Recreated empty table, and inserted the record with the referenced sys_id via&amp;nbsp;&lt;a href=&quot;https://sn.jace.pro/GlideRecord/#setNewGuidValue&quot; rel=&quot;noopener&quot;&gt;setNewGuidValue&lt;/a&gt;. At this point I could set Active to false, but I wanted it gone.&lt;/li&gt;&lt;li&gt;Tried Deleting the record from the column record, but it deleted the actual record on it’s table and not from the related list of&amp;nbsp;&lt;code&gt;sp_instances&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I ended up making a new column, moving all widgets over, then deleted the old column.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Thoughts on surveys</title>
      <link href="https://jace.pro/blog/thoughts-on-surveys/" />
      <updated>2017-10-28T00:00:00Z</updated>
      <id>https://jace.pro/blog/thoughts-on-surveys/</id>
      <content type="html">
				&lt;p&gt;Surveys are great, if they make them concise and to the point.&lt;/p&gt;&lt;h2 id=&quot;what-makes-a-great-survey&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#what-makes-a-great-survey&quot; class=&quot;heading-anchor&quot;&gt;What Makes a Great Survey&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;keep-it-short-stupid&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#keep-it-short-stupid&quot; class=&quot;heading-anchor&quot;&gt;Keep it short, stupid&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Your biggest concern is being&amp;nbsp;&lt;strong&gt;clear and concise&lt;/strong&gt;, or in finding the shortest way to ask a question without muddying its intent. It’s not about reducing the character count; you must&amp;nbsp;&lt;strong&gt;remove superfluous phrasing&lt;/strong&gt;&amp;nbsp;from your questions.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Survey length remains important&lt;/strong&gt;&amp;nbsp;for keeping abandon rates low. Think about the last time you sat around and excitedly answered a 10-minute survey.&lt;/p&gt;&lt;h3 id=&quot;ask-questions-that-fulfill-your-end-goal&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#ask-questions-that-fulfill-your-end-goal&quot; class=&quot;heading-anchor&quot;&gt;Ask questions that fulfill your end goal&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;You need to be ruthless when it comes to cutting unnecessary questions from your surveys.&lt;/p&gt;&lt;p&gt;Ask this question about every question you include, “Does this question drive action once received?” If the answer is no, why are you asking it? The action doesn’t have to get you calling the surveyee, but should drive trends to changes you want to make.&lt;/p&gt;&lt;h3 id=&quot;construct-smart-open-ended-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#construct-smart-open-ended-questions&quot; class=&quot;heading-anchor&quot;&gt;Construct smart, open-ended questions&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Some of your most insightful feedback will come from open-ended questions. Nothing makes a survey more intimidating than a large text box connected to the first question. It’s best to take on brief questions first to create a sense of progress, and then give survey takers who’ve made it to the closing questions the opportunity to elaborate on their thoughts.&lt;/p&gt;&lt;p&gt;One strategy is to get people to commit to a question with a simple introduction, and then follow up with an open-ended question such as, “Why do you feel this way?”&lt;/p&gt;&lt;h3 id=&quot;ask-one-question-at-a-time&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#ask-one-question-at-a-time&quot; class=&quot;heading-anchor&quot;&gt;Ask one question at a time&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;We’ve all been hit with an extensive series of questions before: “How did you find on our site? Do you understand what our product does? Why or why not?”&lt;/p&gt;&lt;p&gt;It can begin to feel like you’re being interrogated by someone who won’t let you finish your sentences. If you want quality responses, you need to give people time to think through each individual question.&lt;/p&gt;&lt;p&gt;Bombarding them with lots of points to consider leads to half-hearted answers by respondents who will be looking to get through to the end — if they even stay with the survey at all. Make it easy by sticking to one main point at a time.&lt;/p&gt;&lt;h3 id=&quot;make-rating-scales-consistent&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#make-rating-scales-consistent&quot; class=&quot;heading-anchor&quot;&gt;Make rating scales consistent&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Common scales used for surveys can become cumbersome and confusing when the context begins to change.&lt;/p&gt;&lt;p&gt;Here’s an example I came across. While answering a survey’s initial questions, I was told to respond by choosing between 1-5, with 1 = “Strongly Disagree” and 5 = “Strongly Agree.”&lt;/p&gt;&lt;p&gt;Later on in the survey I was asked to evaluate the importance of certain items. The problem: Now 1 was assigned as “Most Important,” but I had been using 5 as the agreeable answer to every previous question.&lt;/p&gt;&lt;p&gt;This is incredibly confusing.&lt;/p&gt;&lt;h3 id=&quot;avoid-leading-and-loaded-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#avoid-leading-and-loaded-questions&quot; class=&quot;heading-anchor&quot;&gt;Avoid leading and loaded questions&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Questions that lead respondents towards a certain answer due bias in their phrasing are not useful for your surveys. SurveyMonkey offers a great example of a leading question to avoid: &amp;gt; We have recently upgraded SurveyMonkey’s features to become a first-class tool. What are your thoughts on the new site?&lt;/p&gt;&lt;p&gt;Remember to cut out language that caters to ego or contorts a respondent’s understanding of what’s being asked. To avoid loaded questions, stay away from any presupposed facts or assumptions.&lt;/p&gt;&lt;p&gt;A well-known example on disciplinary action with children is as follows: &amp;gt; Should a smack as part of good parental correction be a criminal offence in New Zealand?&lt;/p&gt;&lt;p&gt;The assumption here is that smacking a child is inherently a part of “good” parental correction, when in fact that is the opinion being argued. You can avoid loaded questions in your surveys by eliminating emotionally charged language that hints at preferences or assumed facts.&lt;/p&gt;&lt;h3 id=&quot;make-use-of-yes/no-questions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#make-use-of-yes/no-questions&quot; class=&quot;heading-anchor&quot;&gt;Make use of Yes/No questions&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;When you are asking a question that has a simple outcome, try to frame the question as a Yes/No option.&lt;/p&gt;&lt;p&gt;The Survey Monkey study showed that these closed-ended questions make for great starter questions because they are typically easier to evaluate and complete.&lt;/p&gt;&lt;p&gt;These questions can also be used to qualify the respondent with less of an ego bias, such as asking a question like, “Are you considered an expert in [blank]?” vs.&amp;nbsp;“What level of expertise do you have in [blank]?”&lt;/p&gt;&lt;h3 id=&quot;get-specific-and-avoid-assumptions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#get-specific-and-avoid-assumptions&quot; class=&quot;heading-anchor&quot;&gt;Get specific and avoid assumptions&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;When you create questions that implicitly assume a customer is knowledgeable about something, you’re probably going to run into problems (unless you are surveying a targeted subset of people).&lt;/p&gt;&lt;p&gt;One big culprit is the language and terminology you use in questions, which is why I’d recommend staying away from industry acronyms, jargon, or references.&lt;/p&gt;&lt;p&gt;One of the worst assumptions you can make is to assume people will answer with specific examples, or to explain their reasoning. It’s better to ask them to be specific, and let them know you welcome this sort of feedback:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;How do you feel about [blank]? Feel free to get specific; we love detailed feedback!&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;timing-is-important&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#timing-is-important&quot; class=&quot;heading-anchor&quot;&gt;Timing is important&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The Survey Monkey study found the highest survey open and click-through rates occurred on Monday, Friday and Sunday respectively.&lt;/p&gt;&lt;p&gt;There was no discernible difference between the response quality gathered on weekdays versus weekends, either, your best bet is to seek out survey-takers first thing during a new week or to wait for the weekend. Perhaps Monday has such high response rates because nobody feels like working.&lt;/p&gt;&lt;h3 id=&quot;give-them-a-bonus&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#give-them-a-bonus&quot; class=&quot;heading-anchor&quot;&gt;Give them a bonus&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;It sometimes makes sense to entice customers to take your survey: a variety of data show that incentives can increase survey response rates by 5 to 20 percent. These incentives could be a discount, a giveaway or account credit.&lt;/p&gt;&lt;p&gt;A valid fear is that a freebie may detract from the quality of responses, but a few studies show that this isn’t likely to be the case. Make incentives something you can financially handle, such as an extended trial of your software for a period of time.&lt;/p&gt;&lt;h2 id=&quot;ways-of-surveying&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#ways-of-surveying&quot; class=&quot;heading-anchor&quot;&gt;Ways of Surveying&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Three ways of surveying your end users are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Immediate feedback on any page&lt;/li&gt;&lt;li&gt;After some event like the close of an incident or request&lt;/li&gt;&lt;li&gt;On a frequency survey&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Survey’s can be helpful and I’d suggest having at least one of the below set up to get a indicator of where you are, and how you can improve.&lt;/p&gt;&lt;p&gt;ServiceNow’s built in survey engine has some room for improvement but is good enough for most survey’s needs. The problem is they are not nearly as intuitive to set up as&amp;nbsp;&lt;a href=&quot;http://surveymonkey.com/&quot; rel=&quot;noopener&quot;&gt;SurveyMonkey&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Based on the feedback that you begin to receive you can decide if extra questions should be asked. However, you want to make sure that Surveys are&amp;nbsp;&lt;strong&gt;simple and short&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Follow up on any comments that show someone had less then a stellar experience to get more details Adjust your question where you find a pattern with comments that people are leaving to ensure you are capturing the right data&lt;/p&gt;&lt;h3 id=&quot;immediate-feedback&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#immediate-feedback&quot; class=&quot;heading-anchor&quot;&gt;Immediate Feedback&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I love the idea of having a simple “How can we make this page better for you?” as pictured below. I’d have it have a thumbs up, and thumbs down to submit, and on press of enter submit w/out thumb up or down value.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/KBFuFBqxUF-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/KBFuFBqxUF-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;135&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h3 id=&quot;after-an-event&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#after-an-event&quot; class=&quot;heading-anchor&quot;&gt;After an Event&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;What kinds of events?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Resolution of an Incident accepted.&lt;/li&gt;&lt;li&gt;Close of an Incident.&lt;/li&gt;&lt;li&gt;Close of a Requested Item.&lt;/li&gt;&lt;li&gt;Close of a Project.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The key here is&amp;nbsp;&lt;strong&gt;asking right away&lt;/strong&gt;&amp;nbsp;to keep information fresh in the users mind.&lt;/p&gt;&lt;h3 id=&quot;regularly-scheduled&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#regularly-scheduled&quot; class=&quot;heading-anchor&quot;&gt;Regularly Scheduled&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;These are great in keeping a heart beat on the satisfacation and other metrics gathered from the survey.&lt;/p&gt;&lt;p&gt;Pretty much per application, I’d ask some questions monthly or quarterly.&lt;/p&gt;&lt;h2 id=&quot;examples&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#examples&quot; class=&quot;heading-anchor&quot;&gt;Examples&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;list-of-questions-seen&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#list-of-questions-seen&quot; class=&quot;heading-anchor&quot;&gt;List of questions seen&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Category&lt;/th&gt;&lt;th&gt;Goals: What do you need to know?&lt;/th&gt;&lt;th&gt;Great! Then you should ask this:&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Overall satisfaction&lt;/td&gt;&lt;td&gt;How the customer felt overall&lt;/td&gt;&lt;td&gt;Was the incident/issue resolved to your satisfaction?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Overall satisfaction&lt;/td&gt;&lt;td&gt;How the customer felt overall&lt;/td&gt;&lt;td&gt;Was this ticket resolved to your satisfaction?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Overall satisfaction&lt;/td&gt;&lt;td&gt;How the customer felt overall&lt;/td&gt;&lt;td&gt;How would you rate your overall satisfaction?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Overall satisfaction&lt;/td&gt;&lt;td&gt;How the customer felt overall&lt;/td&gt;&lt;td&gt;What changes could we make that would have improved your experience?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Overall satisfaction&lt;/td&gt;&lt;td&gt;How the customer felt overall&lt;/td&gt;&lt;td&gt;How likely is it that you would recommend our services to your peers?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Overall satisfaction&lt;/td&gt;&lt;td&gt;How the customer felt overall&lt;/td&gt;&lt;td&gt;How likely is it that you would recommend us to a colleague?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Overall satisfaction&lt;/td&gt;&lt;td&gt;How the customer felt overall&lt;/td&gt;&lt;td&gt;How likely are you to recommend this website to a colleague?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Overall satisfaction&lt;/td&gt;&lt;td&gt;How the customer felt overall&lt;/td&gt;&lt;td&gt;How would you describe your experience?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Overall satisfaction&lt;/td&gt;&lt;td&gt;How the customer felt overall&lt;/td&gt;&lt;td&gt;What would you like us to know about this experience?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Quality of products/services&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;How satisfied were you with _____ product?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Quality of products/services&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Do you have any suggestions for improving our products/services?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Quality of products/services&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Which of the following words best describe our products?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Quality of products/services&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;How well do our products meet your needs?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Quality of products/services&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;How satisfied were you with the implementation related to the attention to detail?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Time to Completion&lt;/td&gt;&lt;td&gt;Customer perspective&lt;/td&gt;&lt;td&gt;Were you satisfied with the response time to your _____?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Time to Completion&lt;/td&gt;&lt;td&gt;Customer perspective&lt;/td&gt;&lt;td&gt;Was your ____ completed within the expected time frame?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staffing&lt;/td&gt;&lt;td&gt;satisfaction with staff&lt;/td&gt;&lt;td&gt;How satisfied were you with how the support staff resolved your most recent problem?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staffing&lt;/td&gt;&lt;td&gt;Knowledgeable&lt;/td&gt;&lt;td&gt;Did you feel the associate was knowledgeable in the area of support?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staffing&lt;/td&gt;&lt;td&gt;Knowledgeable&lt;/td&gt;&lt;td&gt;How knowledgeable was the associate who handled your inquiry?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staffing&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Please rate the technical competency of the technician serving you.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staffing&lt;/td&gt;&lt;td&gt;Effective&lt;/td&gt;&lt;td&gt;How helpful was the associate who handled your inquiry?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staffing&lt;/td&gt;&lt;td&gt;Professionalism&lt;/td&gt;&lt;td&gt;Did the associate help you in a professional and courteous manner?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staffing&lt;/td&gt;&lt;td&gt;Communication&lt;/td&gt;&lt;td&gt;How did your support associate communicate with you?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staffing&lt;/td&gt;&lt;td&gt;Communication&lt;/td&gt;&lt;td&gt;Rate your satisfaction of your support associate’s communications.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staffing&lt;/td&gt;&lt;td&gt;Communication&lt;/td&gt;&lt;td&gt;How responsive have we been to your questions or concerns as we completed work on this ticket?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staffing&lt;/td&gt;&lt;td&gt;Communication&lt;/td&gt;&lt;td&gt;How well did we communicate with you during the completion of this ticket?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Room Booking&lt;/td&gt;&lt;td&gt;Room&lt;/td&gt;&lt;td&gt;How well did the room meet your meeting needs?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Room Booking&lt;/td&gt;&lt;td&gt;Setup&lt;/td&gt;&lt;td&gt;Was the room set up as requested?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Room Booking&lt;/td&gt;&lt;td&gt;Ease of use&lt;/td&gt;&lt;td&gt;How easy was it to use the room equipment?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-support experience&lt;/td&gt;&lt;td&gt;Portal design&lt;/td&gt;&lt;td&gt;How satisfied are you with our website?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-support experience&lt;/td&gt;&lt;td&gt;Portal design&lt;/td&gt;&lt;td&gt;Rate the Ease of navigation of the site.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-support experience&lt;/td&gt;&lt;td&gt;Portal design&lt;/td&gt;&lt;td&gt;Rate the Freshness of content&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-support experience&lt;/td&gt;&lt;td&gt;Portal design&lt;/td&gt;&lt;td&gt;Rate the Accuracy of information&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-support experience&lt;/td&gt;&lt;td&gt;Portal design&lt;/td&gt;&lt;td&gt;Rate the Quality of content&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-support experience&lt;/td&gt;&lt;td&gt;Portal design&lt;/td&gt;&lt;td&gt;Rate the Quantity of content&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-support experience&lt;/td&gt;&lt;td&gt;Portal design&lt;/td&gt;&lt;td&gt;Rate the Layout/design&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-support experience&lt;/td&gt;&lt;td&gt;Portal design&lt;/td&gt;&lt;td&gt;Rate the Customer support&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-support experience&lt;/td&gt;&lt;td&gt;marketing/evangelism&lt;/td&gt;&lt;td&gt;How did you learn about this site?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-support experience&lt;/td&gt;&lt;td&gt;use &amp;amp; effectiveness&lt;/td&gt;&lt;td&gt;Did you try to solve this issue using the knowledge base before opening this ticket?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-support experience&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;How would you rate the ease of use when creating your service catalog request?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Change Requests&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Were there any issues created by the implementation of this change request?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Change Requests&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;How satisfied were you with your overall change request experience?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Closing&lt;/td&gt;&lt;td&gt;Additional comments&lt;/td&gt;&lt;td&gt;Is there anything else you would like us to know about your support experience?&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;most-common-survey&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#most-common-survey&quot; class=&quot;heading-anchor&quot;&gt;Most Common Survey&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Question&lt;/th&gt;&lt;th&gt;Answer&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;How would you rate your overall satisfaction?&lt;/td&gt;&lt;td&gt;Very SatisfiedSatisfiedDissatisfiedVery dissatisfied&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;What changes could we make that would have improved your experience?&lt;/td&gt;&lt;td&gt;Open Text&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Were you satisfied with the response time to your ticket?&lt;/td&gt;&lt;td&gt;YesNo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;How helpful was the associate who handled your inquiry?&lt;/td&gt;&lt;td&gt;He/she was fabulous!They did the needfulMy experience with this associate was somewhat frustratingThe associate did not resolve this issue&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Is there anything else you would like us to know about your support experience?&lt;/td&gt;&lt;td&gt;Open Text&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;survey-used-after-the-close-of-an-incident&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#survey-used-after-the-close-of-an-incident&quot; class=&quot;heading-anchor&quot;&gt;Survey used after the close of an incident&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Question&lt;/th&gt;&lt;th&gt;Answer Type&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;How satisfied were you with the service you received?&lt;/td&gt;&lt;td&gt;1-10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;We value your feedback: Please provide us with any comments regarding your experience with this interaction&lt;/td&gt;&lt;td&gt;Open Text Box&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;survey-used-by-servicenow-internally&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#survey-used-by-servicenow-internally&quot; class=&quot;heading-anchor&quot;&gt;Survey used by Servicenow internally&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Question&lt;/th&gt;&lt;th&gt;Answer Type&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Is this the best support you have received in any company/organization?&lt;/td&gt;&lt;td&gt;1-10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Please rate your experience with reaction/response time&lt;/td&gt;&lt;td&gt;1-10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Please rate your experience with effectiveness&lt;/td&gt;&lt;td&gt;1-10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Please rate your experience with customer service&lt;/td&gt;&lt;td&gt;1-10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Are there any tools or services that you feel need better training &amp;amp; documentation&lt;/td&gt;&lt;td&gt;1-10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;We value your feedback: Please tell us what we can do to improve your overall experience?&lt;/td&gt;&lt;td&gt;Open Text Box&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;wordpress-minneapolis-2017&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#wordpress-minneapolis-2017&quot; class=&quot;heading-anchor&quot;&gt;Wordpress Minneapolis 2017&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This survey isn’t short, and asks more than one question at a time. It also asks questions regardless of answers. Don’t do this.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/qQHFLbJe0I-650.webp 650w, https://jace.pro/img/qQHFLbJe0I-960.webp 960w, https://jace.pro/img/qQHFLbJe0I-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/qQHFLbJe0I-650.jpeg&quot; alt=&quot;A long survey from the Minneapolis Wordpress event in 2017&quot; title=&quot;A long survey from the Minneapolis Wordpress event in 2017&quot; width=&quot;1280&quot; height=&quot;12220&quot; srcset=&quot;https://jace.pro/img/qQHFLbJe0I-650.jpeg 650w, https://jace.pro/img/qQHFLbJe0I-960.jpeg 960w, https://jace.pro/img/qQHFLbJe0I-1280.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;A long survey from the Minneapolis Wordpress event in 2017&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 id=&quot;upgrade-instance-survey&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#upgrade-instance-survey&quot; class=&quot;heading-anchor&quot;&gt;Upgrade Instance Survey&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This survey is concise and satisfying.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/QK2ezah9sU-650.webp 650w, https://jace.pro/img/QK2ezah9sU-876.webp 876w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/QK2ezah9sU-650.jpeg&quot; alt width=&quot;876&quot; height=&quot;255&quot; srcset=&quot;https://jace.pro/img/QK2ezah9sU-650.jpeg 650w, https://jace.pro/img/QK2ezah9sU-876.jpeg 876w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/rkfnDocgQY-650.webp 650w, https://jace.pro/img/rkfnDocgQY-862.webp 862w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/rkfnDocgQY-650.jpeg&quot; alt width=&quot;862&quot; height=&quot;251&quot; srcset=&quot;https://jace.pro/img/rkfnDocgQY-650.jpeg 650w, https://jace.pro/img/rkfnDocgQY-862.jpeg 862w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/lpjZCh7p_P-650.webp 650w, https://jace.pro/img/lpjZCh7p_P-841.webp 841w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/lpjZCh7p_P-650.jpeg&quot; alt width=&quot;841&quot; height=&quot;674&quot; srcset=&quot;https://jace.pro/img/lpjZCh7p_P-650.jpeg 650w, https://jace.pro/img/lpjZCh7p_P-841.jpeg 841w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/D2y-4CZjCr-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/D2y-4CZjCr-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;172&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/ligz8abyUo-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/ligz8abyUo-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;140&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;I know at a past place, I set up a business rule on a question to notify the manager of the incident that spawned the survey to followup. That was a easy big win&lt;/p&gt;&lt;h2 id=&quot;further-reading&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/thoughts-on-surveys/#further-reading&quot; class=&quot;heading-anchor&quot;&gt;Further Reading&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://blog.kissmetrics.com/best-ways-to-get-feedback/&quot; rel=&quot;noopener&quot;&gt;The 5 Best Ways to Get Feedback from Your Customers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/docs/DOC-4451&quot; rel=&quot;noopener&quot;&gt;Survey Question Examples&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/docs/DOC-6393&quot; rel=&quot;noopener&quot;&gt;CSAT Question and Answer Option Menu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-servicenow-platform/page/administer/survey-administration/concept/c_SurveyServicePortal.html&quot; rel=&quot;noopener&quot;&gt;ServiceNow Survey Docs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://wcminneapolis.polldaddy.com/s/wordcamp-minneapolis-st-paul-2017-survey&quot; rel=&quot;noopener&quot;&gt;Wordpress Survey&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Service Portal - Accept/Reject Solution</title>
      <link href="https://jace.pro/blog/service-portal-accept/reject-solution/" />
      <updated>2017-10-27T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-accept/reject-solution/</id>
      <content type="html">
				&lt;p&gt;I created a widget and wanted to share that code. Should work on any instance unless you have a business rule blocking the update.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/Q3qRcuwpUG-285.webp 285w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/Q3qRcuwpUG-285.jpeg&quot; alt width=&quot;285&quot; height=&quot;127&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;client-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-accept/reject-solution/#client-script&quot; class=&quot;heading-anchor&quot;&gt;Client Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Client Script&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* widget controller */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;acceptRecord&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;action &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;accept&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inputTable  &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inputSys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;rejectRecord&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;action &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;reject&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inputTable  &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inputSys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;server-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-accept/reject-solution/#server-script&quot; class=&quot;heading-anchor&quot;&gt;Server Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Server Script&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* populate the &#39;data&#39; object */&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* e.g., data.table = $sp.getValue(&#39;table&#39;); */&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;debug &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;canRead &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;show &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;accept&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Solution Accepted.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Solution Rejected.&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rules &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;custom_table&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;//query to show widget on, solution proposed&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;showOn&lt;/span&gt;   &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;state=6^u_contactDYNAMIC90d1921e5f510100a9ad2572f2b477fe&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;accept&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//state to set to if &#39;accept&#39;, closed&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;accept
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//state to set to if &#39;reject&#39;, active&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reject
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;incident&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;//query to show widget on, solution proposed&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;showOn&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;state=6^caller_idDYNAMIC90d1921e5f510100a9ad2572f2b477fe&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;accept&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//state to set to if &#39;accept&#39;, closed&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;accept
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//state to set to if &#39;reject&#39;, active&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;messages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reject
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sys_id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;table&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; task &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; actualTable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_class_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; actualTask &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;actualTable&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      actualTask&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      actualTask&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rules&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;actualTable&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;showOn&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      actualTask&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;actualTask&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;show &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; actualTask&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_class_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errorMsg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Could not find record to get table fields&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errorMsg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Could not find record to get classname&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;action&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; rule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rules&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inputTable&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fields&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;action&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rules&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inputTable&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;action&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; taskUpdate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inputTable&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;taskUpdate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inputSys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; field &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; rule&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//console.log(&#39;setting &#39; + field + &#39;: &#39; + rule[field]);&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;comments&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; field &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;work_notes&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          taskUpdate&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rule&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          taskUpdate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; rule&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      taskUpdate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;show &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;cound not find record&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;html&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-accept/reject-solution/#html&quot; class=&quot;heading-anchor&quot;&gt;HTML&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!--Template--&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-if&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;data.canRead &amp;amp;&amp;amp; data.show&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;panel panel-primary b&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;panel-heading&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h4&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;panel-title pull-left&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      ${Solution Proposed}
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;clearfix&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;panel-body&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-center&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;btn btn-success&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token attr-name&quot;&gt;ng-click&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;acceptRecord()&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        ${Accept}
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;btn btn-danger&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token attr-name&quot;&gt;ng-click&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;rejectRecord()&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        ${Reject}
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-if&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;data.debug&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>4 tasks I do to my Personal Developer Instance (PDI)</title>
      <link href="https://jace.pro/blog/4-tasks-i-do-to-my-personal-developer-instance-pdi/" />
      <updated>2017-10-25T00:00:00Z</updated>
      <id>https://jace.pro/blog/4-tasks-i-do-to-my-personal-developer-instance-pdi/</id>
      <content type="html">
				&lt;p&gt;Create a personal admin account, lockout other accounts, and set up and plugins you need.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Create Local Account with your name/email&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Give your account&amp;nbsp;&lt;code&gt;admin&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code&gt;security_admin&lt;/code&gt;&amp;nbsp;roles&lt;/li&gt;&lt;li&gt;Script To do this&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Lockout all other users&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Activate Plugins&lt;/p&gt;&lt;ul&gt;&lt;li&gt;User Registration Request&lt;/li&gt;&lt;li&gt;App Engine Studio&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Load any update sets&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h1 id=&quot;update-sets&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/4-tasks-i-do-to-my-personal-developer-instance-pdi/#update-sets&quot; class=&quot;heading-anchor&quot;&gt;Update Sets&lt;/a&gt;&lt;/h1&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Share&lt;/th&gt;&lt;th&gt;Git&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Xplore&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/thewhitespace/Xplore/&quot; rel=&quot;noopener&quot;&gt;Github&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Code Search Service Portal Widget&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/jacebenson/servicenow-code/blob/docs/README.md&quot; rel=&quot;noopener&quot;&gt;Github&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;background-script-to-do-this&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/4-tasks-i-do-to-my-personal-developer-instance-pdi/#background-script-to-do-this&quot; class=&quot;heading-anchor&quot;&gt;Background Script To Do This&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// This will make a user with and id of slack&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// password of password with appropriate roles.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; users &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;jace.benson&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;firstName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Jace&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;lastName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Benson&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;slack&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;slack&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;firstName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;slack&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;lastName&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;er&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;slack&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createUserWithRoles&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;userObj&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; userGR &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;user_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; userObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// donothing&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        userGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    userGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;user_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; userObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    userGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;true&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    userGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;first_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; userObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;firstName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    userGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;last_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; userObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lastName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    userGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;locked_out&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    userGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;password_needs_reset&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;true&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    userGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;user_password&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; userObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;password&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    userGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setWorkflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;false&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;userObj.id: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; userObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;userObj.id: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; userObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;password&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; userSysId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; userGR&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;giveRole&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userSysId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;admin&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;giveRole&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userSysId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;security_admin&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;giveRole&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;userId&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; roleName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; give &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_user_has_role&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    give&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    give&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; userId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    give&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;role&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; roleName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    give&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;lockOutEveryoneElse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; usersToLockOut &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    usersToLockOut&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_created_on&amp;lt;javascript:gs.beginningOfToday()&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    usersToLockOut&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;usersToLockOut&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        usersToLockOut&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;locked_out&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        usersToLockOut&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
users&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;createUserWithRoles&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;lockOutEveryoneElse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;activatePlugins&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; plugins &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    plugins&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;com.snc.user_registration&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    plugins&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;com.snc.app-engine-studio&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; main &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideMultiPluginManagerWorker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setPluginIds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;plugins&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setProgressName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Plugin Installer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setBackground&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;activatePlugins&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Service Portal - Custom Search Source</title>
      <link href="https://jace.pro/blog/service-portal-custom-search-source/" />
      <updated>2017-10-18T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-custom-search-source/</id>
      <content type="html">
				&lt;p&gt;We have knowledge bases at my work and as such the default search is limited. I wanted to add to the type ahead a result like “Search all KB’s for&amp;nbsp;&lt;code&gt;your term here&lt;/code&gt;”.&lt;/p&gt;&lt;p&gt;I looked at the search sources and found it has a scripted bit but it’s &lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-servicenow-platform/page/build/service-portal/task/add-table-search-source.html&quot; rel=&quot;noopener&quot;&gt;not documented well&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/iFb3eXmEOM-650.webp 650w, https://jace.pro/img/iFb3eXmEOM-960.webp 960w, https://jace.pro/img/iFb3eXmEOM-1262.webp 1262w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/iFb3eXmEOM-650.jpeg&quot; alt=&quot;Finished Product&quot; width=&quot;1262&quot; height=&quot;713&quot; srcset=&quot;https://jace.pro/img/iFb3eXmEOM-650.jpeg 650w, https://jace.pro/img/iFb3eXmEOM-960.jpeg 960w, https://jace.pro/img/iFb3eXmEOM-1262.jpeg 1262w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;oob-search-source&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-custom-search-source/#oob-search-source&quot; class=&quot;heading-anchor&quot;&gt;OOB Search Source&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;So first lets look at the out of box “Service Catalog” search source,&lt;br&gt;specifically it’s data fetch (shows up when you select,&lt;br&gt;&lt;code&gt;Is scripted source&lt;/code&gt;)&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; results &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Here goes the logic. Compute results how you want!&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isLoggedIn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; results&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_cat_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;123TEXTQUERY321&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; query&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;no_search&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;!=&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;visible_standalone&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_class_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;NOT IN&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sc_cat_item_wizard&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; portalValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_catalog&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;portalValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_catalogs&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; portalValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; catCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; catCount &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;limit&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;canReadRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sc&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sc_cat_item&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRecordClassName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sc_cat_item_guide&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sc_cat_item_guide&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRecordClassName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sc_cat_item_content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_cat_item_content&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getUniqueValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            $sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRecordValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;url,content_type,kb_article&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sc_content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
            item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sc&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        $sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRecordDisplayValues&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;name,short_description,picture,price,sys_id,sys_class_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;score &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ir_query_score&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;label &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;primary &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;//calculating URL&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sc&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;?id=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;page &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;amp;sys_id=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sc_content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content_type &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;kb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;?id=kb_article&amp;amp;sys_id=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;kb_article&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content_type &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;external&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_blank&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
                item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;?id=sc_cat_item&amp;amp;sys_id=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sc_guide&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;?id=sc_cat_item_guide&amp;amp;sys_id=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        catCount&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; results&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;query&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There’s a lot going on there, but what I picked out was, it returns an&lt;br&gt;array of objects where the object has the following properties;&lt;/p&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    score&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-100&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    label&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;resultMsg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    primary&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;resultMsg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    url&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;?id=kb_search&amp;amp;spa=1&amp;amp;query=&quot;&lt;/span&gt; + query&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//target: &quot;&quot;,&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//page:&quot;kb_search&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;score&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-custom-search-source/#score&quot; class=&quot;heading-anchor&quot;&gt;Score&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This seems pretty obvious to me, a integer to determine order in the results&lt;/p&gt;&lt;h2 id=&quot;label-and-primary&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-custom-search-source/#label-and-primary&quot; class=&quot;heading-anchor&quot;&gt;Label and Primary&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I’m not sure the difference but this seems to be what shows up as text in the result.&lt;/p&gt;&lt;h2 id=&quot;url&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-custom-search-source/#url&quot; class=&quot;heading-anchor&quot;&gt;URL&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is where the browser will go on click.&lt;/p&gt;&lt;h2 id=&quot;target&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-custom-search-source/#target&quot; class=&quot;heading-anchor&quot;&gt;Target&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I assume this is the a tag’s&amp;nbsp;&lt;code&gt;target&lt;/code&gt;&amp;nbsp;attribute, so if you want a new tab each time use a value of&amp;nbsp;&lt;code&gt;_blank&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&quot;page&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-custom-search-source/#page&quot; class=&quot;heading-anchor&quot;&gt;Page&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I am not sure if this does anything on it’s own, in the out of box widget they use this in the defined url.&lt;/p&gt;&lt;h2 id=&quot;search-source-i-made&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-custom-search-source/#search-source-i-made&quot; class=&quot;heading-anchor&quot;&gt;Search Source I made&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Below is my search source script.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; resultMsg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Search KB for &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; query&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; results &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;score&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-100&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;resultMsg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;primary&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;resultMsg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;?id=kb_search&amp;amp;spa=1&amp;amp;query=&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; query&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//target: &quot;&quot;,&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//page:&quot;kb_search&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; results&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;query&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;further-reading&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-custom-search-source/#further-reading&quot; class=&quot;heading-anchor&quot;&gt;Further Reading&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://community.servicenow.com/community/develop/blog/2017/03/29/using-scripted-search-sources-to-search-external-websites-and-applications&quot; rel=&quot;noopener&quot;&gt;Community Thread&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Service Portal Woes</title>
      <link href="https://jace.pro/blog/service-portal-woes/" />
      <updated>2017-10-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-woes/</id>
      <content type="html">
				&lt;p&gt;Two items I have to call out. First, this was inspired by&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/thread/282244&quot; rel=&quot;noopener&quot;&gt;Ratesh Shah’s post&lt;/a&gt;. Second, you can read “Official” client script restrictions here on the&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-servicenow-platform/page/build/service-portal/concept/unsupported_client_scripts.html&quot; rel=&quot;noopener&quot;&gt;docs&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;client-scripting-issues&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-woes/#client-scripting-issues&quot; class=&quot;heading-anchor&quot;&gt;Client Scripting issues&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The Service Portal has more restrictions on it then the classic UI. In the past, any DOM manipulation or access and use of window across scripts was frowned on. With the Service Portal ServiceNow has removed the ability to mess with the Document Object Model (DOM). If you want to use those you’ll have to change your scripts below.&lt;/p&gt;&lt;h3 id=&quot;unsupported-client-scripting-globals&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-woes/#unsupported-client-scripting-globals&quot; class=&quot;heading-anchor&quot;&gt;Unsupported client scripting globals&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The following globals and APIs are unavailable in client scripts in the Service Portal.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Thing&lt;/th&gt;&lt;th&gt;Description of the thing&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;window&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Window&quot; rel=&quot;noopener&quot;&gt;This is a object used by all browsers&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;document&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/document&quot; rel=&quot;noopener&quot;&gt;This is a object used by all browsers&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;$&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://api.prototypejs.org/dom/dollar/&quot; rel=&quot;noopener&quot;&gt;Prototypejs selector&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;$$&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://api.prototypejs.org/dom/dollar-dollar/&quot; rel=&quot;noopener&quot;&gt;Prototypejs css selector&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;jQuery&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://api.jquery.com/&quot; rel=&quot;noopener&quot;&gt;jQuery&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;$j&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Alias for&amp;nbsp;&lt;a href=&quot;http://api.jquery.com/&quot; rel=&quot;noopener&quot;&gt;jQuery&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;angular&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://docs.angularjs.org/api/&quot; rel=&quot;noopener&quot;&gt;Angular&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;jslog&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-servicenow-platform/page/script/debugging/concept/c_WritingToTheDebugLog.html&quot; rel=&quot;noopener&quot;&gt;Docs&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;gel&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Shortcut for&amp;nbsp;&lt;code&gt;window.getElementByID()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;re-usable-utility-functions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-woes/#re-usable-utility-functions&quot; class=&quot;heading-anchor&quot;&gt;Re-usable utility functions&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Macros and any&amp;nbsp;&lt;a href=&quot;https://jace.pro/jelly&quot; rel=&quot;noopener&quot;&gt;Jelly&lt;/a&gt;&amp;nbsp;are not supported on Service Portal. Two ways around this is Widget dependencies or the ScriptLoader utility.&lt;/p&gt;&lt;h3 id=&quot;widget-dependencies&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-woes/#widget-dependencies&quot; class=&quot;heading-anchor&quot;&gt;Widget Dependencies&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In Service Portal, you can add&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-servicenow-platform/page/build/service-portal/task/widget-dependencies.html&quot; rel=&quot;noopener&quot;&gt;widget dependencies&lt;/a&gt; for re-usable utility functions.&lt;/p&gt;&lt;h3 id=&quot;scriptloader&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-woes/#scriptloader&quot; class=&quot;heading-anchor&quot;&gt;ScriptLoader&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Another way would be to add a&amp;nbsp;&lt;a href=&quot;https://sn.jace.pro/docs/scripting/scriptloader/&quot; rel=&quot;noopener&quot;&gt;ScriptLoader&lt;/a&gt;&amp;nbsp;to the client script.&lt;/p&gt;&lt;h2 id=&quot;ui-type-for-catalog-client-scripts-and-catalog-ui-policies&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-woes/#ui-type-for-catalog-client-scripts-and-catalog-ui-policies&quot; class=&quot;heading-anchor&quot;&gt;UI Type for Catalog Client Scripts and Catalog UI Policies&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;If you want a catalog client script to work on both service portal / mobile and regular platform, you must select UI Type = ALL or&amp;nbsp;service portal / mobile. It may be tempting to update every client script’s UI Type to All. for all catalog client scripts, but it may not be a good idea for performance reasons. Sometimes, there is a valid reason not to make the catalog client script available on portal due to functional reasons.&lt;/p&gt;&lt;p&gt;If you want a catalog UI policy to work on both service portal / mobile and regular platform, you must select Run scripts in UI Type = All. Use All, Desktop or Service Portal / Mobile based on your ask as explained above. This field is not available on the form, you can change it from list view.&lt;/p&gt;&lt;p&gt;You can use window object to detect if your catalog item is being used in Service Portal or CMS (Rest of platform).&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// you are in CMS&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// you are in Service Portal&amp;lt;/em&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Kingston</title>
      <link href="https://jace.pro/blog/kingston/" />
      <updated>2017-10-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/kingston/</id>
      <content type="html">
				&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Section&lt;/th&gt;&lt;th&gt;Link&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Flow Designer &amp;amp; IntegrationHub&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/GtAFuOgnfU8?t=594&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/GtAFuOgnfU8?t=594&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Function Fields&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/av8Azb6nOqE?t=925&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/av8Azb6nOqE?t=925&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Agent Intelligence&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/av8Azb6nOqE?t=1292&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/av8Azb6nOqE?t=1292&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Email Digests&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/av8Azb6nOqE?t=1442&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/av8Azb6nOqE?t=1442&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Service Portal announcements&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/av8Azb6nOqE?t=1996&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/av8Azb6nOqE?t=1996&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Service Portal order guide widget&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/av8Azb6nOqE?t=2212&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/av8Azb6nOqE?t=2212&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Service Portal dynamic page titles&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/av8Azb6nOqE?t=2909&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/av8Azb6nOqE?t=2909&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;flow-designer-and-integrationhub&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/kingston/#flow-designer-and-integrationhub&quot; class=&quot;heading-anchor&quot;&gt;Flow Designer &amp;amp; IntegrationHub&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow® Flow Designer is a new Now Platform feature in the Kingston release.&lt;/p&gt;&lt;p&gt;Enable process owners to use natural language to automate approvals, tasks, notifications, and record operations without having to code. Use a single design environment to author flows and actions and manage flow executions.&lt;/p&gt;&lt;p&gt;Lower the barrier for automation and speed up development by creating an ecosystem of reusable content available to any flow. Reduce upgrade times and technical debt by replacing customized business logic with native Now Platform actions.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/kingston-release-notes/page/release-notes/servicenow-platform/flow-designer-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;agent-intelligence&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/kingston/#agent-intelligence&quot; class=&quot;heading-anchor&quot;&gt;Agent Intelligence&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow® Agent Intelligence is a new Now Platform feature in the Kingston release.&lt;/p&gt;&lt;p&gt;Use machine-learning algorithms to set field values during record creation such as setting the incident category based on the short description. Train predictive models to act as an agent to categorize and route work based on your past record-handling experience.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/kingston-release-notes/page/release-notes/servicenow-platform/agent-intelligence-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;function-fields&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/kingston/#function-fields&quot; class=&quot;heading-anchor&quot;&gt;Function Fields&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow® Function fields are a new Now Platform feature in the Kingston release.&lt;/p&gt;&lt;p&gt;All supported relational database management systems (RDBMS) provide a common set of built-in functions that can be used in SQL statements: string, mathematical, and so on. Function fields and function scripts let application developers and administrators use those functions in the platform in an integrated and familiar way without requiring any knowledge of SQL or RDBMS specifics.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/kingston-release-notes/page/release-notes/servicenow-platform/platform-support-functions-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;email-digests&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/kingston/#email-digests&quot; class=&quot;heading-anchor&quot;&gt;Email Digests&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Enable an email digest, a single email that summarizes the activity for a notification during a digest (time) interval that you specify. By enabling an email digest for a selected notification, you can reduce the number of emails received when associated records are frequently updated. Admins create the email digest format for a notification and control the digest intervals that users can choose when enabling a digest in their notification preferences.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/kingston-release-notes/page/release-notes/servicenow-platform/notifications-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;service-portal&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/kingston/#service-portal&quot; class=&quot;heading-anchor&quot;&gt;Service Portal&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow® Service Portal product enhancements and updates in the Kingston release.&lt;/p&gt;&lt;p&gt;Service Portal is a portal framework that helps you build a mobile-friendly self-service experience.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/kingston-release-notes/page/release-notes/servicenow-platform/service-portal-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;order-guide-widget&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/kingston/#order-guide-widget&quot; class=&quot;heading-anchor&quot;&gt;Order Guide Widget&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The order guides are available and decent with Service portal.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/kingston-servicenow-platform/page/build/service-portal/concept/sc-order-guide-widget.html&quot; rel=&quot;noopener&quot;&gt;Notes&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;font-awesome-upgraded-to-47&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/kingston/#font-awesome-upgraded-to-47&quot; class=&quot;heading-anchor&quot;&gt;Font Awesome upgraded to 4.7&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The Font Awesome library has been upgraded to version 4.7 and includes new icon names and syntax changes. If your Service Portal implementation includes custom use of the Font Awesome library, you may need to update icon names in your custom widgets.&lt;/p&gt;&lt;h3 id=&quot;announcements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/kingston/#announcements&quot; class=&quot;heading-anchor&quot;&gt;Announcements&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Use announcements to broadcast messages to Service Portal users.&lt;/p&gt;&lt;p&gt;Announcements can be displayed in an announcement banner or an announcement widget instance.&lt;/p&gt;&lt;p&gt;Announcements are active on new instances. To activate announcements after upgrade, activate the Service Portal Announcements (&lt;code&gt;com.glide.service-portal.announcements&lt;/code&gt;) plugin.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Jakarta</title>
      <link href="https://jace.pro/blog/jakarta/" />
      <updated>2017-10-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/jakarta/</id>
      <content type="html">
				&lt;ul&gt;&lt;li&gt;In the left hand search field,&amp;nbsp;&lt;code&gt;table.config&lt;/code&gt;&amp;nbsp;has been added.&lt;/li&gt;&lt;li&gt;In journaled fields, now videos are added like image files in the activity formatters.&lt;/li&gt;&lt;li&gt;Export to JSON is new and neat.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://jace.pro/search-api&quot; rel=&quot;noopener&quot;&gt;Global search&lt;/a&gt;&amp;nbsp;is different&lt;/li&gt;&lt;/ul&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Section&lt;/th&gt;&lt;th&gt;Link&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;UI changes&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=506&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=506&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mobile&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=793&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=793&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Security Auth&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=848&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=848&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Securit Role mgmt&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=918&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=918&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Service portal&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=995&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=995&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Global search&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=1162&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=1162&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Interfaces&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=1343&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=1343&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Guided tour designer&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=1529&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=1529&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Notifications&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=1940&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=1940&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Orchestatrion&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=2469&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=2469&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Update sets&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=2582&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=2582&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Upgrades&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=2795&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=2795&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ATF&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=2936&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=2936&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Workflow&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=3055&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=3055&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Edge Encryption&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=3339&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=3339&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Summary&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/D_R6j4xmfiE?t=3420&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/D_R6j4xmfiE?t=3420&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;batched-update-sets&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/jakarta/#batched-update-sets&quot; class=&quot;heading-anchor&quot;&gt;Batched Update Sets&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Wow. Save time by batching update sets in the same scope. Bring up from dev, and apply the batch instead of applying each update set in order, one at a time.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/servicenow-platform/system-update-sets-rn.html&quot; rel=&quot;noopener&quot;&gt;Releas Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;service-portal-enhancements&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/jakarta/#service-portal-enhancements&quot; class=&quot;heading-anchor&quot;&gt;Service Portal enhancements&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/servicenow-platform/service-portal-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;user-criteria&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/jakarta/#user-criteria&quot; class=&quot;heading-anchor&quot;&gt;User Criteria&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Before Jakarta you could lock portals, pages, widgets, and widget instances with a role and not User Criteria. Now you can.&lt;/p&gt;&lt;h3 id=&quot;lists-widget-have-filter-builder&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/jakarta/#lists-widget-have-filter-builder&quot; class=&quot;heading-anchor&quot;&gt;Lists widget have filter builder&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Use the platform UI condition builder in the Data table from URL definition widget to create more complex table searches. The condition builder is disabled by default. Administrators can enable using the widget instance options for the Data table from URL definition widget.&lt;/p&gt;&lt;h3 id=&quot;contextual-search-sources-are-not-contextual&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/jakarta/#contextual-search-sources-are-not-contextual&quot; class=&quot;heading-anchor&quot;&gt;Contextual Search sources are not contextual&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Narrow search results to specific sources by configuring the contextual search sources in the instance options of a search widget.&lt;/p&gt;&lt;h3 id=&quot;a11y-work-wcag-level-aa&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/jakarta/#a11y-work-wcag-level-aa&quot; class=&quot;heading-anchor&quot;&gt;A11y work “WCAG level AA”&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Improvements to accessibility were made throughout the platform in congruence with WCAG 2.0 A standards. Improvements made specifically to Service Portal are listed here.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;High contrast theme: Changes the Service Portal ESM to be more accessible for users who have a hard time seeing low contrast colors.&lt;/li&gt;&lt;li&gt;Screen reader title: Use the Edit Container background option in the context menu for to add a title that screen readers read aloud.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/servicenow-platform/accessibility-rn.html&quot; rel=&quot;noopener&quot;&gt;Release&lt;br&gt;Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;embedded-help&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/jakarta/#embedded-help&quot; class=&quot;heading-anchor&quot;&gt;Embedded Help&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow® Embedded Help is a new application in the Jakarta release.&lt;/p&gt;&lt;p&gt;It includes the guided tour feature.&lt;/p&gt;&lt;p&gt;Embedded help and guided tours have been in the instance since the Helsinki release. In the Jakarta release, administrators can use the new Embedded Help application to create customized embedded help and develop guided tours.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/application-development/embedded-help-guided-tours-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;communities&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/jakarta/#communities&quot; class=&quot;heading-anchor&quot;&gt;Communities&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ServiceNow® Communities is a new application in the Jakarta release.&lt;/p&gt;&lt;p&gt;Communities provides a place for you to engage and interact with your organization.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;help solve issues faster&lt;/li&gt;&lt;li&gt;learn about best practices from others&lt;/li&gt;&lt;li&gt;engage with your organization for product feedback&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Use Communities to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;improve support call deflection because users help themselves via&lt;br&gt;crowd-sourced knowledge&lt;/li&gt;&lt;li&gt;communicate product updates&lt;/li&gt;&lt;li&gt;increase engagement with existing customers and lure prospects&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/jakarta-release-notes/page/release-notes/service-management/communities-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Istanbul</title>
      <link href="https://jace.pro/blog/istanbul/" />
      <updated>2017-10-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/istanbul/</id>
      <content type="html">
				&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Section&lt;/th&gt;&lt;th&gt;Link&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;GlideDate/Time API Updates&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=778&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=778&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Search Synonyms&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=866&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=866&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Condition Builder v2&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=967&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=967&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mobile&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=1301&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=1301&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Email API&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=1505&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=1505&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unsubscribe&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=1679&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=1679&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Email Layouts&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=1786&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=1786&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;API Analytics&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=1917&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=1917&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HTTP Message Logging&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=2027&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=2027&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ATF&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=2228&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=2228&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Studio/Source Control changes&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=2962&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=2962&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Debugger&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=3091&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=3091&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Summary&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/s2aRGT9WIRk?t=3726&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/s2aRGT9WIRk?t=3726&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;automated-testing-framework&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/istanbul/#automated-testing-framework&quot; class=&quot;heading-anchor&quot;&gt;Automated Testing Framework&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is the first small step to try to allow upgrades to happen&lt;br&gt;with less issues.&lt;/p&gt;&lt;p&gt;With the Automated Test Framework, you create and run automated tests on&lt;br&gt;your ServiceNow instance. When you upgrade or change an instance, run&lt;br&gt;these tests to confirm that the instance still works as designed.&lt;/p&gt;&lt;p&gt;Initially it could open a form, set field values, test values, and submit the form.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/istanbul-release-notes/page/release-notes/servicenow-platform/automated-test-framework-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;email-rest-api&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/istanbul/#email-rest-api&quot; class=&quot;heading-anchor&quot;&gt;Email REST API&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/istanbul-release-notes/page/release-notes/servicenow-platform/email-service-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;script-debugger&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/istanbul/#script-debugger&quot; class=&quot;heading-anchor&quot;&gt;Script Debugger&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Wow. The Script Debugger allows application developers to debug&lt;br&gt;server-side JavaScript. The Script Debugger allows each application&lt;br&gt;developer to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Have a dedicated debug transaction, which applies to the current session.&lt;/li&gt;&lt;li&gt;Set and remove breakpoints.&lt;/li&gt;&lt;li&gt;Pause the current session at a breakpoint.&lt;/li&gt;&lt;li&gt;Step through code line-by-line.&lt;/li&gt;&lt;li&gt;Step into and out of function and method calls.&lt;/li&gt;&lt;li&gt;View the value of local and global variables.&lt;/li&gt;&lt;li&gt;View the value of private variables from function closures.&lt;/li&gt;&lt;li&gt;View the call stack.&lt;/li&gt;&lt;li&gt;View the transaction the system is processing.&lt;/li&gt;&lt;li&gt;Turn off the script debugger to resume running paused scripts.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/istanbul-release-notes/page/release-notes/application-development/script-debugger-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;hr-service-management-scoped&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/istanbul/#hr-service-management-scoped&quot; class=&quot;heading-anchor&quot;&gt;HR Service Management (Scoped)&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Before Istanbul the HRSM was a “global” application. After Istanbul it&lt;br&gt;is now scoped. They are separate, but going forward the scoped&lt;br&gt;version has been getting all the attention.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/istanbul-release-notes/page/release-notes/service-management/human-resources-rn.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Geneva</title>
      <link href="https://jace.pro/blog/geneva/" />
      <updated>2017-10-17T00:00:00Z</updated>
      <id>https://jace.pro/blog/geneva/</id>
      <content type="html">
				&lt;p&gt;Video Review of this;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Section&lt;/th&gt;&lt;th&gt;Link&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Scripted REST Apis&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/B3K385rJ_mI&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/B3K385rJ_mI&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ServiceWatch&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/Qj0NjaEudnU&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/Qj0NjaEudnU&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Connect Chat&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/w9gi5pm6WjQ&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/w9gi5pm6WjQ&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Knowledge Updates&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://youtu.be/dbU9fiimcaU&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/dbU9fiimcaU&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;But here’s my list of notable features;&lt;/p&gt;&lt;h2 id=&quot;web-services-update&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/geneva/#web-services-update&quot; class=&quot;heading-anchor&quot;&gt;Web services update&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This got notable updates;&lt;/p&gt;&lt;h3 id=&quot;scripted-rest-apis&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/geneva/#scripted-rest-apis&quot; class=&quot;heading-anchor&quot;&gt;Scripted REST APIs&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Wow. This allows you to make endpoints return what you want without using processors.&lt;/p&gt;&lt;h3 id=&quot;attachment-rest-api&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/geneva/#attachment-rest-api&quot; class=&quot;heading-anchor&quot;&gt;Attachment REST API&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is a great api to reintroduce. Before you had to use the AttachmentCreator SOAP web service. The SOAP API has less limitations then this new REST API. You can’t create an attachment without a record to attach it to. You might think that’s trivial, until you try to do some catalog work via REST. This is a great api.&lt;/p&gt;&lt;h3 id=&quot;cors-support&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/geneva/#cors-support&quot; class=&quot;heading-anchor&quot;&gt;CORS support&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Allows customers to specify which REST APIs on their ServiceNow instance allow cross-domain AJAX requests from specified whitelisted domains.&lt;/p&gt;&lt;h2 id=&quot;service-watch-greater-servicemapping&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/geneva/#service-watch-greater-servicemapping&quot; class=&quot;heading-anchor&quot;&gt;Service Watch -&amp;gt; ServiceMapping&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Before this release Service Watch was a separate product requiring a stand alone product. After this release ServiceNow it re-branded as ServiceMapping and is now built into ServiceNow.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/geneva-release-notes/page/release-notes/it_operations_mgmt/r_ServiceMappingRN.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;security-operations&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/geneva/#security-operations&quot; class=&quot;heading-anchor&quot;&gt;Security Operations&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is a new line of business that ServiceNow can sell to clients for tracking vulnerability responses, configuration compliance, threat intelligence, and trusted security circles within ServiceNow.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/geneva-release-notes/page/release-notes/security_management/c_SecurityOpsManagementRN.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;edge-encryption&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/geneva/#edge-encryption&quot; class=&quot;heading-anchor&quot;&gt;Edge Encryption&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A separate line of business ServiceNow can sell to clients to allow the encryption of sensitive data on your company premises before sending it over the Internet to your ServiceNow instance (encrypted in flight)&lt;br&gt;where it remains encrypted at rest.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.servicenow.com/bundle/geneva-release-notes/page/release-notes/servicenow_platform/r_EdgeEncryptionRN.html&quot; rel=&quot;noopener&quot;&gt;Release Notes&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Set Duration and Business Duration</title>
      <link href="https://jace.pro/blog/set-duration-and-business-duration/" />
      <updated>2017-10-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/set-duration-and-business-duration/</id>
      <content type="html">
				&lt;p&gt;I had to add some code to set this for some reporting needs. This should be part of the offering ServiceNow provides.&lt;/p&gt;&lt;p&gt;Below is my business rule, and fix script to catch new records and fix&lt;br&gt;old records.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Business Rule&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Table: Task [task]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Active: true&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Advanced: true&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// When: Before&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Order 100000000&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Insert: true&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Update:true&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Condition:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// calendar_durationISEMPTY^&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// opened_atISNOTEMPTY^&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// closed_atISNOTEMPTY^&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// sys_class_name!=incident^&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// sys_class_name!=problem&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Script&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; opened &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opened_at&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; closed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;closed_at&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;calendar_duration &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;dateDiff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opened&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; closed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;business_duration &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;calDateDiff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opened&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; closed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here’s my fix script.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; log &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;calc. old durations&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; query &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
query &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;calendar_durationISEMPTY^&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
query &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;opened_atISNOTEMPTY^&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
query &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;closed_atISNOTEMPTY^&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
query &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sys_class_name!=incident^&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
query &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sys_class_name!=problem^&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; task &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;task&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;query&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  x&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;x: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; of &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRowCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; log&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; opened &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opened_at&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; closed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;closed_at&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;business_duration &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;calDateDiff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opened&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; closed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;calendar_duration &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;dateDiff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;opened&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; closed&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setWorkflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;autoSysFields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Service Portal - Ticket Assignments</title>
      <link href="https://jace.pro/blog/service-portal-ticket-assignments/" />
      <updated>2017-10-05T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-ticket-assignments/</id>
      <content type="html">
				&lt;p&gt;I created a ticket assignments and wanted to share that code. Should&lt;br&gt;work on any instance unless you have a business rule blocking the&lt;br&gt;update.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/-1hMVkY6er-284.webp 284w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/-1hMVkY6er-284.jpeg&quot; alt width=&quot;284&quot; height=&quot;189&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;client-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-ticket-assignments/#client-script&quot; class=&quot;heading-anchor&quot;&gt;Client Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* widget controller */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;server-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-ticket-assignments/#server-script&quot; class=&quot;heading-anchor&quot;&gt;Server Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* populate the &#39;data&#39; object */&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* e.g., data.table = $sp.getValue(&#39;table&#39;); */&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;canRead &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;canRead&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTableName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;canRead &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTableName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sc_req_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_task &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sc_task &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_task&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;request_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;true&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;orderByDesc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_created_on&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_task_query &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; label &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; assignment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;assignment_group &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      assignment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;assignment_group&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      assignment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;assigned_to&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;number&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;assignment&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; assignment&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;link&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;?id=ticket&amp;amp;table=sc_task&amp;amp;sys_id=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;html&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-ticket-assignments/#html&quot; class=&quot;heading-anchor&quot;&gt;HTML&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!--Template--&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;panel b&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&quot;token attr-name&quot;&gt;ng-if&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;data.canRead &amp;amp;&amp;amp; data.sc_task.length &amp;gt; 0 &amp;amp;&amp;amp; data.table == &#39;sc_req_item&#39;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;panel-heading bg-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-if&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Task Assignments&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;panel-body&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;table&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;thead&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Assignment&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Task&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;thead&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;tbody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-repeat&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;task in data.sc_task&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;tbody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;table&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Service Portal - Modify Watch List</title>
      <link href="https://jace.pro/blog/service-portal-modify-watch-list/" />
      <updated>2017-10-04T00:00:00Z</updated>
      <id>https://jace.pro/blog/service-portal-modify-watch-list/</id>
      <content type="html">
				&lt;p&gt;I created a widget and wanted to share that code. Should work on any&lt;br&gt;instance unless you have a business rule blocking the update.&lt;/p&gt;&lt;h2 id=&quot;client-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-modify-watch-list/#client-script&quot; class=&quot;heading-anchor&quot;&gt;Client Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;$scope&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; spUtil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;watch_list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;displayValue&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;watch_list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;displayValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;watch_list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;watch_list&#39;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;updateRecord&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;watch_list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $scope&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;watch_list&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    c&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;server-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-modify-watch-list/#server-script&quot; class=&quot;heading-anchor&quot;&gt;Server Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;watch_list&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ticket &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ticket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      ticket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;watch_list&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;watch_list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      ticket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; $sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; $sp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; gr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;canRead &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;watch_list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;canRead&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;canWrite &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;watch_list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;canWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;canRead&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; table&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;watch_list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;displayValue&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;watch_list&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; gr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;watch_list&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;//missing url params&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;html&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/service-portal-modify-watch-list/#html&quot; class=&quot;heading-anchor&quot;&gt;HTML&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ng-if&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;data.canRead&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;panel panel-primary b&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;panel-heading&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h4&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;panel-title pull-left&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      ${Watch list}
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;clearfix&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;panel-body&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-center text-italic text-muted&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;watch_list_div&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;sn-record-picker&lt;/span&gt; 
        &lt;span class=&quot;token attr-name&quot;&gt;ng-blur&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;updateRecord()&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;watch_list&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;sn-disabled&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;!data.canWrite&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;sys_user&#39;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;display-field&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;name&#39;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;search-fields&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;name&#39;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;value-field&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;sys_id&#39;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;default-query&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;active=true^name!=NULL&#39;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;multiple&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;sn-record-picker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; 
        &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;ng-click&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;updateRecord()&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;ng-if&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;data.canWrite&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;btn btn-default ng-scope&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
        Update Watch List
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Undocumented Scripts</title>
      <link href="https://jace.pro/blog/undocumented-scripts/" />
      <updated>2017-10-01T00:00:00Z</updated>
      <id>https://jace.pro/blog/undocumented-scripts/</id>
      <content type="html">
				&lt;p&gt;This page is to document scripts that are undocumented in ServiceNow.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Server-Side APIs (gathered using&lt;br&gt;&lt;a href=&quot;https://developer.servicenow.com/connect.do#!/share/contents/9650888_xplore_developer_toolkit?v=4.9&amp;amp;t=PRODUCT_DETAILS&quot; rel=&quot;noopener&quot;&gt;Xplore&lt;/a&gt;&lt;br&gt;manually and via posts on community)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Glide&lt;/p&gt;&lt;ul&gt;&lt;li&gt;get()&lt;/li&gt;&lt;li&gt;checkInitiated()&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideAbstractBucketCollector – Expects Object&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideSysAttachmentInputStream&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideChecksum&lt;/p&gt;&lt;ul&gt;&lt;li&gt;calculateMD5CheckSum.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideSecurityManager&lt;/p&gt;&lt;ul&gt;&lt;li&gt;setUser&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideTableCreator&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/thread/247897&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/thread/247897&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/thread/248771&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/thread/248771&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideappCatalogItem&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideappQuestion –&amp;nbsp;&lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0596785&quot; rel=&quot;noopener&quot;&gt;Memory Leak issues&lt;br&gt;(PRB697208)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideappVariablePoolQuestionSet&lt;/p&gt;&lt;ul&gt;&lt;li&gt;generally used to print out variables and answers in email. I recommend: /printing-out-variables/&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/thread/284468&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/thread/284468&lt;/a&gt;&amp;nbsp;– not working in scoped application&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/thread/221479&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/thread/221479&lt;/a&gt;&amp;nbsp;– controlling what variables show up&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideZipOutputStream aka Packages.java.util.zip.ZipOutputStream&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideZipEntry aka Packages.java.util.zip.ZipEntry&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideRecord.applyEncodedQuery – found in activity definitions&lt;/p&gt;&lt;ul&gt;&lt;li&gt;This applies an encoded query to a record and sets it’s values.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;task.wf_activity&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Note: the wf_activity field is disabled in the dictionary, so is not visible in the form or list views. But it’s still valid to use in a script.&lt;/li&gt;&lt;li&gt;Clearing this out on tasks when “restarting” workflow will reuse tasks, if you clear this out, it will make new.&lt;/li&gt;&lt;li&gt;I had a ask where a customer wanted a “Revert to New” UI Action inside a Change record but wanted to keep the history of Closed Incomplete Change Tasks to show that a change failed and had to be restarted&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Every time I’d restart the workflow it would re-use the last made change tasks and overwrite information that we wanted to keep for history’s sake. – Lee Hollister&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideTemplate&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideTemplate.get&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;GlideMutex&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/message/953897&quot; rel=&quot;noopener&quot;&gt;https://community.servicenow.com/message/953897&lt;/a&gt;&lt;/li&gt;&lt;li&gt;exclusiveWithSpin&lt;/li&gt;&lt;li&gt;get()&lt;/li&gt;&lt;li&gt;getExclusiveWithSpin()&lt;/li&gt;&lt;li&gt;getNonExclusive()&lt;/li&gt;&lt;li&gt;getWithSpin()&lt;/li&gt;&lt;li&gt;invalidate()&lt;/li&gt;&lt;li&gt;nonExclusive&lt;/li&gt;&lt;li&gt;withSpin&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Client-Side APIs&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://hi.service-now.com/scripts/classes/doctype/NotificationMessage.js&quot; rel=&quot;noopener&quot;&gt;UINotification aka NotificationMessage&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://hi.service-now.com/scripts/consts/GlideEvent.js&quot; rel=&quot;noopener&quot;&gt;Event&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://hi.service-now.com/scripts/sn/common/util/service.dateUtils.js&quot; rel=&quot;noopener&quot;&gt;service.dateUtils.js&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;getDateFromFormat&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://hi.service-now.com/scripts/doctype/GlideForm14.js&quot; rel=&quot;noopener&quot;&gt;g_form (desktop)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://hi.service-now.com/scripts/scoped_object_generators.js&quot; rel=&quot;noopener&quot;&gt;g_form (mobile/service portal)&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;setVariablesReadOnly&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Client-Side Properties&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://hi.service-now.com/scripts/calendar.js&quot; rel=&quot;noopener&quot;&gt;calendar.js&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;g_user_date_format&lt;/li&gt;&lt;li&gt;g_user_date_time_format&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;REST APIS&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Search Endpoint:&lt;br&gt;&lt;code&gt;/now/globalsearch/search?sysparm_search=TERMGOESHERE&amp;amp;sysparm_groups=SYSIDOFSEARCHGROUP&lt;/code&gt;&lt;br&gt;Header:&amp;nbsp;&lt;code&gt;header: application/json&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Inspiration/Resources;&amp;nbsp;&lt;a href=&quot;https://snprotips.com/undocumented-servicenow-apis/&quot; rel=&quot;noopener&quot;&gt;Undocumented Scripts by SN Pro Tips&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Logtail a node in ServiceNow</title>
      <link href="https://jace.pro/blog/logtail-a-node-in-servicenow/" />
      <updated>2017-09-26T00:00:00Z</updated>
      <id>https://jace.pro/blog/logtail-a-node-in-servicenow/</id>
      <content type="html">
				&lt;p&gt;Point your browser to &lt;code&gt;/channel.do?sysparm_channel=logtail&lt;/code&gt;&lt;/p&gt;&lt;p&gt;What does this load?&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/NWfoFDNE0B-650.webp 650w, https://jace.pro/img/NWfoFDNE0B-960.webp 960w, https://jace.pro/img/NWfoFDNE0B-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/NWfoFDNE0B-650.jpeg&quot; alt=&quot;Screenshot of logtail.do in ServiceNow&quot; title=&quot;Screenshot of logtail.do in ServiceNow&quot; width=&quot;1400&quot; height=&quot;443&quot; srcset=&quot;https://jace.pro/img/NWfoFDNE0B-650.jpeg 650w, https://jace.pro/img/NWfoFDNE0B-960.jpeg 960w, https://jace.pro/img/NWfoFDNE0B-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Screenshot of logtail.do in ServiceNow&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;This was posted on (now defunct) &lt;a href=&quot;http://servicenowgems.com&quot; rel=&quot;noopener&quot;&gt;servicenowgems.com&lt;/a&gt; but I have to cover it too.&lt;/p&gt;&lt;p&gt;I was wondering how this worked. This is a logtail for the logs in ServiceNow in the system on the UI page&lt;br&gt;&lt;code&gt;channel.do?sysparm_channel=logtail&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;This is called via the UI page &lt;a href=&quot;http://channel.do&quot; rel=&quot;noopener&quot;&gt;channel.do&lt;/a&gt; which make a GlideAjax request to ChannelAjax.&lt;br&gt;I tried to find all the parts that make this work, and I was able to create a new channel, but I was unable to direct any logs to it.&lt;br&gt;Below are all the exposed files I could find that made this work. This points to &lt;code&gt;channel_stream.do&lt;/code&gt; and &lt;code&gt;threads.do&lt;/code&gt; which are both black boxed.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Client Script - Validating Phone</title>
      <link href="https://jace.pro/blog/client-script-validating-phone/" />
      <updated>2017-09-26T00:00:00Z</updated>
      <id>https://jace.pro/blog/client-script-validating-phone/</id>
      <content type="html">
				&lt;p&gt;I’ve found two real ways to verify the data meets the needs you have.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Client script to do entire validation&lt;/li&gt;&lt;li&gt;Client script to ask server if data is valid&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This will use all client-side validation. I set up a config variable&lt;br&gt;where you need to;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Specify the field to check&lt;/li&gt;&lt;li&gt;Specify how long you need the number to be without non-digits&lt;/li&gt;&lt;li&gt;Specify the error that will appear&lt;/li&gt;&lt;li&gt;Specify how the number should be broken up&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;control&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isLoading&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; config &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;phone&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;required_length&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Invalid telephone number.  Please enter your telephone number including area code.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;sections&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;one&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;two&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;three&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// no need to change the below&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isLoading &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; newValue &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;error_flag &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hideFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; regexGoodForm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RegExp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;^&#92;&#92;([&#92;&#92;d]{&quot;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sections&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;one
      &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;}&#92;&#92;)&#92;&#92;s[&#92;&#92;d]{&quot;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sections&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;two
      &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;}&#92;&#92;-[&#92;&#92;d]{&quot;&lt;/span&gt;
      &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sections&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;three
      &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;}$&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;g&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; isGoodForm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; regexGoodForm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//if value does not match (n1) n2-n3 format&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;isGoodForm&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; regexNonDigits &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;[^&#92;d]&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// remove all non number from string&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; userPhone &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;regexNonDigits&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// verify if number is x digits&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; regexXDigits &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RegExp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;[^d]&#92;{&quot;&lt;/span&gt;
                            &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;required_length
                            &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;g&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; isXDigits &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; regexXDigits&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;userPhone&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isXDigits&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;// if true, reformat to (n1) n2-n3&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; onePlusTwo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sections&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;two &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sections&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;one&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; onePlusTwoPlusThree &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sections&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;three &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; onePlusTwo&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; newNum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            newNum &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;(&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; userPhone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sections&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;one&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;) &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            newNum &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; userPhone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sections&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;one&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; onePlusTwo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;-&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            newNum &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; userPhone&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;onePlusTwo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; onePlusTwoPlusThree&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newNum&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;// if true not, trigger error&lt;/span&gt;
            config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;error_flag &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;error_flag&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;error&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Client Script - Validating emails</title>
      <link href="https://jace.pro/blog/client-script-validating-emails/" />
      <updated>2017-09-26T00:00:00Z</updated>
      <id>https://jace.pro/blog/client-script-validating-emails/</id>
      <content type="html">
				&lt;p&gt;I suggest you don’t use it as you can’t ensure the data.&lt;/p&gt;&lt;p&gt;I found two real ways to verify the data meets the needs you have.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Client script to do entire validation&lt;/li&gt;&lt;li&gt;Client script to ask server if data is valid&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This will use all client-side validation.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Name: Email Validator&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Type: onSubmit&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// UI Type: All&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onSubmit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; field &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;email&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hideFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isEmailValid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isEmailValid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; problemMsg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isEmailValidWithReason&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;problemMsg &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//jslog(&quot;isEmailValid: &quot; + problemMsg);&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; problemMsg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;error&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isEmailValidWithReason&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; localPartChars &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%*/?|^{}`~&amp;amp;&#39;+-=_.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        domainChars &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;missing @ sign&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; s &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;@&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;one at signs allowed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;containsOnlyChars&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;localPartChars&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;invalid character before the at sign&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;at least one character must be before the at sign&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;period cannot be the first character&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;period cannot be the last character before the at sign&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;containsOnlyChars&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;domainChars&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;invalid character after the at sign&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; periodIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;periodIndex &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;missing period after the at sign&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;periodIndex &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;period cannot be the first character after the at sign&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; periods &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; s&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lastPeriod &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; periods&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;periods&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lastPeriod&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;must be at least 1 character after the last period&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isAlphaNum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;the first character after the at sign must be alphanumeric&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isAlphaNum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;the last character must be alphanumeric&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isAlpha&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;thchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;thchar &lt;span class=&quot;token operator&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;a&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; thchar &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;z&#92;uffff&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;thchar &lt;span class=&quot;token operator&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;A&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; thchar &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Z&#92;uffff&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; thchar &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;_&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isAlphaNum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;thchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isAlpha&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;thchar&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isDigit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;thchar&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isDigit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;thchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;thchar &lt;span class=&quot;token operator&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;0&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; thchar &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;9&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;containsOnlyChars&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;validChars&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;sText&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; sText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sText&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;charAt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;validChars&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Useful Client Scripts</title>
      <link href="https://jace.pro/blog/useful-client-scripts/" />
      <updated>2017-09-26T00:00:00Z</updated>
      <id>https://jace.pro/blog/useful-client-scripts/</id>
      <content type="html">
				&lt;p&gt;These are my useful catalog client scripts, I’ve found/written over the&lt;br&gt;years. Please note the comments aren’t&lt;br&gt;the best and I do mean to improve them. Some of these functions aren’t&lt;br&gt;documented and won’t work in all places.&lt;/p&gt;&lt;h2 id=&quot;run-code-on-order-guides-in-and-out-of-the-portal&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#run-code-on-order-guides-in-and-out-of-the-portal&quot; class=&quot;heading-anchor&quot;&gt;Run code on order guides in and out of the portal&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onLoad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/**
  * So here is the case, I have a variable set being used in an order guide and catalog item.
  * I want to hide the set on the catalog item and make it visible on the form if the user
  * submits the order via order guide. If the user directly submits the catalog item then they
  * should not see the variable set on the form.
  */&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;//if on standard UI hide form&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; guide &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sysparm_guide&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//if on a guide, and the standard ui this will not eq null&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;guide&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setDisplay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;create_for_user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setDisplay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;create_for_user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//if on sp, $(&quot;&quot;) will fail&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sp_guide &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; g_service_catalog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isOrderGuide&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sp_guide&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setDisplay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;create_for_user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setDisplay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;create_for_user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;date-is-after-today&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#date-is-after-today&quot; class=&quot;heading-anchor&quot;&gt;Date is after today&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Date is after today&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//GwtDate not available on service portal&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onSubmit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Type appropriate comment here, and begin script below&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//ensure that the start date is before the today&#39;s date&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; field &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;start_date&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; st &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; newTime &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GwtDate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;st&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tm &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GwtDate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    tm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    tm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;subtractHours&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newTime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;compare&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tm&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hideFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Start date must be after the today&#92;&#39;s date.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;error&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;ensure-date-is-after-a-set-time&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#ensure-date-is-after-a-set-time&quot; class=&quot;heading-anchor&quot;&gt;Ensure Date is after a set time&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Ensure Date is after set time&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onSubmit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; returnVal &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Type appropriate comment here, and begin script below&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Ensure that the given field&#39;s date is at least or equal to the milleseconds to add.&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; field &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;project_deadline&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; msToAdd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//ms * sec * minutes * hours * days//this is a week&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; errorMsg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;This must be at least a week out.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/****************************************************/&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/*  You shouldn&#39;t have to change anything below     */&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/****************************************************/&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; now &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; givenDate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//forwhatever reason, at this point this returns 9/24 when you select 9/25&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//givenauthor: &#39;jace&#39;&lt;/span&gt;
&lt;span class=&quot;token literal-property property&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;Mon Sep &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2017&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;00&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;GMT&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0500&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Central Daylight Time&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1506347252815&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//when you select 9/25&lt;/span&gt;
    givenDate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setDate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;projectDeadline&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//so add a day&lt;/span&gt;
    givenDate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setHours&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;now&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHours&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    givenDate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setMinutes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;now&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMinutes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    givenDate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setSeconds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;now&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getSeconds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    givenDate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setMilliseconds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;now&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getMilliseconds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//now returns;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//givenauthor: &#39;jace&#39;&lt;/span&gt;
&lt;span class=&quot;token literal-property property&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;Mon Sep &lt;span class=&quot;token number&quot;&gt;25&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2017&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;08&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;47&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;GMT&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0500&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Central Daylight Time&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1506347252815&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; nextWeek &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        nextWeek&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nextWeek&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; msToAdd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//console.log(&#39;projectDeadline: &#39; + projectDeadline + &#39;[&#39; + projectDeadline.getTime() + &#39;]&#39;);&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//console.log(&#39;weekAhead     : &#39; + weekAhead      + &#39;[&#39; + weekAhead.getTime()      + &#39;]&#39;);&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; givenDateGreaterOrEqualToNextWeek &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; givenDate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;gt;=&lt;/span&gt; nextWeek&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//console.log(&#39;givenDateGreaterOrEqualToNextWeek: &#39; + givenDateGreaterOrEqualToNextWeek);&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;givenDateGreaterOrEqualToNextWeek&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          returnVal &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hideFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; errorMsg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;error&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; returnVal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;verify-date-is-after-a-variable&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#verify-date-is-after-a-variable&quot; class=&quot;heading-anchor&quot;&gt;Verify Date is after a variable&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Verify Date is after variable&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onSubmit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Verify that the start date is before the end date&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; st &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getDateFromFormat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;start_date_time&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_user_date_time_format&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; et &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getDateFromFormat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;end_date_time&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_user_date_time_format&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;st &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; et&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hideAllFieldMsgs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Estimated end date must be after the start date.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showErrorBox&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;resource_est_end_date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Estimated end date must be after the start date.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;require-checkboxes&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#require-checkboxes&quot; class=&quot;heading-anchor&quot;&gt;Require Checkboxes&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//require checkboxes&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onSubmit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Set the mandatory checkbox variable names and total mandatory count here&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; mandatoryVars &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;option1,option2,option3,option4&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; mandatoryCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; passed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;forceMandatoryCheckboxes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mandatoryVars&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mandatoryCount&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;passed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//Abort the submit&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;You must select at least &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; mandatoryCount &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39; options.&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;forceMandatoryCheckboxes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;mandatory&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; count&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Split the mandatory variable names into an array&lt;/span&gt;
    mandatory &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mandatory&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;,&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; answer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; varFound &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; numTrue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Check each variable in the array&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; mandatory&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; x&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Check to see if variable exists&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getControl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mandatory&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            varFound &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Check to see if variable is set to &#39;true&#39;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mandatory&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;true&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                numTrue&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Exit the loop if we have reached required number of &#39;true&#39;&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;numTrue &lt;span class=&quot;token operator&quot;&gt;&amp;gt;=&lt;/span&gt; count&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    answer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                    &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//If we didn&#39;t find any of the variables allow the submit&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;varFound &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        answer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Return true or false&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;show-field-if-x-are-checked&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#show-field-if-x-are-checked&quot; class=&quot;heading-anchor&quot;&gt;Show field if x are checked&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//show field if x are chekced&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*
 * Origin;
 * https://community.servicenow.com/message/1025641
*/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;control&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isLoading&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Set the mandatory checkbox variable names and total mandatory count here&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; mandatoryVars &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;option1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;option2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;option3&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;option4&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;option5&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; variableToShow &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;someothervariable&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; requiredCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; actualCount &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; mandatoryVars&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; x&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mandatoryVars&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;true&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            actualCount&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;requiredCount &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; actualCount&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setDisplay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;variableToShow&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setDisplay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;variableToShow&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;require-numbers&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#require-numbers&quot; class=&quot;heading-anchor&quot;&gt;Require numbers&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Require numbers&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;control&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isLoading&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isTemplate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isLoading &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; newValue &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; regexp &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;^[0-9]*$&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hideFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;control&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;regexp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;control&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;That is not a number&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;error&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        control&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;set-placeholder&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#set-placeholder&quot; class=&quot;heading-anchor&quot;&gt;Set Placeholder&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This is unnecessary after Jakarta&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//set place holder&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//this is unnecessary in Jakarta see https://servicenow.implementation.blog/great-ui-trick-html-placeholders/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onLoad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;u_addPlaceholderAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Someones name goes here&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;u_addPlaceholderAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;variableName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; hint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; fieldName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getControl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;variableName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Browser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;IE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            fieldName&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;placeholder &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hint&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fieldName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;writeAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;placeholder&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; hint&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;make-variables-readonly&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#make-variables-readonly&quot; class=&quot;heading-anchor&quot;&gt;Make variables ReadOnly&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//make variables readonly&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onLoad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//Get the &#39;Variables&#39; section&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ve &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;variable_map&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;up&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//Disable all elements within with a class of &#39;cat_item_option&#39;&lt;/span&gt;
        ve&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.cat_item_option&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.slushselectmtm&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.questionsetreference&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;elmt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            elmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;disabled &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//Remove any reference or calendar icons&lt;/span&gt;
        ve&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;img[src*=reference_list.gifx]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;img[src*=small_calendar.gifx]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hide&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//Hide list collector icons&lt;/span&gt;
        ve&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;img[src*=arrow]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;up&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hide&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;flash-variable&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#flash-variable&quot; class=&quot;heading-anchor&quot;&gt;Flash variable&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//flash variable&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;flashVar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nameMap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;rec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rec&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prettyName &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; v&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;flash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ni.VE&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; rec&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;realName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#FFFACD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;flashVar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;server_decom_prepinfo&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;require-attachment&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#require-attachment&quot; class=&quot;heading-anchor&quot;&gt;Require Attachment&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//require attachment&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onSubmit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&#39;use strict&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; attachment &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sys_attachment&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    attachment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;table_name&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sc_cart_item&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    attachment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;table_sys_id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;gel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_item_guid&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    attachment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;attachment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hasNext&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;You must attach your public SSH Key. Please see instructions for more information.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;set-server-fields&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#set-server-fields&quot; class=&quot;heading-anchor&quot;&gt;Set Server fields&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//ser server fields&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;control&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isLoading&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;server_ip&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;environment&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getReference&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;server&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;server_ip&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ip_address&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;environment&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; server&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;u_env_list&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;set-date-or-date-time-locally-to-users-format&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/useful-client-scripts/#set-date-or-date-time-locally-to-users-format&quot; class=&quot;heading-anchor&quot;&gt;Set Date or Date Time locally to user’s format&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//This is not documented, but here ya go;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;control&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isLoading&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isTemplate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isLoading &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; newValue &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; today &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;date_raised_with_vendor&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;formatDate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;today&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_user_date_format&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;date_time_raised_with_vendor&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;formatDate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;today&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_user_date_time_format&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Where is &#39;formatDate&#39; defined? &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Well, let me show you;  &lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// This is available on UI16, and may need to be ported over but until then it&#39;s loaded from `calendar.js`&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// https://hi.service-now.com/scripts/calendar.js&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Working from home (WFH)</title>
      <link href="https://jace.pro/blog/working-from-home-wfh/" />
      <updated>2017-09-22T00:00:00Z</updated>
      <id>https://jace.pro/blog/working-from-home-wfh/</id>
      <content type="html">
				&lt;p&gt;I think&amp;nbsp;&lt;a href=&quot;http://theoatmeal.com/&quot; rel=&quot;noopener&quot;&gt;theoatmeal.com&lt;/a&gt;’s&amp;nbsp;&lt;a href=&quot;http://theoatmeal.com/comics/working_home&quot; rel=&quot;noopener&quot;&gt;Why working from home is both awesome and HORRIBLE&lt;/a&gt;&amp;nbsp;sum’s up a lot of the social considerations to keep in mind. I’ll breakdown my opinion of these thoughts and how to combat them below.&lt;/p&gt;&lt;h2 id=&quot;degradation-of-social-skills&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/working-from-home-wfh/#degradation-of-social-skills&quot; class=&quot;heading-anchor&quot;&gt;Degradation of social skills&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Work from co-working spaces.&lt;/li&gt;&lt;li&gt;Be an extrovert on evenings and weekends (e.g.&amp;nbsp;go to Meetups or&lt;br&gt;other social gatherings.)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;distractions&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/working-from-home-wfh/#distractions&quot; class=&quot;heading-anchor&quot;&gt;Distractions&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Close Reddit/Facebook/Twitch/etc.&lt;/li&gt;&lt;li&gt;Don’t play games.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;stress-on-relationships&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/working-from-home-wfh/#stress-on-relationships&quot; class=&quot;heading-anchor&quot;&gt;Stress on relationships&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Have a honest conversation about this with your significant other to&lt;br&gt;clear this up. If they don’t get it, go to a co-working space on&lt;br&gt;days they’ll be home, or send them away.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Working from home can sometimes give the impression you have time to&lt;br&gt;do errands you shouldn’t do;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;fold laundry&lt;/li&gt;&lt;li&gt;rotate laundry&lt;/li&gt;&lt;li&gt;do dishes&lt;/li&gt;&lt;li&gt;clean the floors&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;loss-of-regimen&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/working-from-home-wfh/#loss-of-regimen&quot; class=&quot;heading-anchor&quot;&gt;Loss of regimen&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;It’s crucial to have a set of hours you’re working and then stick to&lt;br&gt;it.&lt;/li&gt;&lt;li&gt;This tells you when you need to get up and when you need to get out.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;lack-of-employee-banter&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/working-from-home-wfh/#lack-of-employee-banter&quot; class=&quot;heading-anchor&quot;&gt;Lack of employee banter&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Physical interactions with people.&lt;/li&gt;&lt;li&gt;They don’t have to be co-workers, but anyone.&lt;/li&gt;&lt;li&gt;Go to a co-working space.&lt;/li&gt;&lt;li&gt;Your cat/dog cannot provide this.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;stay-active&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/working-from-home-wfh/#stay-active&quot; class=&quot;heading-anchor&quot;&gt;Stay active&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Go for a walk on break, get away from your office when you do.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;dont-skimp-on-equipment&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/working-from-home-wfh/#dont-skimp-on-equipment&quot; class=&quot;heading-anchor&quot;&gt;Don’t skimp on equipment&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;I’d suggest having;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Computer Chair (you’ll be logging hundreds, if not thousands of&lt;br&gt;hours in this thing, get one that’s comfortable)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/Plantronics-Voyager-Focus-B825-Headset/dp/B013F4LJTI&quot; rel=&quot;noopener&quot;&gt;Active Noise Cancelling headset&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Webcam (sometimes you need to see someone’s face, sometimes&lt;br&gt;someone needs to see yours)&lt;/li&gt;&lt;li&gt;Mouse and Keyboard (again you’ll be spending a lot of time with&lt;br&gt;these devices, make sure they are great for yourself to use)&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Notification Troubleshooting</title>
      <link href="https://jace.pro/blog/notification-troubleshooting/" />
      <updated>2017-09-19T00:00:00Z</updated>
      <id>https://jace.pro/blog/notification-troubleshooting/</id>
      <content type="html">
				&lt;p&gt;Check these steps.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;On the notification, verify the notification table is correct.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the notification, verify the conditions are met. &lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0528655&quot; rel=&quot;noopener&quot;&gt;KB0528655&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the notification, verify the “Send to event creator” is correct. This doesn’t care how the event creator is included if scripted, parm1 or 2 it will include if checked and exclude if unchecked.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the notification, verify the “Send To” or “Send to Event Parm1”&lt;br&gt;or “Send to Event Parm2”.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the notification, verify there is something in the Body of the&lt;br&gt;notification.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the notification, verify the weight is set. If it’s not zero, check the skipped folder.&amp;nbsp;&lt;a href=&quot;https://jace.pro/post/2017-09-18-notification-troubleshooting/#weight&quot; rel=&quot;noopener&quot;&gt;Weight&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the target record, verify the “Send To” or “Send to Event Parm1”&lt;br&gt;or “Send to Event Parm2” evaluates to an actual email or user or group&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the user, verify they are not locked out. &lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0528699&quot; rel=&quot;noopener&quot;&gt;KB0528699&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the user, verify they have an email, and it’s properly formed. &lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0528671&quot; rel=&quot;noopener&quot;&gt;KB0528671&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the user, verify they have an email account, is active, has no notification issues&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the user’s notification devices (&lt;code&gt;cmn_notif_device_list.do&lt;/code&gt;), verify the user has a “Primary Email” device and it correct. &lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0528667&quot; rel=&quot;noopener&quot;&gt;KB0528667&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the user’s notification subscriptions, verify they haven’t disabled this notification. &lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0516987&quot; rel=&quot;noopener&quot;&gt;KB0516987&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If event generated&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Verify the event exists on &lt;code&gt;sysevent_list.do?sysparm_query=sys_id=-1&lt;/code&gt;. &lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0523579&quot; rel=&quot;noopener&quot;&gt;KB0523579&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Check the Event record table is table is correct.&lt;/li&gt;&lt;li&gt;Verify the Events Process job is running &lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0523580&quot; rel=&quot;noopener&quot;&gt;KB0523580&lt;/a&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=gYVwq8pH0-A&quot; rel=&quot;noopener&quot;&gt;Youtube&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ensure any mail is working&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ensure the system is not sending to the debug user.&amp;nbsp;&lt;a href=&quot;https://docs.servicenow.com/bundle/helsinki-servicenow-platform/page/administer/reference-pages/reference/r_OutboundMailConfiguration.html&quot; rel=&quot;noopener&quot;&gt;Outbound Mail Configuration&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ensure the system is enabled to send email &lt;a href=&quot;https://hi.service-now.com/kb_view.do?sysparm_article=KB0524529&quot; rel=&quot;noopener&quot;&gt;KB0524529&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Thanks Andrew Barnes and some other random person from&amp;nbsp;&lt;a href=&quot;http://sndevs.slack.com/&quot; rel=&quot;noopener&quot;&gt;sndevs.slack.com&lt;/a&gt; for the inspiration to make this post.&lt;/p&gt;&lt;h2 id=&quot;weight&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/notification-troubleshooting/#weight&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://jace.pro/post/2017-09-18-notification-troubleshooting/#weight&quot; rel=&quot;noopener&quot;&gt;Weight&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;Set a numerical value for the notification priority relative to other notifications with the same target table and recipients. The system only sends the notification with the highest weight. All other notifications are moved from the Outbox to the Skipped mailbox. The default value 0 causes the system to always send the notification&lt;br&gt;(assuming the conditions are met).&lt;/p&gt;&lt;p&gt;For example, suppose that a service desk agent adds a comment to an incident and shortly thereafter closes it. By default, these actions trigger both the Incident commented and Incident Closed notifications.&lt;/p&gt;&lt;p&gt;However, both notifications are from the Incident table and also notify the incident caller. The system only sends the notification with the highest weight, which in this case is the Incident Closed&lt;br&gt;notification.&lt;/p&gt;&lt;p&gt;Determine whether any of the troubleshooting steps below are true for your environment. Each step provides a link to an article that will help you eliminate possible causes and take corrective action as&lt;br&gt;necessary.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is from the &lt;a href=&quot;https://docs.servicenow.com/bundle/helsinki-servicenow-platform/page/administer/notification/task/t_CreateANotification.html&quot; rel=&quot;noopener&quot;&gt;docs&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Search for specific code and sys ids in code and workflow activities</title>
      <link href="https://jace.pro/blog/search-for-specific-code-and-sys-ids-in-code-and-workflow-activities/" />
      <updated>2017-09-16T00:00:00Z</updated>
      <id>https://jace.pro/blog/search-for-specific-code-and-sys-ids-in-code-and-workflow-activities/</id>
      <content type="html">
				&lt;p&gt;Searching for code is crucial to understand how something works. As such&lt;br&gt;here a four ways to do it&lt;/p&gt;&lt;ul&gt;&lt;li&gt;SNC Guru’s “&lt;a href=&quot;https://www.servicenowguru.com/system-definition/find-references-specific-record/&quot; rel=&quot;noopener&quot;&gt;Find All System References to a Specific Record&lt;/a&gt;”&lt;/li&gt;&lt;li&gt;SN Pro Tip’s, “&lt;a href=&quot;https://snprotips.com/blog/sncprotips/2015/12/locate-any-record-in-any-table-by-sysidhtml&quot; rel=&quot;noopener&quot;&gt;Locate any record in any table by sysid&lt;/a&gt;”&lt;/li&gt;&lt;li&gt;GarretNow’s “&lt;a href=&quot;https://garrettnow.com/2014/08/12/developer-search/&quot; rel=&quot;noopener&quot;&gt;Developer Search&lt;/a&gt;”&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://community.servicenow.com/community/develop/blog/2017/01/15/where-did-i-write-that-piece-of-code&quot; rel=&quot;noopener&quot;&gt;Servicenow’s Studio’s Code Search&lt;/a&gt;&amp;nbsp;as described by Goran Lundqvist&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;One thing none of these do is find Workflow Activities using that value.&lt;/p&gt;&lt;p&gt;Navigating to your &lt;code&gt;/sys_variable_value_list.do?sysparm_query=valueLIKEa033355d95364600ab0db5e2bc674c27&lt;/code&gt; will search workflow activities for workflow “variables” containing that sys_id, but you may set have to set your query with the display value, you may have a to do some extra or statements in there to find those. Something to keep in mind, this table has no idea what workflow activities are on “published” workflows, so that is frustrating but it will at least give you a direction of what activities need updating and you can see what workflows those are associated to.&lt;/p&gt;&lt;p&gt;Thanks Michael Domke for sharing this. I’ve referenced your&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/thread/157997&quot; rel=&quot;noopener&quot;&gt;post on the community&lt;/a&gt; a lot.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Two Step Unsubscribe</title>
      <link href="https://jace.pro/blog/two-step-unsubscribe/" />
      <updated>2017-09-14T00:00:00Z</updated>
      <id>https://jace.pro/blog/two-step-unsubscribe/</id>
      <content type="html">
				&lt;p&gt;A stakeholder asked to have users verify they actually want to unsubscribe from an email instead of assuming they want to unsubscribe. To do this I made a simple UI Page. Below is the code&lt;/p&gt;&lt;p&gt;Below is the mail script and ui page. They work together.&lt;/p&gt;&lt;h2 id=&quot;callable-mail-script-code&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/two-step-unsubscribe/#callable-mail-script-code&quot; class=&quot;heading-anchor&quot;&gt;Callable Mail Script Code&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;mail_script&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;unsubscribe_emails&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;mail-script&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/two-step-unsubscribe/#mail-script&quot; class=&quot;heading-anchor&quot;&gt;Mail Script&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//name this unsubscribe_emails&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;runMailScript&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token parameter&quot;&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  template&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  email&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  email_action&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  event&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; emailSysId &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; email_action&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; instanceLink &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;glide.servlet.uri&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  link &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;a href=&quot;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; instanceLink&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  link &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;verify_unsubscribe.do?&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  link &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;notification=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; emailSysId&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  link &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot;&amp;gt;Unsubscribe from this email.&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//can this be unsubscribed from?&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; notification &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysevent_email_action&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  notification&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;active=true^sys_id=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; emailSysId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//this controls when someone can unsubscribe&lt;/span&gt;
  notification&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;mandatory=false&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
  notification&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;notification&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    template&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; template&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; email&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; email_action&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;ui-page&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/two-step-unsubscribe/#ui-page&quot; class=&quot;heading-anchor&quot;&gt;UI Page&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!--Name: verify_unsubscribe--&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jelly:core&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;glide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;evaluate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    var type = false;
    var notificationGR = new GlideRecord(&#39;sysevent_email_action&#39;);
    if(notificationGR.get(RP.getParameterValue(&#39;notification&#39;))){
      type = notificationGR.getValue(&#39;name&#39;);
    }
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;g:&lt;/span&gt;evaluate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;if&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;${type!=false}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      Are you sure you want to unsubscribe from this notification?
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
      By clicking &quot;Unsubscribe&quot; you will no longer receive
      any notifications for &quot;${type}&quot;.
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;unsubscribe.do?sysparm_notification=${RP.getParameterValue(&#39;notification&#39;)}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; 
       &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;btn btn-primary&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    Unsubscribe
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;if&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;${type==false}&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Oops there was an error.&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Redirect old CMS pages to your Service Portal</title>
      <link href="https://jace.pro/blog/redirect-old-cms-pages-to-your-service-portal/" />
      <updated>2017-09-10T00:00:00Z</updated>
      <id>https://jace.pro/blog/redirect-old-cms-pages-to-your-service-portal/</id>
      <content type="html">
				&lt;p&gt;After your go live (congratulations) if you made the mistake I made and wanted to replace the namespace of your cms with your service portal you will have an issue where old links from past emails, bookmarks and 3rd party sources link to the cms pages.&lt;/p&gt;&lt;p&gt;When I sought out help for this after the fact the responses I got were not helpful.&lt;/p&gt;&lt;p&gt;Don’t use the same name space&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Correct all links&lt;/li&gt;&lt;li&gt;Now that information might have been useful before the go live.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;What I did to correct what I could was the following;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Correct links in outbound messages&lt;/li&gt;&lt;li&gt;Create a ui page for each page the cms had. E.g.&amp;nbsp;&lt;code&gt;cmssearchpage.do&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This page you can toss a HTML redirect to the appropriate Service Portal page.&lt;/p&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token prolog&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
         &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;jelly:core&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
         &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;glide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
         &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;j2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
         &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xmlns:&lt;/span&gt;g2&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;null&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
    window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;href &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;/cms&#39;&lt;/span&gt;
  &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token namespace&quot;&gt;j:&lt;/span&gt;jelly&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Show hints for choice lists</title>
      <link href="https://jace.pro/blog/show-hints-for-choice-lists/" />
      <updated>2017-09-08T00:00:00Z</updated>
      <id>https://jace.pro/blog/show-hints-for-choice-lists/</id>
      <content type="html">
				&lt;p&gt;A stakeholder asked me to show hints in a more obvious way on a form. This was my suggestion. Using the hint field on the&amp;nbsp;&lt;code&gt;sys_choice&lt;/code&gt;&amp;nbsp;table. Have a client script onChange check for the value, if one is set, clear the message for this field, and show the found message.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// script include global.choiceUtil&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// client callable true&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; choiceUtil &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Class&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
choiceUtil&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Object&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;extendsObject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;AbstractAjaxProcessor&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function-variable function&quot;&gt;getHint&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; returnObj &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; hint &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_choice&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      hint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      hint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;element&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_field&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      hint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;value&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_val&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      hint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;inactive&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;false&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      hint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        returnObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hint &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;hint&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        returnObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;error &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;no choice found for &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        returnObj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;error &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; hint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;returnObj&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;  &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;choiceUtil&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;control&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isLoading&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; isTemplate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;isLoading &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; newValue &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; field &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;state&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; ga &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideAjax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;global.choiceUtil&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  ga&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;getHint&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  ga&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_table&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTableName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  ga&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_field&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; field&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  ga&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addParam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sysparm_val&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  ga&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getXML&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;HintParse&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;HintParse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; answer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;responseXML&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;answer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hideFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;answer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hint&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      g_form&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showFieldMsg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; answer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hint&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;info&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here’s the out of box hints.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/gUNJ7oLcQf-471.webp 471w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/gUNJ7oLcQf-471.jpeg&quot; alt width=&quot;471&quot; height=&quot;155&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Here’s the alternative.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/R92cQ5T81T-650.webp 650w, https://jace.pro/img/R92cQ5T81T-960.webp 960w, https://jace.pro/img/R92cQ5T81T-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/R92cQ5T81T-650.jpeg&quot; alt width=&quot;1400&quot; height=&quot;372&quot; srcset=&quot;https://jace.pro/img/R92cQ5T81T-650.jpeg 650w, https://jace.pro/img/R92cQ5T81T-960.jpeg 960w, https://jace.pro/img/R92cQ5T81T-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Syncing Comments on Requested Item and Catalog Task</title>
      <link href="https://jace.pro/blog/syncing-comments-on-requested-item-and-catalog-task/" />
      <updated>2017-09-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/syncing-comments-on-requested-item-and-catalog-task/</id>
      <content type="html">
				&lt;p&gt;To me, this is a terrible request to fulfill. The best way to handle this is to have fulfillers go to the requested item and communicate there. You may not have that option because of one reason or another.&lt;/p&gt;&lt;p&gt;Steps&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Comments are not on Catalog Task, so add that first.&lt;/li&gt;&lt;li&gt;Then Register an event called,&amp;nbsp;&lt;code&gt;custom.catalog.ritm.commented&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Copy your Request Item Commented Notification.&lt;/li&gt;&lt;li&gt;Change your notification to be triggered by event,&amp;nbsp;&lt;code&gt;custom.catalog.ritm.commented&lt;/code&gt;&amp;nbsp;instead of by update or insert.&lt;/li&gt;&lt;li&gt;Change your notification so that the Who Will Receive is unset, and check the box, Event parm 1 contains recipient&lt;/li&gt;&lt;li&gt;Insert and stay on the notification for (&lt;code&gt;sc_req_item&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Insert and stay on the notification for (&lt;code&gt;sc_task&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;Create the business rules below;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Name: push comments to ritm&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Table: Catalog Task&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// When: Before&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Insert: false&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Update:true&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;executeRule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; previous &lt;span class=&quot;token comment&quot;&gt;/*null when async*/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; item &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_req_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;request_item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;comments &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;comments&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setUseEngines&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// Tells the system not to run anything&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// with &quot;engine&quot; in the name from this list.&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// https://is.gd/gsNiQZ&lt;/span&gt;
      item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; email &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;u_requested_for&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;u_requested_for&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eventQueue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;custom.catalog.ritm.commented&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        item&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name
      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; log &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Push comments to ritm&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Error: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; error&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; log&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; previous&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Name: push comments to tasks&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Table: Request Item&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// When: Before&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Insert: false&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Update:true&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;executeRule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; previous &lt;span class=&quot;token comment&quot;&gt;/*null when async*/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sc_task &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sc_task&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;request_item&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;active&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;true&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;comments &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;comments&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setUseEngines&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// Tells the system not to run anything&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// with &quot;engine&quot; in the name from this list.&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// https://is.gd/gsNiQZ&lt;/span&gt;
      sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; email &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;assigned_to&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;assigned_to&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;assigned_to&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;assignment_group&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sc_task&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;assignment_group&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getDisplayValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eventQueue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;custom.catalog.ritm.commented&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        sc_task&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sys_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        email&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nam
      &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; log &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Push comments to tasks&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    gs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Error: &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; error&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; log&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; previous&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Integration Considerations</title>
      <link href="https://jace.pro/blog/integration-considerations/" />
      <updated>2017-09-06T00:00:00Z</updated>
      <id>https://jace.pro/blog/integration-considerations/</id>
      <content type="html">
				&lt;p&gt;I’m recalling this from memory and this is old and could be updated for Scripted Rest APIs and such, but I want to get this out here.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/0rjo1_ur9w-650.webp 650w, https://jace.pro/img/0rjo1_ur9w-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/0rjo1_ur9w-650.jpeg&quot; alt=&quot;Flow Decisions&quot; width=&quot;960&quot; height=&quot;677&quot; srcset=&quot;https://jace.pro/img/0rjo1_ur9w-650.jpeg 650w, https://jace.pro/img/0rjo1_ur9w-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;That is verbose but all you need to know is what your doing, and what is preferred like so;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/jesFprXwXd-606.webp 606w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/jesFprXwXd-606.jpeg&quot; alt=&quot;Flow Decisions&quot; width=&quot;606&quot; height=&quot;294&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Generally if you are doing a “one time” import, generally almost always easiest to do a file import. Sometimes, a database connection is better, it’s the same work. You’ll set up a import table, and a transform map.&lt;/p&gt;&lt;p&gt;If you are setting up a recurring import like from the stock market or some weather source the following questions have to be asked;&lt;/p&gt;&lt;h2 id=&quot;what-triggers-this-data-coming-into-servicenow&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integration-considerations/#what-triggers-this-data-coming-into-servicenow&quot; class=&quot;heading-anchor&quot;&gt;What triggers this data coming into ServiceNow&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;If what triggers this data is an interval, then make a scheduled job/workflow that runs on that interval.&lt;/li&gt;&lt;li&gt;If what triggers this data is an action, like a major change is created, then it’s a matter of running the code triggered from that update. I’d do this by registering an event, and then in the business rule, triggering said event. Then create a script action to actually make the web service call (via a script include). This might seem like a lot of extra steps, but by abstracting this, it’s much easier to test.&lt;/li&gt;&lt;li&gt;If the trigger is a task getting closed in certain state, you can try to disable rules to allow you make these changes, or you can trigger the event.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;what-data-comes-into-servicenow-a-full-pull-or-whats-requested&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/integration-considerations/#what-data-comes-into-servicenow-a-full-pull-or-whats-requested&quot; class=&quot;heading-anchor&quot;&gt;What data comes into ServiceNow, a full pull or what’s requested&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;If the data that comes into ServiceNow is an individual record, it probably makes the most sense to do a outbound web service call like a REST or SOAP Call, that response you get back will have to be parsed and then dealt with. I’d recommend dealing with it on a transform table because then you can deal with the data and massage it like any other imported data.&lt;/li&gt;&lt;li&gt;If the data that comes into ServiceNow is a full set of the data, it probably doesn’t make sense to do it over a web service, as those are generally paginated and that can be a pain to deal with, ideally, you would have read access to their database, and you can pull it in.&lt;/li&gt;&lt;li&gt;If not, the next best thing would be if they can prepare a single file for you to parse that you can read hosted some place. If that’s not possible, I’d then look into the possibility of them pushing the data to you.&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Legacy Workflow considerations</title>
      <link href="https://jace.pro/blog/legacy-workflow-considerations/" />
      <updated>2017-08-15T00:00:00Z</updated>
      <id>https://jace.pro/blog/legacy-workflow-considerations/</id>
      <content type="html">
				&lt;p&gt;These should be considered when using a workflow.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Patterns&lt;/li&gt;&lt;li&gt;Activities&lt;/li&gt;&lt;li&gt;Script&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;patterns&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/legacy-workflow-considerations/#patterns&quot; class=&quot;heading-anchor&quot;&gt;Patterns&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Always, always add a timer after the Begin activity.&lt;/li&gt;&lt;li&gt;Avoid Switches because they don’t update when their conditioned field changes.&lt;/li&gt;&lt;li&gt;Avoid Email Activities, instead, opt for Event activities.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Here I have a diagram showing a timer added after the Begin activity. This timer returns makes the event queue process the work instead of the user’s session. This is great for user experience. But, it makes your workflow dependent on the events queue. If that goes down, this is the least of your worries.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/QBQdjmpJkj-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/QBQdjmpJkj-650.jpeg&quot; alt width=&quot;650&quot; height=&quot;124&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Next, I have a Diagram showing the Switch, if some changed the variable/field values of “Standard” to “Mechanical” the workflow activity won’t know to use the new value until you check it out, then recreate the switch, and check it back in. Because of this, I use If activities. This will result in more activities but, because the If activities are scripted, they won’t break when you change the variable. If activities used to allow you to create any number of “result” boxes below, one of them being an “else” but now If’s are either yes or no for results. Below is an example Switch Workflow and it in the If pattern.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/JlrY5kjuPB-650.webp 650w, https://jace.pro/img/JlrY5kjuPB-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/JlrY5kjuPB-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;435&quot; srcset=&quot;https://jace.pro/img/JlrY5kjuPB-650.jpeg 650w, https://jace.pro/img/JlrY5kjuPB-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/ZsxVSG1AQq-650.webp 650w, https://jace.pro/img/ZsxVSG1AQq-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/ZsxVSG1AQq-650.jpeg&quot; alt width=&quot;960&quot; height=&quot;474&quot; srcset=&quot;https://jace.pro/img/ZsxVSG1AQq-650.jpeg 650w, https://jace.pro/img/ZsxVSG1AQq-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Because you should avoid checking out workflows, always use events in workflows if you need a workflow to generate a notification. Some extra steps are needed to do this but it’s well worth it because now you can use the notification records how they are for the rest of the system, you can generate the notification without the workflow by running the following in a business rule or any server-side script;&lt;/p&gt;&lt;p&gt;&lt;code&gt;gs.eventQueue(&#39;custom.notification&#39;, current, &#39;parm1&#39;, &#39;parm2&#39;);&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Now if you were using variables and are not sure how to pass more than two parameters, don’t fear. Make your first parm a&amp;nbsp;&lt;code&gt;JSON.stringify&lt;/code&gt;&amp;nbsp;object. Sure you’ll need to&amp;nbsp;&lt;code&gt;JSON.parse&lt;/code&gt;&amp;nbsp;the object in the notification, but now you can pass everything in a way not dependent on the workflow.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Automagically Link records from journaled fields.</title>
      <link href="https://jace.pro/blog/automagically-link-records-from-journaled-fields/" />
      <updated>2017-08-07T00:00:00Z</updated>
      <id>https://jace.pro/blog/automagically-link-records-from-journaled-fields/</id>
      <content type="html">
				&lt;div data-callout=&quot;info&quot; class=&quot;callout&quot;&gt;&lt;div class=&quot;callout-title&quot;&gt;&lt;div class=&quot;callout-title-icon&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; class=&quot;lucide lucide-info&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M12 16v-4&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M12 8h.01&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;callout-title-inner&quot;&gt;Don’t use this anymore&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;This is old and I wouldn’t recommend anymore. I’m keeping this up because I want to find it later.&lt;br&gt;Jace May 21, 2022&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Here I’ll write the logic out some and note the issues identified so far.&lt;/p&gt;&lt;p&gt;The way this works is if a&amp;nbsp;&lt;code&gt;sys_journal_field&lt;/code&gt;&amp;nbsp;record is created or updated, then verify the field is a journal type. Then pass the value of the notes to&amp;nbsp;&lt;code&gt;paddAndRefLinks&lt;/code&gt;&amp;nbsp;function. This will iterate over most the sys_number records to find possible records, do a get against possible record and if found rewrite the entry either a link.&lt;/p&gt;&lt;p&gt;The places I’ve seen this not work well.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Virtual task boards don’t handle [code] tags well if the second tag is cut off from the display.&lt;/li&gt;&lt;li&gt;If you insert knowledge into comments it prepends and appends the [code] tags. I don’t account for this in the script&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Below is the script.&lt;/p&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Business Rule: Automagically Link*/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* Table: sys_journal_field*/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* When: After*/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* Order: 100*/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* Insert: true*/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* Update:true*/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* jslint sloppy: true, vars: true*/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* global GlideRecord, current, paddAndLinkRefs*/&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onAfter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;current&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; previous&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//This function will be automatically called when this rule&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// is processed.&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//if dict.type is journal... rewrite teh notes&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dict &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_dictionary&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dictQuery &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;internal_type=journal&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  dictQuery &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;^ORinternal_type=journal_input&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  dictQuery &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;^name=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  dictQuery &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;^element=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  dict&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dictQuery&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  dict&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dict&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; newValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;paddAndLinkRefs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//update audit record&lt;/span&gt;
    current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setWorkflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;autoSysFields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; audit &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_audit&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; auditQuery &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;documentkey=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;element_id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    auditQuery &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;^fieldname=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; current&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    auditQuery &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;^ORDERBYDESCrecord_checkpoint&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;auditQuery&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;newvalue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setWorkflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;autoSysFields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      audit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;paddAndLinkRefs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//below finds http links&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; httpregex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;https&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;[^s]+)&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;gi&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; httpsubst &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;[code]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  httpsubst &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;a href=&quot;$1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  httpsubst &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;$1&amp;lt;/a&amp;gt;[/code]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// The substituted value will be contained in the result &lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// variable&lt;/span&gt;
  text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;httpregex&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; httpsubst&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//above finds http links&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//below finds links to records based on numbers&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; num &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;sys_number&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; numQuery &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;category!=sc_ic_task_defn_staging&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  numQuery &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;^category!=task&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  numQuery &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;^category!=ts_index_name&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEncodedQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; tables &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    tables&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&#39;name&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;category&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&#39;prefix&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prefix&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&#39;digits&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; num&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;maximum_digits&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; tables&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tables&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; prefix &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tables&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prefix&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; digits &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tables&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;digits&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; re &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;RegExp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;(&#92;s|^)(&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; prefix &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;)(&#92;d+)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gi&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;re&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; copy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toUpperCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; number &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; copy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prefix&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; space &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; copy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prefix&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;number&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; digits&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        number &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; number&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; recordnumber &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; prefix &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; number&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; test &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;GlideRecord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;table&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;//number field by default to &#39;number&#39;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; numberField &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;number&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
      &lt;span class=&quot;token comment&quot;&gt;//test if &#39;u_number&#39; is valid&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;test&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isValidField&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;u_number&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; 
        numberField &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;u_number&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//if so, use it&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;test&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;numberField&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; recordnumber&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; space&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;[code]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;a style=&quot;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;text-decoration: underline; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;color: #0000ff;&quot; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;href=&quot;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.do?sysparm_query=&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; numberField &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; recordnumber&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;data-mce-href=&quot;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; table &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;.do?&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;sysparm_query=&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; numberField &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;=&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; recordnumber &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot; data-mce-style=&quot;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;text-decoration: underline; &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;color: #0000ff;&quot;&amp;gt;&quot;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; recordnumber &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;/a&amp;gt;[/code]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; m&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>5 rules for emails</title>
      <link href="https://jace.pro/blog/5-rules-for-emails/" />
      <updated>2016-03-24T00:00:00Z</updated>
      <id>https://jace.pro/blog/5-rules-for-emails/</id>
      <content type="html">
				&lt;h2 id=&quot;do-not-use-the-servicenow-provided-email-address&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/5-rules-for-emails/#do-not-use-the-servicenow-provided-email-address&quot; class=&quot;heading-anchor&quot;&gt;Do not use the ServiceNow provided email address&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://docs.servicenow.com/csh?version=latest&amp;amp;topicname=c_AlternateEmailConfigurations&quot; rel=&quot;noopener&quot;&gt;Always set up your own mailbox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Once someone knows about the email address, they never, ever, forget it, at least now you can get rid of it or change it accordingly.&lt;/li&gt;&lt;li&gt;Changing the “From” on notifications is not possible without setting this up.&lt;/li&gt;&lt;li&gt;This puts all the content submitted on your own servers where you can control it. Otherwise they are all on ServiceNow’s servers where you don’t have the same control.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;events-or-workflow-activities-always-events-and-heres-a-list-of-reasons-why&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/5-rules-for-emails/#events-or-workflow-activities-always-events-and-heres-a-list-of-reasons-why&quot; class=&quot;heading-anchor&quot;&gt;Events or Workflow Activities? Always Events and here’s a list of reasons why&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Ability to trigger the notification from any server side script.&lt;/li&gt;&lt;li&gt;Faster prototyping of the notification. Why? Because you can trigger the notification on&amp;nbsp;&lt;code&gt;sysevent&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Events can also trigger Script Actions which allow you to run server scripts.&lt;/li&gt;&lt;li&gt;Workflow notifications are limited compared to notification events.&lt;/li&gt;&lt;li&gt;Workflow notifications need you to checkout the workflow to update the notification.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;send-email-that-require-action&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/5-rules-for-emails/#send-email-that-require-action&quot; class=&quot;heading-anchor&quot;&gt;Send email that require action&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Ideally, emails require action and can be handled from the email. If they cannot, consider summarizing that information for a email sent on a recurring frequency.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Examples of actionable subjects with commentary&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;RITM1234 Laptop Approval for Bart Simpson&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Can be handled on your phone, searchable by record number, who and what is clear.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Reminder to Please take this survey related to Request INC1370&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Should be as concise as possible, so I’d start at “Take this …” or “Survey for INC1370”&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;ServiceNow Customer Satisfaction Survey for INT3389&lt;/p&gt;&lt;ul&gt;&lt;li&gt;From HI as of August 2017&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Informing users is sometimes useful, but may also be unnecessary.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Examples of informational subjects with commentary&lt;/li&gt;&lt;li&gt;INC1370 Opened on your behalf&lt;/li&gt;&lt;li&gt;INC1370 Resolved&lt;/li&gt;&lt;li&gt;TASK1234 Provision User Access Assigned to you (cannot be handled on your phone, so essentially, you’re informing someone they have work.)&lt;/li&gt;&lt;li&gt;TASK1235 Revoke Location Access Assign to your group (cannot be handled on your phone, so essentially, you’re informing someone they have work.)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;One way to sending more useful content less often is to send out a summary notification daily or weekly. Don’t send a summary if there is nothing to tell them about.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ServiceNow Weekly Summary for 2017-09-08&lt;/li&gt;&lt;li&gt;ServiceNow Daily Summary for 2017-09-04&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;allow-users-to-unsubscribe-to-actionable-or-informational-emails-or-not&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/5-rules-for-emails/#allow-users-to-unsubscribe-to-actionable-or-informational-emails-or-not&quot; class=&quot;heading-anchor&quot;&gt;Allow users to unsubscribe to actionable, or informational emails or not&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;Actively discourage the use of Inbound Email as a mechanism for ticket creation. It should be used when the sending party is a robot. Over time, the conditions desired by your stakeholders, and the propensity for user input error will make inbound email a horrific mess. Its also like Pandora’s Box. Once you tell users they can email into ServiceNow, they’ll never stop. I force stakeholders to sign off to knowing about a 30% failure rate if they want inbound email processing. –&amp;nbsp;&lt;a href=&quot;https://community.servicenow.com/message/990963#991021&quot; rel=&quot;noopener&quot;&gt;Robert Fedoruk&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;memorize-this-diagram&quot;&gt;&lt;a href=&quot;https://jace.pro/blog/5-rules-for-emails/#memorize-this-diagram&quot; class=&quot;heading-anchor&quot;&gt;Memorize this diagram&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://jace.pro/img/P2R_2ihmaG-650.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://jace.pro/img/P2R_2ihmaG-650.jpeg&quot; alt=&quot;A diagram showing the logic of when an incoming email is processed in ServiceNow&quot; title=&quot;ServiceNow Email Processing Diagram&quot; width=&quot;650&quot; height=&quot;483&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;ServiceNow Email Processing Diagram&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
 			</content>
    </entry></feed>
