<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Jace&#39;s Blog</title>
    <description></description>
    
    <link>https://jaces-newsletter-247292.beehiiv.com/</link>
    <atom:link href="https://rss.beehiiv.com/feeds/YEItOcY3R0.xml" rel="self"/>
    
    <lastBuildDate>Thu, 16 Apr 2026 21:42:34 +0000</lastBuildDate>
    <pubDate>Mon, 23 Jun 2025 11:30:00 +0000</pubDate>
    <atom:published>2025-06-23T11:30:00Z</atom:published>
    <atom:updated>2026-04-16T21:42:34Z</atom:updated>
    
      <category>Business</category>
      <category>Programming</category>
      <category>Technology</category>
    <copyright>Copyright 2026, Jace&#39;s Blog</copyright>
    
    <image>
      <url>https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/publication/logo/b41c5403-e555-4ab8-a83e-6e3c157c5b92/jaceprologo.png</url>
      <title>Jace&#39;s Blog</title>
      <link>https://jaces-newsletter-247292.beehiiv.com/</link>
    </image>
    
    <docs>https://www.rssboard.org/rss-specification</docs>
    <generator>beehiiv</generator>
    <language>en-us</language>
    <webMaster>support@beehiiv.com (Beehiiv Support)</webMaster>

      <item>
  <title>SkyGiraffe and the Rise of Mobile-First Work: A Builder’s Reflection</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/4981da9d-401b-454a-8883-396f3c187c10/SkyGiraffe.png" length="232047" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/skygiraffe-and-the-rise-of-mobile-first-work-a-builder-s-reflection</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/skygiraffe-and-the-rise-of-mobile-first-work-a-builder-s-reflection</guid>
  <pubDate>Mon, 23 Jun 2025 11:30:00 +0000</pubDate>
  <atom:published>2025-06-23T11:30:00Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Mobile]]></category>
    <category><![CDATA[Acquisitions]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;"><b>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.</b></p><p class="paragraph" style="text-align:left;">Today, we look at <b>SkyGiraffe</b>, a company that took on a challenge nearly every enterprise faces, and did it with clarity, conviction, and craft.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="the-mobile-work-problem-no-one-was-">The Mobile Work Problem No One Was Solving (Well)</h3><p class="paragraph" style="text-align:left;">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 <a class="link" href="https://web.archive.org/web/20110216203148/http://wiki.service-now.com/index.php?title=Mobile_Device_ITIL_and_Service_Management_Plugin&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=skygiraffe-and-the-rise-of-mobile-first-work-a-builder-s-reflection#Notes_and_Limitations" target="_blank" rel="noopener noreferrer nofollow">ServiceNow’s Mobile docs</a>. </p><p class="paragraph" style="text-align:left;">SkyGiraffe saw this gap. Their insight was simple but powerful: <b>employees needed real, secure access to business data on the go</b>, without the traditional overhead of building mobile apps from scratch.</p><p class="paragraph" style="text-align:left;">They didn’t just want to make mobile access easier, they wanted to make it fast, scalable, and native. For everyone.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="the-founders-behind-the-vision">The Founders Behind the Vision</h3><p class="paragraph" style="text-align:left;">SkyGiraffe was born from the experience and vision of <a class="link" href="https://www.linkedin.com/in/boazhecht/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=skygiraffe-and-the-rise-of-mobile-first-work-a-builder-s-reflection" target="_blank" rel="noopener noreferrer nofollow"><b>Boaz Hecht</b></a> and <a class="link" href="https://www.linkedin.com/in/itay-braun/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=skygiraffe-and-the-rise-of-mobile-first-work-a-builder-s-reflection" target="_blank" rel="noopener noreferrer nofollow"><b>Itay Braun</b></a>.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">Together, they formed a team that understood both the pain of enterprise software and the elegance needed to solve it.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="what-sky-giraffe-built-and-why-it-w">What SkyGiraffe Built (and Why It Worked)</h3><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">Using a &quot;meta-data architecture,&quot; 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.</p><p class="paragraph" style="text-align:left;">No front-end coding. No heavy scripting. Just point, connect, and deploy.</p><p class="paragraph" style="text-align:left;">In other words, <b>they abstracted away the hardest parts of mobile enterprise development</b>, and gave companies a way to build hundreds of apps quickly, securely, and beautifully.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="the-acquisition-october-2017">The Acquisition: October 2017</h3><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">By integrating SkyGiraffe’s tech into the Now Platform, ServiceNow aimed to:</p><ul><li><p class="paragraph" style="text-align:left;">Enable native mobile versions of every packaged app, starting with ITSM</p></li><li><p class="paragraph" style="text-align:left;">Let customers build apps in <i>days</i>, not months</p></li><li><p class="paragraph" style="text-align:left;">Offer offline support and native mobile experiences with zero code</p></li></ul><p class="paragraph" style="text-align:left;">As CJ Desai, ServiceNow’s Chief Product Officer, put it: <i>“Our work lives should be as mobile-friendly as our consumer lives.”</i></p><p class="paragraph" style="text-align:left;">SkyGiraffe helped make that possible.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="what-lives-on-today">What Lives On Today</h3><p class="paragraph" style="text-align:left;">While the SkyGiraffe name may no longer be on a website, its DNA lives on.</p><p class="paragraph" style="text-align:left;">ServiceNow’s <b>Mobile App Builder</b>, <b>Mobile Studio</b>, and <b>native mobile capabilities</b> 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.</p><p class="paragraph" style="text-align:left;">Many of the team members, Boaz, Itay, Yev, played key roles in shaping ServiceNow’s mobile strategy during their time there.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="what-they-are-up-to-now">What they are up to now?</h3><p class="paragraph" style="text-align:left;">Today Boaz Hecht together with two of the original SkyGiraffe team, <a class="link" href="https://www.linkedin.com/in/josh-russ-4568307a/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=skygiraffe-and-the-rise-of-mobile-first-work-a-builder-s-reflection" target="_blank" rel="noopener noreferrer nofollow">Josh Russ</a> & <a class="link" href="https://www.linkedin.com/in/yevgeniygoldin/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=skygiraffe-and-the-rise-of-mobile-first-work-a-builder-s-reflection" target="_blank" rel="noopener noreferrer nofollow">Yev Goldin</a> joined forces start<a class="link" href="https://8flow.ai?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=skygiraffe-and-the-rise-of-mobile-first-work-a-builder-s-reflection" target="_blank" rel="noopener noreferrer nofollow"> </a><a class="link" href="https://8Flow.ai?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=skygiraffe-and-the-rise-of-mobile-first-work-a-builder-s-reflection" target="_blank" rel="noopener noreferrer nofollow">8Flow.ai</a>, proof that great teams often stick together and keep building</p><p class="paragraph" style="text-align:left;">Itay Braun has since co-founded <a class="link" href="https://www.dynatrace.com/news/blog/dynatrace-metis-helping-developers-sres-solve-database-issues-with-ai/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=skygiraffe-and-the-rise-of-mobile-first-work-a-builder-s-reflection" target="_blank" rel="noopener noreferrer nofollow">Metis which was just acquired in March of 2025</a> by Dynatrace. Metis, “Enabling developers to own their Database”.  They enabled development teams to proactively take a preventative and holistic approach to database code. </p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="what-modern-builders-can-learn">What Modern Builders Can Learn</h3><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Solve a real pain with elegance.</b><br>SkyGiraffe succeeded because they saw a painful problem (mobile access to enterprise data) and solved it simply, without compromising on enterprise-grade quality.</p></li><li><p class="paragraph" style="text-align:left;"><b>Your architecture matters.</b><br>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.</p></li><li><p class="paragraph" style="text-align:left;"><b>Design for the future, not the past.</b><br>While others were focused on making legacy systems work <i>a little better</i>, SkyGiraffe designed for the mobile world that was coming. That’s what made them acquisition-worthy.</p></li></ol><hr class="content_break"><p class="paragraph" style="text-align:left;"><b>Final Thought</b></p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">To all the builders out there: keep solving real problems. You never know where the next good idea might take you.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=4e1f99e4-7372-46cf-ba7f-72e461a1fb52&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>ServiceNow’s Acquisition of Qlue</title>
  <description>What We Can Learn from the virtual agent acquisition</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b432aabe-5380-4f2d-a6b7-25d0558b9d30/Add_a_heading__1_.png" length="96999" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/servicenow-s-acquisition-of-qlue</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/servicenow-s-acquisition-of-qlue</guid>
  <pubDate>Mon, 02 Jun 2025 13:01:00 +0000</pubDate>
  <atom:published>2025-06-02T13:01:00Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Acquisitions]]></category>
    <category><![CDATA[Virtual Agent]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;"><b>The Spark in the Conversation: What We Can Learn from ServiceNow’s Acquisition of Qlue</b></p><p class="paragraph" style="text-align:left;"><i>By a Builder, For Builders – A Series on What Past ServiceNow Acquisitions Teach Us About Innovation</i></p><hr class="content_break"><p class="paragraph" style="text-align:left;">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 <b>Qlue</b> for $6.6 million.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="why-qlue-mattered">Why Qlue Mattered</h3><p class="paragraph" style="text-align:left;">Founded by <a class="link" href="https://www.linkedin.com/in/hasangrizvi/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=servicenow-s-acquisition-of-qlue" target="_blank" rel="noopener noreferrer nofollow">Hasan Rizvi</a> (a veteran from Oracle with a deep well of enterprise software experience) and <a class="link" href="https://www.linkedin.com/in/rahim-yaseen-ba66a9/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=servicenow-s-acquisition-of-qlue" target="_blank" rel="noopener noreferrer nofollow">Rahim Yaseen</a> (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?</p><p class="paragraph" style="text-align:left;">In an era where consumers were already chatting with Siri and Alexa, enterprise users were still submitting tickets like it was 1999.</p><p class="paragraph" style="text-align:left;">Qlue set out to change that by building <b>AI-powered virtual agents</b> 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.</p><p class="paragraph" style="text-align:left;">They weren’t building novelty. They were building <b>relief,</b> at scale.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="the-builders-behind-it">The Builders Behind It</h3><p class="paragraph" style="text-align:left;">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. <a class="link" href="https://www.linkedin.com/in/mfortson/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=servicenow-s-acquisition-of-qlue" target="_blank" rel="noopener noreferrer nofollow">Michael Fortson-Dillon</a>, Qlue’s Director of Mobile, would go on to lead major product efforts at ServiceNow post-acquisition. <a class="link" href="https://www.linkedin.com/in/amit-jasuja-60b573/details/experience/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=servicenow-s-acquisition-of-qlue" target="_blank" rel="noopener noreferrer nofollow">Amit Jusuja</a>, who helped operationalize Qlue, had shaped Java and IoT platforms. And <a class="link" href="https://www.linkedin.com/in/kenlaversin/details/experience/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=servicenow-s-acquisition-of-qlue" target="_blank" rel="noopener noreferrer nofollow">Ken Laversin</a>, Qlue’s sales advisor, later led GTM at AI unicorns like <a class="link" href="https://C3.ai?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=servicenow-s-acquisition-of-qlue" target="_blank" rel="noopener noreferrer nofollow">C3.ai</a> and Skyflow.</p><p class="paragraph" style="text-align:left;">This wasn’t a random crew; it was a <b>dream team of seasoned enterprise technologists</b> who saw the future before it arrived.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="the-acquisition-that-planted-seeds">The Acquisition That Planted Seeds</h3><p class="paragraph" style="text-align:left;">ServiceNow wasn’t looking for flash. It was looking for <b>fit</b>.</p><p class="paragraph" style="text-align:left;">Qlue’s tech would become the bedrock for <b>ServiceNow’s Virtual Agent</b>, 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.</p><p class="paragraph" style="text-align:left;">Even more importantly, the Qlue acquisition represented a strategic thesis that’s shaped every AI initiative since: <b>automation is only powerful when it feels human</b>.</p><p class="paragraph" style="text-align:left;">This wasn’t just about reducing ticket volumes. It was about reimagining what it felt like to get help at work.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="lessons-for-builders">Lessons for Builders</h3><p class="paragraph" style="text-align:left;">Reflecting on Qlue today, several lessons emerge, especially for those of us building the next generation of tools in AI, enterprise, and beyond:</p><ul><li><p class="paragraph" style="text-align:left;"><b>Start with the pain, not the tech.</b> 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.</p></li><li><p class="paragraph" style="text-align:left;"><b>Bet on small, sharp teams.</b> 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.</p></li><li><p class="paragraph" style="text-align:left;"><b>Human-centered AI wins.</b> 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.</p></li><li><p class="paragraph" style="text-align:left;"><b>The right acquirer matters.</b> ServiceNow didn’t just buy Qlue and bury it. It <b>amplified it</b>. It gave Qlue’s ideas a canvas, one that reached tens of millions of users.</p></li></ul><hr class="content_break"><h3 class="heading" style="text-align:left;" id="final-thought">Final Thought</h3><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">And that’s a kind of legacy worth chasing, not for the headlines, but for the users quietly saying <i>thank you</i> every time the chatbot just works.</p><p class="paragraph" style="text-align:left;">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.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=74cec906-a431-4548-b9af-1daffbc146dc&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Predicting the Future: The DxContinuum Story</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/45f810b6-98ed-4859-993e-17bb29575aaf/Predicting_the_Future_The_DxContinuum_Story.png" length="886916" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/predicting-the-future-the-dxcontinuum-story</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/predicting-the-future-the-dxcontinuum-story</guid>
  <pubDate>Mon, 19 May 2025 12:59:19 +0000</pubDate>
  <atom:published>2025-05-19T12:59:19Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Acquisitions]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;"><b>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.</b></p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="a-glimpse-into-dx-continuum">A Glimpse into DxContinuum</h2><p class="paragraph" style="text-align:left;">Founded in the heart of Silicon Valley, DxContinuum set out to make machine learning practical for enterprise teams long before &quot;AI&quot; 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.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="meet-the-founders">Meet the Founders</h2><p class="paragraph" style="text-align:left;">At the core of DxContinuum’s success was a founding team with deep roots in data, enterprise platforms, and predictive modeling.</p><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/debuchatterjee/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=predicting-the-future-the-dxcontinuum-story" target="_blank" rel="noopener noreferrer nofollow"><b>Debu Chatterjee</b></a>, 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.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/baskarjayaraman/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=predicting-the-future-the-dxcontinuum-story" target="_blank" rel="noopener noreferrer nofollow"><b>Baskar Jayaraman</b></a>, 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.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/govindarajankannan/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=predicting-the-future-the-dxcontinuum-story" target="_blank" rel="noopener noreferrer nofollow"><b>Kannan Govindarajan</b></a>, 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.</p></li></ul><p class="paragraph" style="text-align:left;">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.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="what-the-product-did">What the Product Did</h2><p class="paragraph" style="text-align:left;">DxContinuum’s core offering, <b>Fathom</b>, 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.</p><p class="paragraph" style="text-align:left;">What made it special was its <b>instance-specific modeling</b>. 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&#39;s.</p><p class="paragraph" style="text-align:left;">The goal was always the same: <b>put intelligence into the workflow without asking users to change behavior</b>. In a way, it made the enterprise feel more like consumer tech—smart, invisible, and always learning.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="the-acquisition">The Acquisition</h2><p class="paragraph" style="text-align:left;">On <b>January 18, 2017</b>, 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.</p><p class="paragraph" style="text-align:left;">This wasn’t just about AI for AI’s sake, it was about <b>making workflows frictionless</b>. 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.</p><p class="paragraph" style="text-align:left;">It also marked a shift toward <b>platform-native intelligence</b>. Rather than bolting on AI, ServiceNow was baking it in, starting with the DNA from DxContinuum.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="where-it-stands-today">Where It Stands Today</h2><p class="paragraph" style="text-align:left;">DxContinuum’s legacy lives on in what became <b>Predictive Intelligence</b> within the ServiceNow ecosystem. By 2018, features like ticket categorization, assignment suggestions, and risk scoring were quietly transforming workflows behind the scenes.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="what-im-taking-from-this">What I’m Taking From This</h2><p class="paragraph" style="text-align:left;"><b>1. Solve real workflow pain, not just cool tech.</b><br>DxContinuum didn’t pitch “AI.” They solved routing, triage, and pipeline prediction. Every use case was grounded in how work actually happens.</p><p class="paragraph" style="text-align:left;"><b>2. Bake intelligence into the process.</b><br>The genius of their product was invisibility. Users didn’t need to think about the model, it just worked. That&#39;s the kind of UX that wins in the enterprise.</p><p class="paragraph" style="text-align:left;"><b>3. Don’t chase general models—build for the instance.</b><br>DxContinuum’s insistence on customer-specific models made their predictions more accurate, more useful, and more trustworthy. It’s a model worth stealing.</p><p class="paragraph" style="text-align:left;">Sources</p><p class="paragraph" style="text-align:left;">Mike Kaufman - <a class="link" href="https://www.servicenowelite.com/blog/2017/1/19/servicenow-acquires-dxcontinuum?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=predicting-the-future-the-dxcontinuum-story" target="_blank" rel="noopener noreferrer nofollow">https://www.servicenowelite.com/blog/2017/1/19/servicenow-acquires-dxcontinuum</a></p><p class="paragraph" style="text-align:left;">Press Release - <a class="link" href="https://www.servicenow.com/company/media/press-room/servicenow-acquires-dxcontinuum.html?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=predicting-the-future-the-dxcontinuum-story" target="_blank" rel="noopener noreferrer nofollow">https://www.servicenow.com/company/media/press-room/servicenow-acquires-dxcontinuum.html</a></p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=d84688c8-5d09-44df-aa6a-e268a4f44a0e&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Getting Text from an Image (windows 11)</title>
  <description></description>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/getting-text-from-an-image-windows-11</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/getting-text-from-an-image-windows-11</guid>
  <pubDate>Wed, 14 May 2025 13:00:00 +0000</pubDate>
  <atom:published>2025-05-14T13:00:00Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This is a short one. It’s often enough that I do something that makes someone say, ‘wait, what?!’</p><p class="paragraph" style="text-align:left;">Today was one of those days.</p><p class="paragraph" style="text-align:left;">Sometimes you need to extract text from an image. There are loads of ways to do this. This way is the simplest though.</p><p class="paragraph" style="text-align:left;">Open windows snipping tool, window key, search for “snipp”, or windows key + shift + s, capture the text, and press the box with lines in it. </p><p class="paragraph" style="text-align:left;">That Icon in the middle with the box and lines in it will highlight all the text and allow you to copy it. Here’s a screenshot from Knowledge 2025’s Keynote talking about ServiceNow’s Data Fabric. </p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/88af40c0-4b9a-4d9b-94ef-45b6e5485bcd/Window_-_Snipping_Tool.png?t=1747181353"/></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=c92246d8-5704-4d5f-b579-3fd6c8f6d1ff&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>BrightPoint Security: Automating Trust for the Enterprise</title>
  <description>Discover how BrightPoint Security (formerly Vorstack) tackled enterprise threat intel, got acquired by ServiceNow, and helped shape its Security Operations suite. Learn from their journey, team, and tech in this story of innovation and impact.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0cbeb354-b4d0-426f-b0df-781315895c9a/ChatGPT_Image_May_7__2025__11_42_26_PM.png" length="1035506" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/brightpoint-security-automating-trust-for-the-enterprise</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/brightpoint-security-automating-trust-for-the-enterprise</guid>
  <pubDate>Mon, 12 May 2025 13:00:00 +0000</pubDate>
  <atom:published>2025-05-12T13:00:00Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Acquisitions]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;"></p><p class="paragraph" style="text-align:left;">This is part of a series I&#39;m writing to help remind myself (and anyone else building) that it&#39;s possible. These aren&#39;t just stories about companies ServiceNow bought. They&#39;re reminders that someone out there built something worth acquiring.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="the-origin-of-bright-point-security">The Origin of BrightPoint Security</h3><p class="paragraph" style="text-align:left;">BrightPoint Security started out in the early 2010s under the name <i>Vorstack</i>. 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.</p><p class="paragraph" style="text-align:left;">By 2016, they had sharpened their message and positioned themselves as a real player in threat intelligence:</p><div class="blockquote"><blockquote class="blockquote__quote"><p class="paragraph" style="text-align:left;">“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.”</p><figcaption class="blockquote__byline"></figcaption></blockquote></div><p class="paragraph" style="text-align:left;">That’s not just filtering spammy alerts, that’s reducing months of work into minutes.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="the-team-behind-the-vision">The Team Behind the Vision</h3><p class="paragraph" style="text-align:left;">These folks weren’t just punching above their weight—they knew what they were doing:</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/andreashaugsnes?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=brightpoint-security-automating-trust-for-the-enterprise" target="_blank" rel="noopener noreferrer nofollow"><b>Andreas Haugsnes</b></a> – 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.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/joe-eandi-53a3834/details/experience/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=brightpoint-security-automating-trust-for-the-enterprise" target="_blank" rel="noopener noreferrer nofollow"><b>Joe Eandi</b></a> – 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.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/ravindraiyer/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=brightpoint-security-automating-trust-for-the-enterprise" target="_blank" rel="noopener noreferrer nofollow"><b>Ravi Iyer</b></a> – 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.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/slewisprofile/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=brightpoint-security-automating-trust-for-the-enterprise" target="_blank" rel="noopener noreferrer nofollow">Scott Lewis</a> – 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.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/richreybok/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=brightpoint-security-automating-trust-for-the-enterprise" target="_blank" rel="noopener noreferrer nofollow"><b>Rich Reybok</b></a> – 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.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/annebonaparte/details/experience/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=brightpoint-security-automating-trust-for-the-enterprise" target="_blank" rel="noopener noreferrer nofollow"><b>Anne Bonaparte</b></a> – Took over as CEO during BrightPoint’s growth stage. Had already been CEO of a few successful exits: MailFrontier, Tablus, Solidcore, Xora. She&#39;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. </p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="3-what-bright-point-built">3. What BrightPoint Built</h3><p class="paragraph" style="text-align:left;">Their product was called <b>Sentinel</b>. 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.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">It looked more like a trust network than a feed parser. That was the difference.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="the-acquisition-by-service-now">The Acquisition by ServiceNow</h3><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="where-it-stands-today">Where It Stands Today</h3><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="lessons-takeaways">Lessons & Takeaways</h3><p class="paragraph" style="text-align:left;"><b>Noise Reduction = Value</b><br>BrightPoint didn’t invent threat intel. They just made it actually useful. They cut through the noise, and that made all the difference.</p><p class="paragraph" style="text-align:left;"><b>Security Doesn’t Have to Be a Solo Sport</b><br>They built tools for collaboration. Shared defense. That was rare at the time, and it stood out.</p><p class="paragraph" style="text-align:left;"><b>An Exit Isn’t the End</b><br>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.</p><hr class="content_break"><p class="paragraph" style="text-align:left;"><b>Sources:</b></p><ul><li><p class="paragraph" style="text-align:left;">brightpointsecurity.com (<a class="link" href="https://web.archive.org/web/20160330214804/https://www.brightpointsecurity.com/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=brightpoint-security-automating-trust-for-the-enterprise" target="_blank" rel="noopener noreferrer nofollow">archived</a>)</p></li><li><p class="paragraph" style="text-align:left;">ServiceNow acquisition announcement (<a class="link" href="https://fortune.com/2016/06/01/servicenow-security-software-brightpoint/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=brightpoint-security-automating-trust-for-the-enterprise" target="_blank" rel="noopener noreferrer nofollow">via Fortune</a>)</p></li></ul></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=6718c05f-70f5-4802-9c69-2d7134fd6e98&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Calling Server Side Script includes from UIB Client Scripts</title>
  <description></description>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/calling-server-side-script-includes-from-uib-client-scripts</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/calling-server-side-script-includes-from-uib-client-scripts</guid>
  <pubDate>Sun, 11 May 2025 16:56:29 +0000</pubDate>
  <atom:published>2025-05-11T16:56:29Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Next Experience]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This could be improved a lot.</p><p class="paragraph" style="text-align:left;">Let’s first talk about how this is working for me.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">My working steps.</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Find or Create a Script Include</p></li><li><p class="paragraph" style="text-align:left;">Create a REST Endpoint that calls your Script Include</p></li><li><p class="paragraph" style="text-align:left;">Create a Client script using the helpers and snHttp method to call said REST endpoint</p></li><li><p class="paragraph" style="text-align:left;">Profit</p></li></ol><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">To take advantage of a rest call to call a server side script include, you’ll need to make a rest api … really?</p><p class="paragraph" style="text-align:left;">yep. one thing to note is you can use the async/await in the uib client scripts so that’s nice. </p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.servicenow.com/docs/bundle/yokohama-api-reference/page/app-store/dev_portal/API_reference/helpers/concept/helpersAPI.html?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=calling-server-side-script-includes-from-uib-client-scripts" target="_blank" rel="noopener noreferrer nofollow">ServiceNow Docs on Helper</a></p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.servicenow.com/community/developer-forum/how-to-use-script-includes-in-ui-builder/m-p/2510525?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=calling-server-side-script-includes-from-uib-client-scripts" target="_blank" rel="noopener noreferrer nofollow">Community post on Client Side Script Includes</a> (says to do this you need to make a rest call)</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.servicenow.com/community/developer-forum/call-script-include-from-ui-builder/m-p/2102347?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=calling-server-side-script-includes-from-uib-client-scripts" target="_blank" rel="noopener noreferrer nofollow">Useful examples of snHttp</a></p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=46aea1d0-5ac8-4c6a-9b19-2184f782df96&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>From Startup to ServiceNow: The Story of ITapp</title>
  <description>Explore how ITapp revolutionized cloud infrastructure management, catching ServiceNow&#39;s eye with innovative app assembly and seamless cloud orchestration strategies for modern businesses.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/102f0000-5d56-4632-a353-37733d59188a/ITapp.png" length="989689" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/from-startup-to-servicenow-the-story-of-itapp</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/from-startup-to-servicenow-the-story-of-itapp</guid>
  <pubDate>Mon, 05 May 2025 14:00:00 +0000</pubDate>
  <atom:published>2025-05-05T14:00:00Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Acquisitions]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;"><i>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.</i></p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="what-was-i-tapp">What Was ITapp?</h3><p class="paragraph" style="text-align:left;">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 intergrations, and a streamlined, cost-effective approach to cloud orchestration.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">On their <a class="link" href="https://web.archive.org/web/20151101114337/http://www.itapp.com/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-startup-to-servicenow-the-story-of-itapp" target="_blank" rel="noopener noreferrer nofollow">website in 2015</a>, ITapp made some big claims:</p><ul><li><p class="paragraph" style="text-align:left;"><b>75% faster</b> installation in HA mode</p></li><li><p class="paragraph" style="text-align:left;"><b>80% faster</b> integration time</p></li><li><p class="paragraph" style="text-align:left;"><b>75% less complexity</b> in app assembly</p></li><li><p class="paragraph" style="text-align:left;"><b>40% lower cost</b> than competitors</p></li></ul><p class="paragraph" style="text-align:left;">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.</p><h3 class="heading" style="text-align:left;" id="the-founders-seasoned-builders-not-">The Founders: Seasoned Builders, Not First-Timers</h3><p class="paragraph" style="text-align:left;">ITapp’s founding team was stacked with enterprise veterans:</p><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/brajeshgoyal/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-startup-to-servicenow-the-story-of-itapp" target="_blank" rel="noopener noreferrer nofollow"><b>Brajesh “BG” Goyal</b></a> 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.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/krugone/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-startup-to-servicenow-the-story-of-itapp" target="_blank" rel="noopener noreferrer nofollow"><b>Brian Krug</b></a>, previously a VP at Cisco, co-founded ITapp and later served as VP of Product Success at ServiceNow before founding AppFaktors.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/giridhar-padmanabh/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-startup-to-servicenow-the-story-of-itapp" target="_blank" rel="noopener noreferrer nofollow"><b>Giridhar “Gigi” Padmanabh</b></a> came with cloud experience from newScale (acquired by Cisco) and became a Senior Director at ServiceNow.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.linkedin.com/in/tahvildary/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-startup-to-servicenow-the-story-of-itapp" target="_blank" rel="noopener noreferrer nofollow"><b>Andrew Tahvildary</b></a>, 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.</p></li></ul><p class="paragraph" style="text-align:left;">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.</p><h3 class="heading" style="text-align:left;" id="the-product-a-next-gen-cloud-manage">The Product: A Next-Gen Cloud Management Platform</h3><p class="paragraph" style="text-align:left;">ITapp positioned itself as a next-gen cloud management platform with a visual, policy-driven approach to provisioning and orchestration. You could:</p><ul><li><p class="paragraph" style="text-align:left;">Visually assemble full-stack applications</p></li><li><p class="paragraph" style="text-align:left;">Attach custom storage and networking containers</p></li><li><p class="paragraph" style="text-align:left;">Manage quotas and delivery across multiple cloud providers</p></li><li><p class="paragraph" style="text-align:left;">Automate deployments with integrated CI/CD pipelines</p></li></ul><p class="paragraph" style="text-align:left;">It was part cloud broker, part orchestrator, part DevOps enabler, built with the enterprise in mind.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="4-the-acquisition-service-now-buys-">4. The Acquisition: ServiceNow Buys In</h3><p class="paragraph" style="text-align:left;">In April 2016, ServiceNow acquired ITapp for <a class="link" href="https://www.sec.gov/Archives/edgar/data/0001373715/0001373715-16-000364-index.htm?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-startup-to-servicenow-the-story-of-itapp" target="_blank" rel="noopener noreferrer nofollow"><b>$15 million</b></a>.</p><p class="paragraph" style="text-align:left;">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 <i>accelerating</i> their existing cloud management roadmap.</p><p class="paragraph" style="text-align:left;">As Sri Chandrashekar, then VP/GM of ITOM at ServiceNow, put it:</p><div class="blockquote"><blockquote class="blockquote__quote"><p class="paragraph" style="text-align:left;">“ITapp will augment our existing cloud management solution, allowing customers to optimize their cloud ecosystem while ensuring compliance and security.”</p><figcaption class="blockquote__byline"></figcaption></blockquote></div><p class="paragraph" style="text-align:left;">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.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="where-it-is-today-from-i-tapp-to-cl">Where It Is Today: From ITapp to Cloud Management to Cloud Accelerate</h3><p class="paragraph" style="text-align:left;">ITapp’s DNA lives on in <a class="link" href="https://www.servicenow.com/products/cloud-management.html?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-startup-to-servicenow-the-story-of-itapp" target="_blank" rel="noopener noreferrer nofollow"><b>ServiceNow Cloud Management</b></a>, officially launched in <b>May 2017</b>. Over time, the product has evolved, been repackaged, and now sits under <a class="link" href="https://www.servicenow.com/products/cloud-management.html?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-startup-to-servicenow-the-story-of-itapp" target="_blank" rel="noopener noreferrer nofollow"><b>Cloud Accelerate</b></a> as part of the <a class="link" href="https://www.servicenow.com/content/dam/servicenow-assets/public/en-us/doc-type/other-document/entitlements/sn-it-operations-management.pdf?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-startup-to-servicenow-the-story-of-itapp" target="_blank" rel="noopener noreferrer nofollow"><b>AI Ops Enterprise</b></a> offering.</p><p class="paragraph" style="text-align:left;">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.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="what-we-can-learn">What We Can Learn</h3><p class="paragraph" style="text-align:left;">Here are three takeaways for builders and product-minded folks:</p><p class="paragraph" style="text-align:left;"><b>1. Solve real problems, not just trendy ones.</b><br>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.</p><p class="paragraph" style="text-align:left;"><b>2. Deep enterprise experience matters.</b><br>The founding team knew their buyers, their constraints, and how enterprise IT works. That domain knowledge gave them credibility and clarity.</p><p class="paragraph" style="text-align:left;"><b>3. Integration can be more valuable than innovation.</b><br>ServiceNow didn’t need a shiny new product. They needed a way to deliver cloud management faster. ITapp gave them a shortcut.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=44c0e68e-501d-4e2d-b59c-c1d136a705ea&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>From Consulant to Catalyst - Intreis and the GRC Shift at ServiceNow</title>
  <description>ServiceNow acquired Intreis to build out their GRC products in 2015.  Kristopher Markham and Morgan Hunter were two key people in this acquisition.  Here I dive into who and how this happened.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/fc99d033-97be-4198-b919-8616cfe967fd/Interis.png" length="328185" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow</guid>
  <pubDate>Mon, 28 Apr 2025 12:45:00 +0000</pubDate>
  <atom:published>2025-04-28T12:45:00Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Acquisitions]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">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 <a class="link" href="https://www.servicenow.com/community/developer-articles/from-the-archives-2013-member-of-the-month/ta-p/2306880?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow" target="_blank" rel="noopener noreferrer nofollow">October 2013 - Member of the Month</a> was a proud moment!)</p><p class="paragraph" style="text-align:left;">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 <b>Intreis</b> - and their work helped shape ServiceNow&#39;s entire GRC offering.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p><h2 class="heading" style="text-align:left;" id="kristopher-markham-and-morgan-hunte">Kristopher Markham and Morgan Hunter</h2><p class="paragraph" style="text-align:left;">Every great company starts with a couple of people who see things differently. In the case of Intreis this was <a class="link" href="https://www.linkedin.com/in/kristopher-markham-3b8bab7/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow" target="_blank" rel="noopener noreferrer nofollow">Kristopher Markham</a> and <a class="link" href="https://www.linkedin.com/in/morgan-hunter-35a905/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow" target="_blank" rel="noopener noreferrer nofollow">Morgan Hunter</a>. </p><p class="paragraph" style="text-align:left;">Kristopher had deep technical knowledge of ServiceNow, and Morgan brought real world experience from her time at Kantar IT Partnership. </p><p class="paragraph" style="text-align:left;">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. <a class="link" href="https://web.archive.org/web/20131031170220/http://intreis.com/about/company/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow" target="_blank" rel="noopener noreferrer nofollow">Intreis (wayback link)</a> 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.</p><h2 class="heading" style="text-align:left;" id="what-did-intreis-do">What did Intreis do?</h2><p class="paragraph" style="text-align:left;">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.</p><h2 class="heading" style="text-align:left;" id="the-acquistion">The Acquistion</h2><p class="paragraph" style="text-align:left;">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.</p><h2 class="heading" style="text-align:left;" id="the-legacy">The Legacy</h2><p class="paragraph" style="text-align:left;">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.</p><h2 class="heading" style="text-align:left;" id="what-im-taking-from-this">What I’m taking from This</h2><p class="paragraph" style="text-align:left;"><b>Make compliance work for the business</b> - Intreis didn’t build a tool. They solved a real problem by embedding compliance into existing workflows. This was <i>essential</i> to operational effectiveness.</p><p class="paragraph" style="text-align:left;"><b>The power of deep, hands-on experience </b>- Kristopher and Morgan’s time at <b>Fruition Partners</b> and <b>Kantar IT</b> 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.</p><p class="paragraph" style="text-align:left;"><b>Entrepreneurship never stops </b>- Even after their time with ServiceNow, Kristopher and Morgan continued to innovate by founding new ventures (<a class="link" href="https://www.serenityehs.com/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow" target="_blank" rel="noopener noreferrer nofollow">Serentiy EHS</a>, and <a class="link" href="https://www.medusaas.org/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=from-consulant-to-catalyst-intreis-and-the-grc-shift-at-servicenow" target="_blank" rel="noopener noreferrer nofollow">Medusaas</a>). Their journey is a reminder that the spirit of entrepreneurship is about continual growth and the pursuit of new opportunities.</p><p class="paragraph" style="text-align:left;"></p><p class="paragraph" style="text-align:left;"></p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=e6ea3b4e-b6ed-4a90-97df-c2c14d7fa5bf&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>2024 VPS host pricing</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/854e0857-9632-4392-ad74-36316738de66/vps-pricing-2024.png" length="936991" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/2024-vps-host-pricing</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/2024-vps-host-pricing</guid>
  <pubDate>Mon, 09 Dec 2024 06:00:00 +0000</pubDate>
  <atom:published>2024-12-09T06:00:00Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Web Hosting]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">Virtual Private Servers.... There&#39;s a little bit to know here. I was trying to find a good comparison site. Didn&#39;t see one so thought I&#39;d toss my notes up here. These prices were as of December, 2024.</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Not all hosts are the same.</p></li><li><p class="paragraph" style="text-align:left;">Shared vCPU = Allowing multiple customers to compete for the same vCPU</p></li><li><p class="paragraph" style="text-align:left;">Dedicated vCPU = No one else can have it</p></li><li><p class="paragraph" style="text-align:left;">vCPU = # processors ✖️ ( # cores ✖️ # of threads ). E.g. my home computer has 1 processor with 8 cores, and 8 threads. = 64vCPU</p></li></ol><p class="paragraph" style="text-align:left;">Let&#39;s start making some notes....</p><h3 class="heading" style="text-align:left;" id="best-value-shared-hosting-1-v-cpu-1">🧩 <b>Best Value Shared Hosting (1 vCPU / 1GB RAM)</b></h3><div class="blockquote"><blockquote class="blockquote__quote"><p class="paragraph" style="text-align:left;">🥇 <a class="link" href="https://www.ionos.com/servers/vps?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>IONOS</b></a> — $2/mo<br>🥈 <a class="link" href="https://my.cloudfanatic.net/aff.php?aff=824&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>CloudFanatic</b></a> — $3/mo<br>🥉 <a class="link" href="https://www.vultr.com/?ref=9654045&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>Vultr</b></a> / <a class="link" href="https://www.linode.com/pricing/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing#compute-shared" target="_blank" rel="noopener noreferrer nofollow"><b>Linode</b></a> — $5/mo<br>🏷️ <b>Honorable Mention:</b> <a class="link" href="https://www.digitalocean.com/pricing/droplets?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing#basic-droplets" target="_blank" rel="noopener noreferrer nofollow">DigitalOcean</a> / <a class="link" href="https://www.dreamhost.com/hosting/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow">DreamHost</a> / <a class="link" href="https://fly.io/calculator?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow">fly.io</a> — $6/mo</p><figcaption class="blockquote__byline"></figcaption></blockquote></div><hr class="content_break"><h3 class="heading" style="text-align:left;" id="best-value-shared-hosting-4-v-cpu-8">🧩 <b>Best Value Shared Hosting (4 vCPU / 8GB RAM)</b></h3><div class="blockquote"><blockquote class="blockquote__quote"><p class="paragraph" style="text-align:left;">🥇 <a class="link" href="https://hetzner.cloud/?ref=7RFderAwf8qG&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>Hetzner</b></a> — $8/mo<br>🥈 <a class="link" href="https://my.cloudfanatic.net/aff.php?aff=824&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>CloudFanatic</b></a> — $18/mo<br>🥉 <a class="link" href="https://www.ionos.com/servers/vps?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>IONOS</b></a> — $10/mo<br>💸 Others: <a class="link" href="https://www.vultr.com/?ref=9654045&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow">Vultr</a> ($40), <a class="link" href="https://www.linode.com/pricing/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing#compute-shared" target="_blank" rel="noopener noreferrer nofollow">Linode</a>/<a class="link" href="https://www.digitalocean.com/pricing/droplets?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing#basic-droplets" target="_blank" rel="noopener noreferrer nofollow">DO</a>/<a class="link" href="https://www.dreamhost.com/hosting/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow">DreamHost</a> ($48), <a class="link" href="https://fly.io/calculator?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow">fly.io</a> ($42)</p><figcaption class="blockquote__byline"></figcaption></blockquote></div><hr class="content_break"><h3 class="heading" style="text-align:left;" id="best-value-dedicated-hosting-4-v-cp">🖥️ <b>Best Value Dedicated Hosting (4 vCPU / 8GB RAM)</b></h3><div class="blockquote"><blockquote class="blockquote__quote"><p class="paragraph" style="text-align:left;">🥇 <a class="link" href="https://hetzner.cloud/?ref=7RFderAwf8qG&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>Hetzner</b></a> — $27/mo<br>🥈 <a class="link" href="https://www.ionos.com/servers/vps?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>IONOS</b></a> — $60/mo<br>🥉 <a class="link" href="https://www.linode.com/pricing/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing#compute-shared" target="_blank" rel="noopener noreferrer nofollow"><b>Linode</b></a> — $72/mo<br>💸 Others: <a class="link" href="https://www.vultr.com/?ref=9654045&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow">Vultr</a> ($80), <a class="link" href="https://www.digitalocean.com/pricing/droplets?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing#basic-droplets" target="_blank" rel="noopener noreferrer nofollow">DO</a> ($84), Hostgator ($93), <a class="link" href="https://fly.io/calculator?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow">fly.io</a> ($124)</p><figcaption class="blockquote__byline"></figcaption></blockquote></div><hr class="content_break"><h3 class="heading" style="text-align:left;" id="best-value-bare-metal">🏗️ <b>Best Value Bare Metal</b></h3><div class="blockquote"><blockquote class="blockquote__quote"><p class="paragraph" style="text-align:left;">🥇 <a class="link" href="https://hetzner.cloud/?ref=7RFderAwf8qG&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>Hetzner</b></a><b> (6c/12t/72vCPU, 64GB)</b> — $42/mo<br>🥈 <a class="link" href="https://www.vultr.com/?ref=9654045&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>Vultr</b></a><b> (4c/8t/64vCPU, 32GB)</b> — $120/mo<br>⚠️ Most others: N/A or not listed</p><figcaption class="blockquote__byline"></figcaption></blockquote></div><hr class="content_break"><h3 class="heading" style="text-align:left;" id="best-value-gpu-hosting">🎮 <b>Best Value GPU Hosting</b></h3><div class="blockquote"><blockquote class="blockquote__quote"><p class="paragraph" style="text-align:left;">🥇 <a class="link" href="https://www.vultr.com/?ref=9654045&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>Vultr</b></a><b> A16 (1/8 GPU, 2GB VRAM, 8GB RAM)</b> — $44/mo<br>🥈 <a class="link" href="https://hetzner.cloud/?ref=7RFderAwf8qG&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>Hetzner</b></a><b> i5 + RTX4000 (64GB)</b> — $205/mo*<br>🥉 <a class="link" href="https://www.vultr.com/?ref=9654045&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow"><b>Vultr</b></a><b> A100 (1/8 GPU, 4GB VRAM, 15GB RAM)</b> — $254/mo<br>💸 Big spenders: <a class="link" href="https://www.vultr.com/?ref=9654045&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow">Vultr</a> A100 full — $1783/mo, <a class="link" href="https://fly.io/calculator?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing" target="_blank" rel="noopener noreferrer nofollow">fly.io</a> — $2604/mo, <a class="link" href="https://www.digitalocean.com/pricing/droplets?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=2024-vps-host-pricing#basic-droplets" target="_blank" rel="noopener noreferrer nofollow">DO</a> H100 — $2522/mo</p><figcaption class="blockquote__byline"></figcaption></blockquote></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=7681f5f2-edc8-4a1d-80d7-89e731239e1c&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Neebula - Startup to Acquisition</title>
  <description>Discover the story of Neebula Systems, a startup that redefined IT service modeling and was acquired by ServiceNow for 20x its investment. Learn how ServiceWatch became a foundation of modern CMDB strategy, and the key lessons in timing, execution, and building for real-world impact. Ideal for founders, IT pros, and anyone interested in strategic M&amp;A and enterprise software success.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f36f84d8-4c90-4fc5-aec1-c15a018dfde8/Neebula_-_Startup_to_Acquisition__1_.png" length="365845" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/neebula-startup-to-acquisition</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/neebula-startup-to-acquisition</guid>
  <pubDate>Mon, 21 Apr 2025 12:32:00 +0000</pubDate>
  <atom:published>2025-04-21T12:32:00Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Acquisitions]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;"><b>The Story of Neebula: From Startup to Strategic Acquisition</b></p><p class="paragraph" style="text-align:left;">This week, I’ve been looking into the story of <a class="link" href="https://en.globes.co.il/en/article-servicenow-acquires-neebula-systems-for-100m-1000953148?utm_source=jace.pro&utm_medium=referral&utm_campaign=servicenow-keeps-buying-things" target="_blank" rel="noopener noreferrer nofollow">Neebula Systems</a>, a company founded by <a class="link" href="https://www.linkedin.com/in/yuval-cohen-55b89/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=neebula-startup-to-acquisition" target="_blank" rel="noopener noreferrer nofollow">Yuval Cohen</a>, <a class="link" href="https://www.linkedin.com/in/arielgordon/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=neebula-startup-to-acquisition" target="_blank" rel="noopener noreferrer nofollow">Ariel Gordon</a>, and <a class="link" href="https://www.linkedin.com/in/shaimo/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=neebula-startup-to-acquisition" target="_blank" rel="noopener noreferrer nofollow">Shai Mohaban</a>. 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?</p><p class="paragraph" style="text-align:left;">They called their product <a class="link" href="https://www.servicenow.com/community/itom-forum/service-watch/m-p/1043587?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=neebula-startup-to-acquisition" target="_blank" rel="noopener noreferrer nofollow"><b>ServiceWatch</b></a>, 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.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">Some tools fade after acquisition. Others become part of the foundation.<br>The difference? Execution, timing, and a willingness to keep going.</p><hr class="content_break"><p class="paragraph" style="text-align:left;"><b>Stuff I’m Taking From This</b></p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Be early, but useful</b><br>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.</p></li><li><p class="paragraph" style="text-align:left;"><b>Your users are your leverage</b><br>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.</p></li><li><p class="paragraph" style="text-align:left;"><b>M&A isn&#39;t the end—it&#39;s a fork</b><br>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.</p></li></ol><hr class="content_break"><p class="paragraph" style="text-align:left;">If you&#39;re building something in that same spirit. Early, useful, and bold. I’d love to swap notes.<br><a class="link" href="https://meetings.hubspot.com/jace-benson?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=neebula-startup-to-acquisition" target="_blank" rel="noopener noreferrer nofollow">https://meetings.hubspot.com/jace-benson</a></p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=1e433523-ce72-4c84-a026-23e7d3bd7f1f&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>The 9-Year Overnight Success: Mirror42&#39;s Path to Enterprise Mastery</title>
  <description>Discover the inspiring journey of Mirror42, from a bootstrapped BI startup to a strategic ServiceNow acquisition - a testament to innovation and perseverance in enterprise tech.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/17e7ad33-779f-47c6-9ab6-4db0b703e36d/Screenshot_2025-04-15_015854.png" length="330438" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/the-9-year-overnight-success-mirror42-s-path-to-enterprise-mastery</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/the-9-year-overnight-success-mirror42-s-path-to-enterprise-mastery</guid>
  <pubDate>Tue, 15 Apr 2025 13:07:00 +0000</pubDate>
  <atom:published>2025-04-15T13:07:00Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Performance Analytics]]></category>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Acquisitions]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><h3 class="heading" style="text-align:left;" id="the-midnight-distraction">The Midnight Distraction</h3><p class="paragraph" style="text-align:left;">It’s 1:33 AM. I should be fixing a bug, but here I am writing this post again.</p><p class="paragraph" style="text-align:left;">I got sidetracked reading an old ServiceNow press release from 2013.<br><b>&quot;</b><a class="link" href="https://www.dailyhostnews.com/servicenow-acquires-mirror42-announces-new-servicenow-performance-analytics-product?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=the-9-year-overnight-success-mirror42-s-path-to-enterprise-mastery" target="_blank" rel="noopener noreferrer nofollow"><b>ServiceNow acquires Mirror42 to power Performance Analytics.</b></a><b>&quot;</b><br>I remember Mirror42, kind of. But I never really knew the story behind it.</p><p class="paragraph" style="text-align:left;">Turns out, it wasn’t just some BI tool that got scooped up and forgotten.<br><a class="link" href="https://www.linkedin.com/in/karelvanderpoel/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=the-9-year-overnight-success-mirror42-s-path-to-enterprise-mastery" target="_blank" rel="noopener noreferrer nofollow">Karel van der Poel</a> built it from scratch, sold it, and <i>stuck around</i>. And then made it even bigger. Also, he has a <a class="link" href="https://www.youtube.com/watch?v=pAQHnVXVxB0&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=the-9-year-overnight-success-mirror42-s-path-to-enterprise-mastery" target="_blank" rel="noopener noreferrer nofollow">YouTube video about this he made 12 years ago</a> (5 minutes).</p><p class="paragraph" style="text-align:left;">That hit me.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="phase-1-just-survive-20042008">Phase 1: Just Survive (2004–2008)</h3><p class="paragraph" style="text-align:left;">Back then, Mirror42 was an on-prem BI tool. No funding. No fluff. Just solving a problem for real customers.<br>By 2008, they were profitable.</p><p class="paragraph" style="text-align:left;">Karel wasn’t trying to go viral. He was trying to stay alive.<br>And that worked.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="phase-2-betting-on-the-cloud-200820">Phase 2: Betting on the Cloud (2008–2010)</h3><p class="paragraph" style="text-align:left;">In 2010, the cloud was still weird to a lot of people. Karel rewrote the whole stack to support it anyway.<br>He didn’t chase the trend. He saw what was coming.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="phase-3-building-with-community-200">Phase 3: Building with Community (2008–2013)</h3><p class="paragraph" style="text-align:left;">While scaling the company, Karel launched something wild.<br><b>KPI Library.</b><br>A shared space where 400,000 people added 6,000+ metric templates.</p><p class="paragraph" style="text-align:left;">He basically open-sourced strategy. That move built trust, reach, and a moat.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="after-the-acquisition">After the Acquisition</h3><p class="paragraph" style="text-align:left;">ServiceNow bought Mirror42 for $13M.</p><p class="paragraph" style="text-align:left;">Most people would walk away.</p><p class="paragraph" style="text-align:left;">Karel didn’t.<br>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.</p><p class="paragraph" style="text-align:left;">He didn’t stop at the finish line. He treated it like the start of the next thing.</p><hr class="content_break"><h3 class="heading" style="text-align:left;" id="stuff-im-taking-from-this">Stuff I’m Taking From This</h3><p class="paragraph" style="text-align:left;"><b>1. Build for deployment, not hype</b><br>Karel made something useful for real teams. He focused on being installable, usable, and flexible.</p><p class="paragraph" style="text-align:left;"><b>2. Community matters</b><br>KPI Library wasn’t flashy, but it created something that lived on.<br>Letting users shape the product made it stronger.</p><p class="paragraph" style="text-align:left;"><b>3. Long games win</b><br>Nine years at Mirror42. Eleven years (and counting) at ServiceNow.<br>That’s what sticking with it looks like.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Not everything needs to go big right away.<br>Sometimes you just need to make something that works, solve a problem, and keep showing up.</p><p class="paragraph" style="text-align:left;">That&#39;s what Karel did.<br>That’s what I want to do too. If you want to know about that, schedule a meeting with me on <a class="link" href="https://getaiinabox.com?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=the-9-year-overnight-success-mirror42-s-path-to-enterprise-mastery" target="_blank" rel="noopener noreferrer nofollow">https://getaiinabox.com</a> </p><p class="paragraph" style="text-align:left;"></p><p class="paragraph" style="text-align:left;">Want to see more, here’s some interesting links.</p><iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="true" class="youtube_embed" frameborder="0" height="100%" src="https://youtube.com/embed/he4KoSZYlXU" width="100%"></iframe><iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="true" class="youtube_embed" frameborder="0" height="100%" src="https://youtube.com/embed/auUAuqTRRhc" width="100%"></iframe></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=1cc3f5f5-e3fb-4d33-9640-75851afb4f6c&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Rails, sqlite, Hetzner, Kamal2</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c43da7d2-b33c-4d64-895f-e96e007b035e/Deploy_a_Rails_8_app.png" length="1064800" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/hetzner-rails-kamal2</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/hetzner-rails-kamal2</guid>
  <pubDate>Sat, 05 Apr 2025 04:35:00 +0000</pubDate>
  <atom:published>2025-04-05T04:35:00Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Web Hosting]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="blockquote"><blockquote class="blockquote__quote"><p class="paragraph" style="text-align:left;">This is a work in progress and isn’t complete.</p><figcaption class="blockquote__byline"> Jace </figcaption></blockquote></div><h2 class="heading" style="text-align:left;">Table of Contents</h2><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="#1-getting-started" rel="noopener noreferrer nofollow">1. Getting Started</a></p><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="#11-installing-ruby-on-rails" rel="noopener noreferrer nofollow">1.1. Installing Ruby on Rails</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#12-setting-up-your-rails-app" rel="noopener noreferrer nofollow">1.2 Setting up your Rails app</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#13-creating-a-home-page" rel="noopener noreferrer nofollow">1.3. Creating a home page</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#14-cleaning-up-the-application-styl" rel="noopener noreferrer nofollow">1.4. Cleaning up the application styles</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#15-replacing-the-home-page-content" rel="noopener noreferrer nofollow">1.5. Replacing the Home page content</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#16-setting-up-user-login-with-devis" rel="noopener noreferrer nofollow">1.6. Setting up User Login with Devise</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#17-making-the-navbar-stick-to-the-t" rel="noopener noreferrer nofollow">1.7. Making the Navbar stick to the top</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#18-adding-a-dashboard-after-login" rel="noopener noreferrer nofollow">1.8. Adding a dashboard after login</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#19-hiding-login-and-register-for-lo" rel="noopener noreferrer nofollow">1.9. Hiding Login and Register for logged in users</a></p></li></ul></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#2-deploying" rel="noopener noreferrer nofollow">2. Deploying</a></p><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="#21-getting-the-things-ready" rel="noopener noreferrer nofollow">2.1. Getting the things ready</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#deployyml-setting-the-things-up" rel="noopener noreferrer nofollow">deploy.yml - setting the things up</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#installing-kamal" rel="noopener noreferrer nofollow">Installing Kamal</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#configuring-the-deployyml" rel="noopener noreferrer nofollow">Configuring the deploy.yml</a></p><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="#service" rel="noopener noreferrer nofollow">service</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#image" rel="noopener noreferrer nofollow">image</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#servers" rel="noopener noreferrer nofollow">servers</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#proxy" rel="noopener noreferrer nofollow">proxy</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#registry" rel="noopener noreferrer nofollow">registry</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#env" rel="noopener noreferrer nofollow">env</a></p></li></ul></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#setting-up-env" rel="noopener noreferrer nofollow">Setting up .env</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#running-kamal-setup" rel="noopener noreferrer nofollow">Running kamal setup</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#setting-up-a-path-for-sqlite" rel="noopener noreferrer nofollow">Setting up a path for sqlite</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#testing-over-http-on-the-ip-address" rel="noopener noreferrer nofollow">Testing over http on the ip address</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#adding-a-domain-and-ssl" rel="noopener noreferrer nofollow">Adding a domain and SSL</a></p></li></ul></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="#useful-resources" rel="noopener noreferrer nofollow">Useful resources</a></p></li></ul><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">Let’s get into it.</p><h2 class="heading" style="text-align:left;" id="1-getting-started">1. Getting Started</h2><p class="paragraph" style="text-align:left;">I started the <a class="link" href="https://guides.rubyonrails.org/getting_started.html?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">Getting Started tutorial</a> 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.</p><h3 class="heading" style="text-align:left;" id="11-installing-ruby-on-rails">1.1. Installing Ruby on Rails</h3><p class="paragraph" style="text-align:left;"><a class="link" href="https://guides.rubyonrails.org/install_ruby_on_rails.html?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">They have a page here</a>, for my set up (building on Windows) Here’s my notes.</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Install WSL for Ubuntu</p><p class="paragraph" style="text-align:left;"><code>wsl --install --distribution Ubuntu-24.04</code></p></li><li><p class="paragraph" style="text-align:left;">Open it up, create a user, and password you will remember.</p></li><li><p class="paragraph" style="text-align:left;">Install a few things</p></li></ol><div class="codeblock"><pre><code># install the packages needed
sudo apt install build-essential rustc libssl-dev
sudo apt install libyaml-dev zlib1g-dev libgmp-dev

# get mise to install ruby on rails 3
curl https://mise.run | sh
echo &#39;eval &quot;$(~/.local/bin/mise activate bash)&quot;&#39; &gt;&gt; ~/.bashrc
source ~/.bashrc

# install ruby
mise use -g ruby@3

# verify ruby
ruby --version

# install rails
gem install rails

# verify rails
rails --version</code></pre></div><h3 class="heading" style="text-align:left;" id="12-setting-up-your-rails-app">1.2 Setting up your Rails app</h3><p class="paragraph" style="text-align:left;">You should be on your terminal in WSL. </p><p class="paragraph" style="text-align:left;">Let’s make a new project we’ll call it <code>rubystore</code> with Tailwind.</p><div class="codeblock"><pre><code>rails new rubystore -c tailwind
# this will build the project out
cd rubystore
code . #open in vs code</code></pre></div><p class="paragraph" style="text-align:left;">I press the <code>ctrl+`</code> to open the terminal in the editor. </p><h3 class="heading" style="text-align:left;" id="13-creating-a-home-page">1.3. Creating a home page</h3><p class="paragraph" style="text-align:left;">Now let’s set up the controller</p><div class="codeblock"><pre><code>rails g controller pages home</code></pre></div><p class="paragraph" style="text-align:left;">You’ll want to edit the <code>config/routes.rb</code> file to match this.</p><div class="codeblock"><pre><code>Rails.application.routes.draw do
  # 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; =&gt; &quot;rails/health#show&quot;, as: :rails_health_check

  # Render dynamic PWA files from app/views/pwa/* (remember to link manifest in application.html.erb)
  # get &quot;manifest&quot; =&gt; &quot;rails/pwa#manifest&quot;, as: :pwa_manifest
  # get &quot;service-worker&quot; =&gt; &quot;rails/pwa#service_worker&quot;, as: :pwa_service_worker

  # Defines the root path route (&quot;/&quot;)
  root &quot;pages#home&quot;
end</code></pre></div><p class="paragraph" style="text-align:left;">At anytime you can test this by running <code>bin/dev</code>. Let’s do that and ensure you get the page was generated page.</p><h3 class="heading" style="text-align:left;" id="14-cleaning-up-the-application-styl">1.4. Cleaning up the application styles</h3><p class="paragraph" style="text-align:left;">Open the <code>/views/layouts/application.html.erb</code> and let’s remove the classes on the <code>&lt;main&gt;</code> element.</p><h3 class="heading" style="text-align:left;" id="15-replacing-the-home-page-content">1.5. Replacing the Home page content</h3><p class="paragraph" style="text-align:left;">Open the <code>/views/pages/home.html.erb</code>, 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 <a class="link" href="https://www.creative-tim.com/twcomponents/component/tailwind-landing-page?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">Landing Page by zoltanszogyenyi</a>. </p><p class="paragraph" style="text-align:left;">Copy the code and past it in that file. Run you server and check it out.</p><h3 class="heading" style="text-align:left;" id="16-setting-up-user-login-with-devis">1.6. Setting up User Login with Devise</h3><p class="paragraph" style="text-align:left;">On the terminal add the devise and tailwind devise gems, and the user model and migrate that to the database.</p><div class="codeblock"><pre><code>bundle add devise tailwind_devise
rails g devise:install
rails g tailwind_devise:views
rails g devise User
rails db:migrate</code></pre></div><p class="paragraph" style="text-align:left;">Open the <code>/views/pages/home.html.erb</code> and find the register and login links.</p><p class="paragraph" style="text-align:left;">Update them with the following.</p><p class="paragraph" style="text-align:left;">Login link should use the following <code>hrefs</code> </p><div class="codeblock"><pre><code>&lt;a href=&quot;&lt;%= new_user_registration_path %&gt;&quot;&gt;Register&lt;/a&gt;
&lt;a href=&quot;&lt;%= new_user_session_path %&gt;&quot;&gt;Login&lt;/a&gt;</code></pre></div><h3 class="heading" style="text-align:left;" id="17-making-the-navbar-stick-to-the-t">1.7. Making the Navbar stick to the top</h3><p class="paragraph" style="text-align:left;">First let’s edit the <code>/views/layouts/application.html.erb</code> by adding this in in the body tag.</p><div class="codeblock"><pre><code>&lt;%= render &quot;layouts/navbar&quot; %&gt;</code></pre></div><p class="paragraph" style="text-align:left;">Find the header html content and cut it from the <code>/views/pages/home.html.erb</code>, and paste it into a new partial file <code>/views/layouts/_navbar.html.erb</code> </p><p class="paragraph" style="text-align:left;">You can test this out by registering. You won’t notice anything different after logging in. Let’s fix that.</p><h3 class="heading" style="text-align:left;" id="18-adding-a-dashboard-after-login">1.8. Adding a dashboard after login</h3><p class="paragraph" style="text-align:left;">We’re going to create a new controller definition in <code>/controllers/pages_controller.rb</code> It should look like this.</p><div class="codeblock"><pre><code>class PagesController &lt; ApplicationController
  def home
  end

  def dashboard
  end
end</code></pre></div><p class="paragraph" style="text-align:left;"> We need to now tell the routes to handle authenticated users by adding this authenticated logic.</p><div class="codeblock"><pre><code>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; =&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</code></pre></div><p class="paragraph" style="text-align:left;">Lastly, before you can test this, you’ll need a dashboard page. Create one at <code>/views/pages/dashboard.html.erb</code>. Like before find a tailwind component that makes sense. I’m using <a class="link" href="https://www.creative-tim.com/twcomponents/component/dashboard-example?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">Dark Dashboard Example by pantazisoftware</a>.</p><p class="paragraph" style="text-align:left;">Okay now the login and register loads and lands on the dashboard. </p><h3 class="heading" style="text-align:left;" id="19-hiding-login-and-register-for-lo">1.9. Hiding Login and Register for logged in users</h3><p class="paragraph" style="text-align:left;">Edit the <code>/views/layouts/_navbar.html.erb</code> partial.</p><p class="paragraph" style="text-align:left;">We’re going to wrap those links we modified above with this snippet.</p><div class="codeblock"><pre><code>&lt;% if current_user %&gt;
    &lt;a
        href=&quot;&lt;%= destroy_user_session_path %&gt;&quot; 
        data-turbo-method=&quot;delete&quot;
        class=&quot;...&quot;&gt;
        Log out
    &lt;/a&gt;
&lt;% else %&gt;
    &lt;!--your links here--&gt;
&lt;% end %</code></pre></div><p class="paragraph" style="text-align:left;">Now that it’s all set up. Try it out and when you&#39;re ready let’s deploy it.</p><h2 class="heading" style="text-align:left;" id="2-deploying">2. Deploying</h2><h3 class="heading" style="text-align:left;" id="21-getting-the-things-ready">2.1. Getting the things ready</h3><p class="paragraph" style="text-align:left;">You’ll need a few things to get started here.</p><ol start="1"><li><p class="paragraph" style="text-align:left;">A docker registry (I’m using <a class="link" href="http://hub.docker.com?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">hub.docker.com</a>) with an <a class="link" href="https://app.docker.com/settings/personal-access-tokens?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">access token</a></p></li><li><p class="paragraph" style="text-align:left;">A <a class="link" href="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=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">SSH Key</a></p></li><li><p class="paragraph" style="text-align:left;">A server (I’m using <a class="link" href="https://console.hetzner.cloud/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">Hetzner</a>) with a SSH Key</p></li><li><p class="paragraph" style="text-align:left;">A folder on the server where we’ll store our sqlite and other storage stuff.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://dotenvx.com/docs/install?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">dovenvx</a> to allow us to set up the secrets and environment variables easily.</p></li></ol><h3 class="heading" style="text-align:left;" id="deployyml-setting-the-things-up">deploy.yml - setting the things up</h3><p class="paragraph" style="text-align:left;">There’s a lot in this file, I’m just going to paste my uncommented version, you can read more on it on <a class="link" href="https://kamal-deploy.org/docs/configuration/overview/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">the official Kamal Configuration page</a>.</p><p class="paragraph" style="text-align:left;"></p><p class="paragraph" style="text-align:left;"></p><h3 class="heading" style="text-align:left;" id="installing-kamal">Installing Kamal</h3><p class="paragraph" style="text-align:left;">On the terminal install kamal, then initialize it for the current project.</p><div class="codeblock"><pre><code>gem install kamal
kamal init # this may throw a message that Config already exists
# that&#39;s okay.</code></pre></div><h3 class="heading" style="text-align:left;" id="configuring-the-deployyml">Configuring the deploy.yml</h3><p class="paragraph" style="text-align:left;">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.</p><h4 class="heading" style="text-align:left;" id="service">service</h4><p class="paragraph" style="text-align:left;">The service is the name of your application. I’m going to just call mine rubystore</p><h4 class="heading" style="text-align:left;" id="image">image</h4><p class="paragraph" style="text-align:left;">This is the docker image. You’ll need a docker registry to do this. I’m using dockerhub. You’ll need to <a class="link" href="https://app.docker.com/settings/personal-access-tokens?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">create an access token on docker hub</a>. Make sure it has <b>read</b> and <b>write</b> 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 <code>.env</code> file (create it if it doesn’t exist). You should have something like this</p><div class="codeblock"><pre><code>KAMAL_REGISTRY_PASSWORD=your_key_goeshere12345</code></pre></div><h4 class="heading" style="text-align:left;" id="servers">servers</h4><p class="paragraph" style="text-align:left;">Here we need the IP address of the server we’re going to deploy to. Spin up a machine on <a class="link" href="https://console.hetzner.cloud/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">Hetzner</a> that is running Ubuntu and at least 1 GB of ram. Copy that IP address here.</p><h4 class="heading" style="text-align:left;" id="proxy">proxy</h4><p class="paragraph" style="text-align:left;">Initially we’re going to skip this so comment this block out. You can do that by prepending a <code>#</code> for each line here.</p><h4 class="heading" style="text-align:left;" id="registry">registry</h4><p class="paragraph" style="text-align:left;">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.</p><h4 class="heading" style="text-align:left;" id="env">env</h4><p class="paragraph" style="text-align:left;">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 <code>RAILS_MASTER_KEY</code>. To send that the secrets for Ruby is odd to me yet. You’ll need edit the <code>./kamal/secret</code> and add <code>RAILS_MASTER_KEY=$RAILS_MASTER_KEY</code>. I’ll write a little more about this for the kamal commands later.</p><h3 class="heading" style="text-align:left;" id="setting-up-env">Setting up .env</h3><p class="paragraph" style="text-align:left;">Now Kamal needs access to the KAMAL_REGISTRY_PASSWORD and RAILS_MASTER_KEY. Create a <code>.env</code> file and put those in there. Getting your master key is as easy as opening <code>./config/master.key</code>. If you don’t have a file there run <code>rails credientals:edit</code> and then just exit using <code>:q</code>. Now you will have that <code>master.key</code> file.</p><div class="codeblock"><pre><code>KAMAL_REGISTRY_PASSWORD=dckr_pat_asdf
RAILS_MASTER_KEY=asdfasdfasdf</code></pre></div><h3 class="heading" style="text-align:left;" id="running-kamal-setup">Running kamal setup</h3><p class="paragraph" style="text-align:left;">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. </p><p class="paragraph" style="text-align:left;">A note, on windows you need to have docker desktop installed and integrated with the ubuntu wsl you are running. <a class="link" href="https://learn.microsoft.com/en-us/windows/wsl/tutorials/wsl-containers?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">Microsoft WSL Docker page</a> has some instructions on this.</p><div class="codeblock"><pre><code>kamal setup</code></pre></div><p class="paragraph" style="text-align:left;">Sometimes I get an error running this</p><div class="codeblock"><pre><code>  INFO [fd944dda] Running docker login -u [REDACTED] -p [REDACTED] as jace@localhost
  ERROR (SSHKit::Command::Failed): docker exit status: 32000</code></pre></div><p class="paragraph" style="text-align:left;">If you get this, your <code>.env</code> or <code>.kamal/secrets</code> file probably isn’t working properly. I found that I can run <code>kamal secrets print</code> to see what secrets are available to kamal. This is great for debugging. </p><p class="paragraph" style="text-align:left;">I ended up install dotenvx to correct this.</p><div class="codeblock"><pre><code>curl -sfS https://dotenvx.sh | sudo sh</code></pre></div><p class="paragraph" style="text-align:left;">Then updated the secrets file to have this for the KAMAL_REGISTRY_PASSWORD.</p><p class="paragraph" style="text-align:left;"><code>KAMAL_REGISTRY_PASSWORD=$(dotenvx get KAMAL_REGISTRY_PASSWORD --quiet -f .env)</code></p><p class="paragraph" style="text-align:left;">This just worked for me! Sweet. However, when I try to register, I don’t get logged in.</p><h3 class="heading" style="text-align:left;" id="setting-up-a-path-for-sqlite">Setting up a path for sqlite</h3><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.erikminkel.com/2024/01/04/deploy-an-app-kamal-sqlite-activestorage/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">Erik Minkel wrote a piece</a> on how he set’s this up so the sqlite file doesn’t get destroyed on every deploy. </p><p class="paragraph" style="text-align:left;">We’re going to copy his lead. </p><p class="paragraph" style="text-align:left;">To that we need to ssh on the machine and create directories for the database and for storage. We’ll give proper permissions to those folders. We’ll add the volumes into our deploy.yml file.</p><p class="paragraph" style="text-align:left;">We’ll need to ssh onto the server to create the folders</p><div class="codeblock"><pre><code>ssh root@yourserversipaddress
sudo mkdir /db
sudo mkdir /storage
sudo chown 1000:1000 /db /storage</code></pre></div><p class="paragraph" style="text-align:left;">Log off the server and edit the deploy.yml locally by adding</p><div class="codeblock"><pre><code>volumes:
  - &quot;/db:/rails/sqlite&quot;
  - &quot;/storage:/rails/storage&quot;</code></pre></div><p class="paragraph" style="text-align:left;">Now let’s add these changes to git, and redeploy.</p><div class="codeblock"><pre><code>git add .
git commit -m &quot;added volumes&quot;
kamal deploy</code></pre></div><h3 class="heading" style="text-align:left;" id="testing-over-http-on-the-ip-address">Testing over http on the ip address</h3><p class="paragraph" style="text-align:left;">Okay this is not where we want to leave things but I like to test things out.</p><p class="paragraph" style="text-align:left;">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 <code>kamal logs</code> )</p><p class="paragraph" style="text-align:left;">If you search for <code>Processing by Devise::RegistrationsController#create</code> you’ll find <code>ActionController::InvalidAuthenticityToken (HTTP Origin header (http://1.2.3.4) didn&#39;t match request.base_url (https://1.2.3.4))</code></p><p class="paragraph" style="text-align:left;">Okay, let get around that. In the <code>/config/environments/production.rb</code> there’s an <code>config.force_ssh</code> which were going to change to false and a <code>config.assume_ssl</code> which we’ll comment out.</p><p class="paragraph" style="text-align:left;">Do another deploy, and success I’m able to register an account and log in on separate windows.</p><h3 class="heading" style="text-align:left;" id="adding-a-domain-and-ssl">Adding a domain and SSL</h3><p class="paragraph" style="text-align:left;">First part of this is configuring your Domain Name Server to point to your server. </p><p class="paragraph" style="text-align:left;">Then undo what we did before.</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Open <code>/config/environments/production.rb</code></p></li><li><p class="paragraph" style="text-align:left;">Update <code>config.force_ssl</code> to true</p></li><li><p class="paragraph" style="text-align:left;">Uncomment <code>config.assume_ssl</code> </p></li></ol><div class="codeblock"><pre><code>kamal proxy logs
kamal proxy reboot </code></pre></div><h2 class="heading" style="text-align:left;" id="useful-resources">Useful resources</h2><p class="paragraph" style="text-align:left;">I found <a class="link" href="https://www.youtube.com/watch?v=H1ZN_7qBR5M&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">“How To Deploy Rails 7 App With Kamal 2” by Indigo Tech Tutorials</a> the most useful. He’s able to offer help too for a fee on his site, <a class="link" href="https://indigotechtutorials.com/pricing?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank" rel="noopener noreferrer nofollow">Indigo Tech Tutorials</a>.</p><iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="true" class="youtube_embed" frameborder="0" height="100%" src="https://youtube.com/embed/TfortG9QKWU" width="100%"></iframe><div class="embed"><a class="embed__url" href="https://alec-c4.com/posts/2025-04-02-kamal?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=rails-sqlite-hetzner-kamal2" target="_blank"><div class="embed__content"><p class="embed__title"> Kamal Deployment: The Newest Form of Self-Torture | I&#39;m Mary Poppins, y&#39;all! </p><p class="embed__description"> How to configure Kamal and avoid common deployment pitfalls </p><p class="embed__link"> alec-c4.com/posts/2025-04-02-kamal </p></div><img class="embed__image embed__image--right" src="https://alec-c4.com/posts/2025-04-02-kamal/index.png"/></a></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=432a0878-31e4-4293-bc84-fc753720ea55&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Hiding &quot;Discuss&quot; button on ServiceNow</title>
  <description></description>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/hiding-discuss-button-on-servicenow</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/hiding-discuss-button-on-servicenow</guid>
  <pubDate>Mon, 31 Mar 2025 18:47:52 +0000</pubDate>
  <atom:published>2025-03-31T18:47:52Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Core Ui]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">The other day I needed to remove the “Discuss” button. This is an instance wide configuration. </p><p class="paragraph" style="text-align:left;">Thankfully, <a class="link" href="https://www.servicenow.com/community/sysadmin-forum/hide-discuss-button-for-inicidents-form/m-p/2516588?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=hiding-discuss-button-on-servicenow" target="_blank" rel="noopener noreferrer nofollow">others have written about this</a>.</p><p class="paragraph" style="text-align:left;">To do this we will be disabling the “Sidebar” feature. This is in the Application “Omni-Experience Standard Feature Set”, so you’ll need to set that to your application. I would also then create an update set to capture this work.</p><p class="paragraph" style="text-align:left;">Then in the navigation filter, look for “Conversational Interfaces” and “Settings”.</p><p class="paragraph" style="text-align:left;">This screen has it’s on navigation, look for “Sidebar”.</p><p class="paragraph" style="text-align:left;">At the top is a “Activate” toggle, make it not blue, and save your changes.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=5699d218-ebb0-4c13-9be9-79a8717c7dc5&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Hiding &quot;Follow&quot; on tables in ServiceNow</title>
  <description></description>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/hiding-follow-on-tables-in-servicenow</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/hiding-follow-on-tables-in-servicenow</guid>
  <pubDate>Mon, 31 Mar 2025 18:40:02 +0000</pubDate>
  <atom:published>2025-03-31T18:40:02Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Core Ui]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">To remove the “Follow” button, you can do this by disabling the live_feed in the dictionary of the collection record.</p><p class="paragraph" style="text-align:left;">Goto the <code>sys_dictionary</code> table and look for the table where the type is collection.</p><p class="paragraph" style="text-align:left;">Add <code>live_feed=false</code>, if there’s already something there put a comma before this.</p><p class="paragraph" style="text-align:left;">Thanks <a class="link" href="https://www.servicenow.com/community/developer-forum/discuss-and-follow-buttons/td-p/3187907?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=hiding-follow-on-tables-in-servicenow" target="_blank" rel="noopener noreferrer nofollow">Ankur for posting this</a>.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=0deb8d70-0c8e-4e41-bf34-4716342f53b9&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Mobile Development on ServiceNow is different</title>
  <description></description>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/mobile-development-on-servicenow-is-different</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/mobile-development-on-servicenow-is-different</guid>
  <pubDate>Mon, 31 Mar 2025 03:11:50 +0000</pubDate>
  <atom:published>2025-03-31T03:11:50Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Mobile]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><h2 class="heading" style="text-align:left;" id="plugins-needed">Plugins needed</h2><ul><li><p class="paragraph" style="text-align:left;">Mobile Studio (<a class="link" href="https://com.glide.sg.studio?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=mobile-development-on-servicenow-is-different" target="_blank" rel="noopener noreferrer nofollow">com.glide.sg.studio</a>)</p></li><li><p class="paragraph" style="text-align:left;">Geolocation (com.snc.geolocation)</p></li><li><p class="paragraph" style="text-align:left;">Service Management Geolocation (com.snc.serivce_management.geolocation)</p></li><li><p class="paragraph" style="text-align:left;">Service Management Geolocation Mobile (com.snc.serivce_management_m)</p></li><li><p class="paragraph" style="text-align:left;">SG Offline support (<a class="link" href="https://com.glide.sg?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=mobile-development-on-servicenow-is-different" target="_blank" rel="noopener noreferrer nofollow">com.glide.sg</a>.offline)</p></li><li><p class="paragraph" style="text-align:left;">ServiceNow NowMobile App Screens and Applet Launcher (<a class="link" href="https://com.glide.mobile?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=mobile-development-on-servicenow-is-different" target="_blank" rel="noopener noreferrer nofollow">com.glide.mobile</a>-employee)</p></li></ul><p class="paragraph" style="text-align:left;">for mobile onboarding only</p><ul><li><p class="paragraph" style="text-align:left;">Human Resources Scoped App (<a class="link" href="https://com.sn?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=mobile-development-on-servicenow-is-different" target="_blank" rel="noopener noreferrer nofollow">com.sn</a>_hr_lifecycle_events)</p></li></ul><h2 class="heading" style="text-align:left;" id="licensing-considerations">Licensing Considerations</h2><p class="paragraph" style="text-align:left;">Accessing Custom Tables may not be available in &quot;Data Items&quot; due to customer entitlements. A change the property, <code>subscription.custom_table.enforce_entitlement</code> The value needs to be set to false</p><h2 class="heading" style="text-align:left;" id="definitions">Definitions</h2><div style="padding:14px 15px 14px;"><table class="bh__table" width="100%" style="border-collapse:collapse;"><tr class="bh__table_row"><th class="bh__table_header" width="50%"><p class="paragraph" style="text-align:left;">Term</p></th><th class="bh__table_header" width="50%"><p class="paragraph" style="text-align:left;">Definition</p></th></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Apps</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">physical applications downloaded from the app store for the device on which testing will occur (Now Mobile, Mobile Agent)</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Applications</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">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.</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Launcher Screens</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">a homepage or landing page</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">UI Sections</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">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.</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Navigation Bar</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">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.</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">dynamic menu bar</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">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.</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Screens</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Screens are how the data is configured and displayed within the mobile apps.</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Screen Template</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">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).</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Segment</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">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.</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Item Stream</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">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.</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Data Item</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">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.</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Cards</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Cards define the pattern for the data to be available and how it appears.</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">Functions</p></td><td class="bh__table_cell" width="50%"><p class="paragraph" style="text-align:left;">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.</p></td></tr></table></div><h2 class="heading" style="text-align:left;" id="apps">Apps</h2><ol start="1"><li><p class="paragraph" style="text-align:left;">Mobile Agent - Focused for fulfillers</p></li><li><p class="paragraph" style="text-align:left;">Now Mobile - more for requestors and employees (hr?)</p></li></ol><h2 class="heading" style="text-align:left;" id="hierarchy-of-mobile-development">Hierarchy of Mobile Development</h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/1a5d6386-93d9-4584-86e1-7843d7c3b842/image.png?t=1743390645"/></div><div class="codeblock"><pre><code>
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 --&gt; MobileAppConfig
MobileAppConfig --&gt; NavigationBar
NavigationBar --&gt; NavigationBarTab
NavigationBarTab --&gt; ScreenTab
NavigationBarTab --&gt; LauncherTab
NavigationBarTab --&gt; SavedTab
NavigationBarTab --&gt; NotificationsTab
NavigationBarTab --&gt; SettingsTab
ScreenTab --&gt; Screen
ScreenTab --&gt; Icon
LauncherTab --&gt; LauncherScreen
LauncherTab --&gt; Icon
SavedTab --&gt; Icon
NotificationsTab --&gt; Icon
SettingsTab --&gt; Icon
</code></pre></div><h2 class="heading" style="text-align:left;" id="tables">Tables</h2><div style="padding:14px 15px 14px;"><table class="bh__table" width="100%" style="border-collapse:collapse;"><tr class="bh__table_row"><th class="bh__table_header" width="33%"><p class="paragraph" style="text-align:left;">What</p></th><th class="bh__table_header" width="33%"><p class="paragraph" style="text-align:left;">Table</p></th><th class="bh__table_header" width="33%"><p class="paragraph" style="text-align:left;">Note</p></th></tr><tr class="bh__table_row"><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Mobile App Config</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">sys_sg_native_client</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Define what mobile client, Now Mobile, or Mobile Agent for the app.</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Nagivation Bar</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">sys_sg_nagivation_tab</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">The bottom links</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Tabs can be split into 5 different .. things?</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;"></p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;"></p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Screen Tab, Launcher Tab</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">sys_sg_applet_launcher_tab</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;"></p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Saved Tab, Notification Tab, Settings Tab</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">...</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Every customer has these... not changeable</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Screens</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">sys_sg_screen</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;"></p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Launcher Header</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">sys_sg_applet_launcher_header (access from sys_sg_applet_launcher)</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Add&#39;s custom messages to header</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Launcher Header Function</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">sys_sg_button_instance (access from sys_sg_applet_launcher)</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Defines where user goes when they click on header icons</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Launcher Quick Action</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Not listed (access from sys_sg_applet_launcher)</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">E.g. Create a new record, launch native chat</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Launcher Search Config</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">sys_sg_global_search (access from sys_sg_applet_launcher)</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">Gives ability to search sources from mobile app (Zing for Agent, AI Search or Zing for Now Mobile)</p></td></tr><tr class="bh__table_row"><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">UI Sections</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">sys_sg_section (access from sys_sg_applet_launcher)</p></td><td class="bh__table_cell" width="33%"><p class="paragraph" style="text-align:left;">constols how screens are displayed onlauncher screens, thing order of the itemson the display</p></td></tr></table></div><p class="paragraph" style="text-align:left;">Screens have a bunch of types, liek list, record etc.</p><h2 class="heading" style="text-align:left;" id="launcher-screens">Launcher Screens</h2><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/26956c13-9924-41c6-bcc7-a32873d44791/image.png?t=1743390440"/></div><div class="section" style="background-color:transparent;margin:0.0px 0.0px 0.0px 0.0px;padding:0.0px 0.0px 0.0px 0.0px;"><div class="codeblock"><pre><code>flowchart LR
LauncherScreen[Launcher Screen]
HeaderTitle[Header Title]
HeaderFunction[Header Function]
QuickAction[Quick Action]
SearchConfig[Serach Config]
UISection[UI Section]

Function
Icon

LauncherScreen--&gt;HeaderTitle
LauncherScreen--&gt;HeaderFunction
LauncherScreen--&gt;QuickAction
LauncherScreen--&gt;SearchConfig
LauncherScreen--&gt;UISection


HeaderFunction--&gt;Function
HeaderFunction--&gt;Icon
QuickAction--&gt;Function2[Function]
QuickAction--&gt;Icon2[Icon]
SearchConfig--&gt;EmptyState[Empty State]
SearchConfig--&gt;ListItemConfig[List Item Config]
SearchConfig--&gt;SearchAppConfig[Search App Config]
SearchAppConfig--&gt;SearchSource[Search Source]

UISection--&gt;LegacyIconSection[Legacy Icon Section]
LegacyIconSection--&gt;Screen
UISection--&gt;IconSection[Icon Section]
IconSection--&gt;LauncherScreen2[Launcher Screen]
IconSection--&gt;Screen2[Screen]
IconSection--&gt;Function3[Function]
UISection--&gt;RecordSection[Record Section]
RecordSection--&gt;ListScreen[List Screen]
UISection--&gt;ContentSection[Content Section]
ContentSection--&gt;StreamContainer[Stream Container]
StreamContainer--&gt;Stream
Stream--&gt;DataItem[Data Item]
Stream--&gt;ListItemConfig2[List Item Config]
UISection--&gt;MediaSection[Media Section]
UISection--&gt;AnalyticsSection[AnalyticsSection]
AnalyticsSection--&gt;AnalyticsPreview[Analytics Preview]</code></pre></div></div><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.youtube.com/watch?v=sF-pFb1v73Q&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=mobile-development-on-servicenow-is-different" target="_blank" rel="noopener noreferrer nofollow">Youtube</a></p><h2 class="heading" style="text-align:left;" id="list-screen">List Screen</h2><p class="paragraph" style="text-align:left;">sys_sg_list_screen</p><p class="paragraph" style="text-align:left;">List screens require a screen segment <code>sys_sg_item_stream_segment</code>. When a list has a single segment, you don&#39;t see the segments at the top. Example, &quot;Open&quot; and &quot;Closed&quot; incidents.</p><p class="paragraph" style="text-align:left;">Of course. for stream segments to work you need a stream of data <code>sys_sg_item_stream</code>. You will have streams of Data Items in a consistent format. The stream however doesn&#39;t query the table, it needs a &quot;Data Item&quot; <code>sys_sg_data_itme</code>. This is where you say this table is queried.</p><p class="paragraph" style="text-align:left;">Item Configuration <code>sys_sg_master_item</code> controls how data is displayed on cards. Of course.. the item configuration contains the &quot;Card&quot; sys_sg_view_config. Cards are only built in the Mobile Card Builder, not in anything else.</p><p class="paragraph" style="text-align:left;">Card Templates sys_sg_view_tempate define how the ui elements will be arranged in individual cards. Again only editable in Mobile Card Builder.</p><p class="paragraph" style="text-align:left;">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.</p><h2 class="heading" style="text-align:left;" id="record-screen">Record Screen</h2><p class="paragraph" style="text-align:left;">From the List Screen it will be likely you&#39;ll land on a record screen from a List Item Config. Record Screen is on table sys_sg_form_screen.</p><p class="paragraph" style="text-align:left;">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 <code>sys_sg_form_screen_segment</code></p><p class="paragraph" style="text-align:left;">Some things you might embed are</p><ul><li><p class="paragraph" style="text-align:left;">Detail screen</p></li><li><p class="paragraph" style="text-align:left;">Activity Stream</p></li><li><p class="paragraph" style="text-align:left;">Related List</p></li><li><p class="paragraph" style="text-align:left;">Embedded List</p></li></ul><h2 class="heading" style="text-align:left;" id="domain-seperation">Domain Seperation</h2><p class="paragraph" style="text-align:left;">In Mobile the &quot;Company&quot; or &quot;Account&quot; fields are used to display appropriate records by domain.</p><h2 class="heading" style="text-align:left;" id="mobile-publishing">Mobile Publishing</h2><p class="paragraph" style="text-align:left;">This allows us to change the icon of the app on the iPhone or android, also colors and what note. Mobile Branding is a &quot;For-Fee&quot; service.</p><h2 class="heading" style="text-align:left;" id="compliance">Compliance</h2><p class="paragraph" style="text-align:left;">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.</p><h2 class="heading" style="text-align:left;" id="mobile-card-builder">Mobile Card Builder</h2><p class="paragraph" style="text-align:left;"><a class="link" href="https://youtu.be/JAEACheU9dY?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=mobile-development-on-servicenow-is-different" target="_blank" rel="noopener noreferrer nofollow">https://youtu.be/JAEACheU9dY</a></p><p class="paragraph" style="text-align:left;">There&#39;s a plugin to install.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=c8535115-19dd-431e-86fa-184d1201e60b&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Reading flow&#39;s encrypted and compressed values</title>
  <description></description>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/reading-flow-s-encrypted-and-compressed-values</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/reading-flow-s-encrypted-and-compressed-values</guid>
  <pubDate>Tue, 25 Mar 2025 14:51:43 +0000</pubDate>
  <atom:published>2025-03-25T14:51:43Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
    <category><![CDATA[Flow Designer]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 0px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">The other day, I was on the community slack, and a question popped up about reading the values for flows (flow designer, subflows, etc).</p><p class="paragraph" style="text-align:left;">I was under the impression that the data was all still in the giant sys_variable_value table.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">Anders Figenschow shared a colleague’s solution to decompress and convert form base64 is as follows.</p><div class="codeblock"><pre><code>var sys_id = &#39;&#39;; // just put your sys_hub_action_instance_v2 sys_id here
var gr = new GlideRecord(&#39;sys_hub_action_instance_v2&#39;);
gr.setLimit(1);
gr.addQuery(&#39;sys_id&#39;, sys_id);
gr.query();
if (gr.next()) &#123;
    var compressedData = gr.getValue(&#39;values&#39;);
    gs.info(&quot;Retrieved base64 encoded data from field.&quot;);
    var cs = GlideStringUtil.base64DecodeAsBytes(compressedData);
    var dec = String(GlideCompressionUtil.expandToString(cs));
    gs.info(dec);
&#125;</code></pre></div><p class="paragraph" style="text-align:left;">Now a few notes here.</p><ol start="1"><li><p class="paragraph" style="text-align:left;">What is GlideCompressionUtil? I’ve not heard of this before. </p></li><li><p class="paragraph" style="text-align:left;">Morten from Norway, wrote <a class="link" href="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=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=reading-flow-s-encrypted-and-compressed-values" target="_blank" rel="noopener noreferrer nofollow">this post about doing this same thing</a>.</p></li></ol></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=41ad2130-1103-46f9-962e-c34e018b49e1&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Quirks of db_image, db_video, and db_audio in ServiceNow</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6db682f8-f58f-425f-8e88-55e183453de5/db_image-quicks.png" length="911341" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/db-image-video-audio-quirks</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/db-image-video-audio-quirks</guid>
  <pubDate>Thu, 05 Dec 2024 20:23:04 +0000</pubDate>
  <atom:published>2024-12-05T20:23:04Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 0px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">The db_image, db_video, and db_audio 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.</p><p class="paragraph" style="text-align:left;">For example, files from these tables are served straight from the root domain (e.g., https://support.service-now.com/image.png). 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.</p><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">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.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=1899f081-2459-42cc-a87a-12359d56f57f&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>App Administration VS Delegated Development</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7e29aaae-afcb-4ba0-a679-f6689df50b1d/application-adminstration.png" length="795185" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/app-admin-vs-delegated-dev</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/app-admin-vs-delegated-dev</guid>
  <pubDate>Tue, 03 Dec 2024 06:34:04 +0000</pubDate>
  <atom:published>2024-12-03T06:34:04Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Servicenow]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 0px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">I&#39;m building a solution and as part of this, I&#39;m trying to make a easy to show interactive environment.</p><p class="paragraph" style="text-align:left;">One of the things I was thinking about was setting up Delegated development on my Personal Developer Instance.</p><p class="paragraph" style="text-align:left;">It became apparent to me that I didn&#39;t understand Application Administration compared to Delegated Development, at least not how the <a class="link" href="https://www.servicenow.com/docs/csh?topicname=c_DelegatedDevelopment.html&version=latest&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=app-administration-vs-delegated-development" target="_blank" rel="noopener noreferrer nofollow">docs</a> say.</p><p class="paragraph" style="text-align:left;">If you&#39;re coming across this and want to know the difference, here it is.</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.servicenow.com/docs/csh?topicname=application-administration.html&version=latest&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=app-administration-vs-delegated-development" target="_blank" rel="noopener noreferrer nofollow">Application Administration</a> is the functionality to <b>restrict</b> standard administrators from accessing a scoped application. Think Human Resources Service Delivery. You may not want global admin&#39;s mucking up columns on their tables, business rules, flows, etc.</p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.servicenow.com/docs/csh?topicname=c_DelegatedDevelopment.html&version=latest&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=app-administration-vs-delegated-development" target="_blank" rel="noopener noreferrer nofollow">Delegated Development</a> is the functionality to <b>invite and allow</b> others to build automation within a specific scope.</p></li></ol><p class="paragraph" style="text-align:left;">I want to take a few moment and dive into each a little more as my understanding now, may help me later when.</p><h2 class="heading" style="text-align:left;" id="application-administration">Application Administration</h2><p class="paragraph" style="text-align:left;">This was not what I was looking for before, but let&#39;s talk about it, and how you can set it up.</p><p class="paragraph" style="text-align:left;">You need a scoped application to get this, and then once you look at the scoped application you&#39;ll notice a checkbox next to Application Administration that looks like it&#39;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.</p><p class="paragraph" style="text-align:left;">Here&#39;s a quick and dirty checklist to try it out.</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Create a scoped application</p></li><li><p class="paragraph" style="text-align:left;">Change your current scope to the new scope.</p></li><li><p class="paragraph" style="text-align:left;">Create a role.</p></li><li><p class="paragraph" style="text-align:left;">On the list view of the role, show Application Administrator</p></li><li><p class="paragraph" style="text-align:left;">Set Application Administrator to true</p></li><li><p class="paragraph" style="text-align:left;">Go back to &quot;My company applications&quot; and click the left-side of the tile to open the application&#39;s details.</p></li><li><p class="paragraph" style="text-align:left;">Check the box.</p></li></ol><p class="paragraph" style="text-align:left;">What did this just do? Well, if you don&#39;t have this role, you wont be able to mess with anything inside of that scope.</p><h2 class="heading" style="text-align:left;" id="delegated-development">Delegated Development</h2><p class="paragraph" style="text-align:left;">This <b>was</b> what I was looking for, but after seeing it, I&#39;m not user it&#39;s what I need.</p><p class="paragraph" style="text-align:left;">Let&#39;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&#39;s a quick list of steps to try it out.</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Create a scoped application</p></li><li><p class="paragraph" style="text-align:left;">In the related links you might see &quot;Manage Collaborators&quot; from the App, or in Legacy studio under the file menu, you can see the same.</p></li><li><p class="paragraph" style="text-align:left;">Click on that, a Modal will appear with a invite field, and level.</p><ol start="1"><li><p class="paragraph" style="text-align:left;">So it appears you can pick anyone</p></li><li><p class="paragraph" style="text-align:left;">The level&#39;s are limited to editor and owner. Owner should include all access, and it nearly does. It&#39;s missing the scripting option.</p></li><li><p class="paragraph" style="text-align:left;">Pick a user, or better create a user with no roles, then pick that person.</p></li><li><p class="paragraph" style="text-align:left;">Pick owner</p></li></ol></li><li><p class="paragraph" style="text-align:left;">Once that&#39;s submitted, you&#39;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, App Engine Admins need&#39;s to have some folks in it who can approve these tasks.</p></li><li><p class="paragraph" style="text-align:left;">Start over, at step 3. Welcome back.</p></li><li><p class="paragraph" style="text-align:left;">Now you might be wondering what task did this create? It made a sn_collab_request_dev_collab_task record and an approval against it to the group App Engine Admins.</p></li><li><p class="paragraph" style="text-align:left;">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 &quot;owner&quot; access).</p></li><li><p class="paragraph" style="text-align:left;">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&#39;t edit or create any scripts in those records.</p></li><li><p class="paragraph" style="text-align:left;">Stop impersonating them and go back to where you invited them, that modal. You&#39;ll see they are listed as a collaborator, go ahead and change their access.</p></li><li><p class="paragraph" style="text-align:left;">See the options, there&#39;s a &quot;Allow Scripting&quot; near the bottom.</p></li></ol><h2 class="heading" style="text-align:left;" id="further-reading-and-thoughts">Further Reading and thoughts</h2><p class="paragraph" style="text-align:left;">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.</p><p class="paragraph" style="text-align:left;">If you&#39;d like to read more on this, these are the links I was using to try to understand it.</p><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.servicenow.com/docs/csh?topicname=c_DelegatedDevelopment.html&version=latest&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=app-administration-vs-delegated-development" target="_blank" rel="noopener noreferrer nofollow">Docs: Delegated development and deployment</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.servicenow.com/docs/csh?topicname=application-administration.html&version=latest&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=app-administration-vs-delegated-development" target="_blank" rel="noopener noreferrer nofollow">Docs: Application administration</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.dancovic.com/2024/11/citizen-development-101.html?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=app-administration-vs-delegated-development" target="_blank" rel="noopener noreferrer nofollow">Dan Covic: Citizen Development</a></p></li><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.youtube.com/watch?v=6kAFiX5dtl8&t=2119&utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=app-administration-vs-delegated-development" target="_blank" rel="noopener noreferrer nofollow">Lisa Holenstein, Kiernan McMorrow, and Robert Ninness Platform Academy Video (43 mins)</a></p></li></ul></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=c2b6fa62-5b55-4f5c-814c-f7e395f7f863&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>How to change the MOTD on Ubuntu</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3d843517-63c5-4a10-b3cc-66823178ff36/ubuntu-motd-bg.png" length="709006" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/understanding-updating-motd</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/understanding-updating-motd</guid>
  <pubDate>Sat, 30 Nov 2024 20:22:25 +0000</pubDate>
  <atom:published>2024-11-30T20:22:25Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
    <category><![CDATA[Web Hosting]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 0px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">The Message of the day on linux is helpful, but its long and... a little hard for things to stand out.</p><p class="paragraph" style="text-align:left;">I had a few questions about the MOTD.</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Where is it stored?</p></li><li><p class="paragraph" style="text-align:left;">How is it set up?</p></li><li><p class="paragraph" style="text-align:left;">Can I change it?</p></li><li><p class="paragraph" style="text-align:left;">If I can, how can I test it?</p></li></ol><h2 class="heading" style="text-align:left;" id="where-is-the-motd-stored">Where is the MOTD stored?</h2><p class="paragraph" style="text-align:left;">The message of the day on Ubuntu is stored in the /etc/update-motd.d/ folder as a number of scripts.</p><p class="paragraph" style="text-align:left;">You can view these scripts by running ls -la /etc/update-motd.d/</p><h2 class="heading" style="text-align:left;" id="how-is-the-motd-set-up">How is the MOTD set up?</h2><p class="paragraph" style="text-align:left;">The Message of the day is broken up into individual scripts. Here&#39;s what mine currently shows.</p><p class="paragraph" style="text-align:left;">It seems that cat /run/motd.dynamic is run when you login and something else generates it. At least according to, <a class="link" href="https://til.hashrocket.com/posts/rymit7rzif-view-the-motd-after-login-in-ubuntu?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=how-to-change-the-motd-on-ubuntu" target="_blank" rel="noopener noreferrer nofollow">chriserin on their blog</a>.</p><h2 class="heading" style="text-align:left;" id="can-you-change-the-motd">Can you change the MOTD?</h2><p class="paragraph" style="text-align:left;">Yes. There&#39;s loads of ways to do this.</p><p class="paragraph" style="text-align:left;">I don&#39;t want to remove it for everyone so you can disable it on a user by user basis by doing this;</p><p class="paragraph" style="text-align:left;">touch $HOME/.hushlogin</p><p class="paragraph" style="text-align:left;">Then you can add a custom script or echo to /etc/profile/ and it will print it at the end.</p><p class="paragraph" style="text-align:left;">I added `neofetch` to mine.</p><h2 class="heading" style="text-align:left;" id="further-reading">Further Reading</h2><p class="paragraph" style="text-align:left;"><a class="link" href="https://askubuntu.com/questions/105689/how-is-etc-motd-updated?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=how-to-change-the-motd-on-ubuntu" target="_blank" rel="noopener noreferrer nofollow">server - How is /etc/motd updated? - Ask Ubuntu</a> <a class="link" href="https://docs.vultr.com/working-with-the-ubuntu-message-of-the-day-motd-service?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=how-to-change-the-motd-on-ubuntu" target="_blank" rel="noopener noreferrer nofollow">Working with the Ubuntu Message of the Day (MOTD) Service | Vultr Docs</a></p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=2f32278e-5d8b-4216-a176-025498d6f373&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Do you need new JavaScript to work in ServiceNow?</title>
  <description></description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bfcdc5c2-0cc4-4cd8-b3ea-52752f958fad/new-becomes-old.png" length="1319047" type="image/png"/>
  <link>https://jaces-newsletter-247292.beehiiv.com/p/2024-10-17-do-you-need-new-js-to-work-sn</link>
  <guid isPermaLink="true">https://jaces-newsletter-247292.beehiiv.com/p/2024-10-17-do-you-need-new-js-to-work-sn</guid>
  <pubDate>Thu, 17 Oct 2024 19:55:19 +0000</pubDate>
  <atom:published>2024-10-17T19:55:19Z</atom:published>
    <dc:creator>Jace Benson</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 0px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">Sometimes you need new code converted to things ServiceNow understands. Arrow functions now work in ServiceNow in some places but not others. let, const same thing.</p><p class="paragraph" style="text-align:left;">Here&#39;s a way to take any new script and make it work. This is called transpiling. It&#39;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.</p><p class="paragraph" style="text-align:left;">Enough dry stuff let&#39;s get trying it.</p><p class="paragraph" style="text-align:left;">Go to <a class="link" href="https://babeljs.io/repl/?utm_source=jaces-newsletter-247292.beehiiv.com&utm_medium=newsletter&utm_campaign=do-you-need-new-javascript-to-work-in-servicenow" target="_blank" rel="noopener noreferrer nofollow">babeljs.io/repl</a> and set the target to, defaults, ie 11.</p><p class="paragraph" style="text-align:left;">Then paste in the new JavaScript. Or if you want something to start with try pasting this code.</p><div class="codeblock"><pre><code>let a = ()=&gt;&#123;
 console.log(message);
&#125;
// see let becomes var
// and () =&gt; &#123;&#125; becomes function(..)
// lets try other things
//
let [red,green,blue] = [0,1,2];
// copying into a new object
var person = &#123;
 name: &quot;Jace&quot;,
 location: &quot;MN&quot;
&#125;
/* 
// if you uncomment this, it will add a polyfill to do this
let copy = &#123;
 ...person
&#125;
*/</code></pre></div><p class="paragraph" style="text-align:left;">That should become something like;</p><div class="codeblock"><pre><code>var a = function a() &#123;
  console.log(message);
&#125;;
// see let becomes var
// and () =&gt; &#123;&#125; becomse function(..)
// lets try other things
// spread
var red = 0,
  green = 1,
  blue = 2;
// copying into a new object
var person = &#123;
  name: &quot;Jace&quot;,
  location: &quot;MN&quot;
&#125;;
/* 
// if you uncomment this, it will add a polyfill to do this
let copy = &#123;
  ...person
&#125;
*/</code></pre></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/?utm_campaign=75630be7-4f27-4df2-9d9a-d1a5bc018206&utm_medium=post_rss&utm_source=jace_s_blog">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

  </channel>
</rss>
