blog.kandji.io
Open in
urlscan Pro
199.60.103.227
Public Scan
Submitted URL: https://email.kandji.io/e3t/Ctc/ZS+113/cC6HP04/VXdSgZ2xWt2BW38RXSc8QK292W8yJSQm5dFtcCN8DGmDH3lYMRW7Y8-PT6lZ3l7W10NFdn55w...
Effective URL: https://blog.kandji.io/kandji-packages-create-and-update-custom-apps-via-api?utm_medium=email&_hsenc=p2ANqtz--N4X2fy6E4...
Submission: On May 06 via manual from FR — Scanned from FR
Effective URL: https://blog.kandji.io/kandji-packages-create-and-update-custom-apps-via-api?utm_medium=email&_hsenc=p2ANqtz--N4X2fy6E4...
Submission: On May 06 via manual from FR — Scanned from FR
Form analysis
2 forms found in the DOM/search
<form action="/search" class="relative">
<input type="text" class="" name="term" autocomplete="off" aria-label="Search" value="" placeholder="Type your search request">
<button aria-label="Search" class="absolute right-0 top-0 h-full w-11 transition duration-200 ease-in-out opacity-50 hover:opacity-100">
<span aria-hidden="true" class="inline-flex items-center justify-center w-11 h-full">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" class="h-6 w-6">
<rect width="256" height="256" fill="none"></rect>
<circle cx="116" cy="116" r="84" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></circle>
<line x1="175.4" y1="175.4" x2="224" y2="224" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"></line>
</svg>
</span>
</button>
</form>
POST https://forms.hsforms.com/submissions/v3/public/submit/formsnext/multipart/5058330/21f774d6-4c0b-4c25-b47a-35023464393a
<form id="hsForm_21f774d6-4c0b-4c25-b47a-35023464393a_2458" method="POST" accept-charset="UTF-8" enctype="multipart/form-data" novalidate=""
action="https://forms.hsforms.com/submissions/v3/public/submit/formsnext/multipart/5058330/21f774d6-4c0b-4c25-b47a-35023464393a"
class="hs-form-private hsForm_21f774d6-4c0b-4c25-b47a-35023464393a hs-form-21f774d6-4c0b-4c25-b47a-35023464393a hs-form-21f774d6-4c0b-4c25-b47a-35023464393a_de5a277a-80bb-4a71-a4bc-702423f962ad hs-form stacked hs-custom-form"
target="target_iframe_21f774d6-4c0b-4c25-b47a-35023464393a_2458" data-instance-id="de5a277a-80bb-4a71-a4bc-702423f962ad" data-form-id="21f774d6-4c0b-4c25-b47a-35023464393a" data-portal-id="5058330"
data-test-id="hsForm_21f774d6-4c0b-4c25-b47a-35023464393a_2458">
<div class="hs_email hs-email hs-fieldtype-text field hs-form-field"><label id="label-email-21f774d6-4c0b-4c25-b47a-35023464393a_2458" class="" placeholder="Enter your Email"
for="email-21f774d6-4c0b-4c25-b47a-35023464393a_2458"><span>Email</span><span class="hs-form-required">*</span></label>
<legend class="hs-field-desc" style="display: none;"></legend>
<div class="input"><input id="email-21f774d6-4c0b-4c25-b47a-35023464393a_2458" name="email" required="" placeholder="Email" type="email" class="hs-input" inputmode="email" autocomplete="email" value=""></div>
</div>
<div class="hs_utm_campaign hs-utm_campaign hs-fieldtype-text field hs-form-field" style="display: none;"><label id="label-utm_campaign-21f774d6-4c0b-4c25-b47a-35023464393a_2458" class="" placeholder="Enter your utm_campaign"
for="utm_campaign-21f774d6-4c0b-4c25-b47a-35023464393a_2458"><span>utm_campaign</span></label>
<legend class="hs-field-desc" style="display: none;"></legend>
<div class="input"><input name="utm_campaign" class="hs-input" type="hidden" value=""></div>
</div>
<div class="hs_utm_content hs-utm_content hs-fieldtype-text field hs-form-field" style="display: none;"><label id="label-utm_content-21f774d6-4c0b-4c25-b47a-35023464393a_2458" class="" placeholder="Enter your utm_content"
for="utm_content-21f774d6-4c0b-4c25-b47a-35023464393a_2458"><span>utm_content</span></label>
<legend class="hs-field-desc" style="display: none;"></legend>
<div class="input"><input name="utm_content" class="hs-input" type="hidden" value="305522564"></div>
</div>
<div class="hs_utm_medium hs-utm_medium hs-fieldtype-text field hs-form-field" style="display: none;"><label id="label-utm_medium-21f774d6-4c0b-4c25-b47a-35023464393a_2458" class="" placeholder="Enter your utm_medium"
for="utm_medium-21f774d6-4c0b-4c25-b47a-35023464393a_2458"><span>utm_medium</span></label>
<legend class="hs-field-desc" style="display: none;"></legend>
<div class="input"><input name="utm_medium" class="hs-input" type="hidden" value="email"></div>
</div>
<div class="hs_utm_source hs-utm_source hs-fieldtype-text field hs-form-field" style="display: none;"><label id="label-utm_source-21f774d6-4c0b-4c25-b47a-35023464393a_2458" class="" placeholder="Enter your utm_source"
for="utm_source-21f774d6-4c0b-4c25-b47a-35023464393a_2458"><span>utm_source</span></label>
<legend class="hs-field-desc" style="display: none;"></legend>
<div class="input"><input name="utm_source" class="hs-input" type="hidden" value="hs_email"></div>
</div>
<div class="hs_utm_term hs-utm_term hs-fieldtype-text field hs-form-field" style="display: none;"><label id="label-utm_term-21f774d6-4c0b-4c25-b47a-35023464393a_2458" class="" placeholder="Enter your utm_term"
for="utm_term-21f774d6-4c0b-4c25-b47a-35023464393a_2458"><span>utm_term</span></label>
<legend class="hs-field-desc" style="display: none;"></legend>
<div class="input"><input name="utm_term" class="hs-input" type="hidden" value=""></div>
</div>
<div class="hs_blog_kandji_blog_2_6850365017_subscription hs-blog_kandji_blog_2_6850365017_subscription hs-fieldtype-radio field hs-form-field" style="display: none;"><label
id="label-blog_kandji_blog_2_6850365017_subscription-21f774d6-4c0b-4c25-b47a-35023464393a_2458" class="" placeholder="Enter your Kandji Blog Email Subscription"
for="blog_kandji_blog_2_6850365017_subscription-21f774d6-4c0b-4c25-b47a-35023464393a_2458"><span>Kandji Blog Email Subscription</span></label>
<legend class="hs-field-desc" style="display: none;"></legend>
<div class="input"><input name="blog_kandji_blog_2_6850365017_subscription" class="hs-input" type="hidden" value="instant"></div>
</div>
<div class="hs_submit hs-submit">
<div class="hs-field-desc" style="display: none;"></div>
<div class="actions"><input type="submit" class="hs-button primary large" value="Subscribe"></div>
</div><input name="hs_context" type="hidden"
value="{"embedAtTimestamp":"1714975224684","formDefinitionUpdatedAt":"1629373273571","notifyHubSpotOwner":"true","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36","pageTitle":"Kandji Packages: Create and Update Custom Apps via API","pageUrl":"https://blog.kandji.io/kandji-packages-create-and-update-custom-apps-via-api?utm_medium=email&_hsenc=p2ANqtz--N4X2fy6E4lqrmW0CuFONI8szxtBcpO0OP_1VPzF5af4xjR8mQ1ykkCdMn2dOYEu-D1cW_4LOsdeEm9ofCk8i7hQzUTg&_hsmi=305522564&utm_content=305522564&utm_source=hs_email","pageId":"165665885085","urlParams":{"utm_medium":"email","_hsenc":"p2ANqtz--N4X2fy6E4lqrmW0CuFONI8szxtBcpO0OP_1VPzF5af4xjR8mQ1ykkCdMn2dOYEu-D1cW_4LOsdeEm9ofCk8i7hQzUTg","_hsmi":"305522564","utm_content":"305522564","utm_source":"hs_email"},"isHubSpotCmsGeneratedPage":true,"canonicalUrl":"https://blog.kandji.io/kandji-packages-create-and-update-custom-apps-via-api","contentType":"blog-post","hutk":"cff9262876631ae91d2b36ce4d88d37c","__hsfp":4046427330,"__hssc":"234561729.1.1714975226997","__hstc":"234561729.cff9262876631ae91d2b36ce4d88d37c.1714975226996.1714975226996.1714975226996.1","formTarget":"#hs_form_target_sidebar_subscribe_","formInstanceId":"2458","rawInlineMessage":"<p>Thanks for subscribing!</p>","hsFormKey":"c918c08703f103826f4d43f809eea060","pageName":"Kandji Packages: Create and Update Custom Apps via API","rumScriptExecuteTime":1251.099998474121,"rumTotalRequestTime":1484.7000045776367,"rumTotalRenderTime":1586.7000045776367,"rumServiceResponseTime":233.60000610351562,"rumFormRenderTime":102,"connectionType":"4g","firstContentfulPaint":0,"largestContentfulPaint":0,"locale":"en","timestamp":1714975227017,"originalEmbedContext":{"portalId":"5058330","formId":"21f774d6-4c0b-4c25-b47a-35023464393a","region":"na1","target":"#hs_form_target_sidebar_subscribe_","isBuilder":false,"isTestPage":false,"isPreview":false,"formInstanceId":"2458","formsBaseUrl":"/_hcms/forms","css":"","inlineMessage":"<p>Thanks for subscribing!</p>","isMobileResponsive":true,"rawInlineMessage":"<p>Thanks for subscribing!</p>","hsFormKey":"c918c08703f103826f4d43f809eea060","pageName":"Kandji Packages: Create and Update Custom Apps via API","pageId":"165665885085","contentType":"blog-post","formData":{"cssClass":"hs-form stacked hs-custom-form"},"isCMSModuleEmbed":true},"correlationId":"de5a277a-80bb-4a71-a4bc-702423f962ad","renderedFieldsIds":["email","utm_campaign","utm_content","utm_medium","utm_source","utm_term","blog_kandji_blog_2_6850365017_subscription"],"captchaStatus":"NOT_APPLICABLE","emailResubscribeStatus":"NOT_APPLICABLE","isInsideCrossOriginFrame":false,"source":"forms-embed-1.5064","sourceName":"forms-embed","sourceVersion":"1.5064","sourceVersionMajor":"1","sourceVersionMinor":"5064","allPageIds":{"embedContextPageId":"165665885085","analyticsPageId":"165665885085","contentPageId":165665885085,"contentAnalyticsPageId":"165665885085"},"_debug_embedLogLines":[{"clientTimestamp":1714975224751,"level":"INFO","message":"Retrieved customer callbacks used on embed context: [\"getExtraMetaDataBeforeSubmit\"]"},{"clientTimestamp":1714975224751,"level":"INFO","message":"Retrieved pageContext values which may be overriden by the embed context: {\"pageTitle\":\"Kandji Packages: Create and Update Custom Apps via API\",\"pageUrl\":\"https://blog.kandji.io/kandji-packages-create-and-update-custom-apps-via-api?utm_medium=email&_hsenc=p2ANqtz--N4X2fy6E4lqrmW0CuFONI8szxtBcpO0OP_1VPzF5af4xjR8mQ1ykkCdMn2dOYEu-D1cW_4LOsdeEm9ofCk8i7hQzUTg&_hsmi=305522564&utm_content=305522564&utm_source=hs_email\",\"userAgent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\",\"urlParams\":{\"utm_medium\":\"email\",\"_hsenc\":\"p2ANqtz--N4X2fy6E4lqrmW0CuFONI8szxtBcpO0OP_1VPzF5af4xjR8mQ1ykkCdMn2dOYEu-D1cW_4LOsdeEm9ofCk8i7hQzUTg\",\"_hsmi\":\"305522564\",\"utm_content\":\"305522564\",\"utm_source\":\"hs_email\"},\"pageId\":\"165665885085\",\"contentAnalyticsPageId\":\"165665885085\",\"contentPageId\":165665885085,\"isHubSpotCmsGeneratedPage\":true}"},{"clientTimestamp":1714975224753,"level":"INFO","message":"Retrieved countryCode property from normalized embed definition response: \"FR\""},{"clientTimestamp":1714975227012,"level":"INFO","message":"Retrieved analytics values from API response which may be overriden by the embed context: {\"hutk\":\"cff9262876631ae91d2b36ce4d88d37c\",\"canonicalUrl\":\"https://blog.kandji.io/kandji-packages-create-and-update-custom-apps-via-api\",\"contentType\":\"blog-post\",\"pageId\":\"165665885085\"}"}]}"><iframe
name="target_iframe_21f774d6-4c0b-4c25-b47a-35023464393a_2458" style="display: none;"></iframe>
</form>
Text Content
___ Skip to content Book a Demo Request Pricing Virtual Tour Kandji logo Open main menu Kandji Close menu PRODUCT Device Harmony Device Management Endpoint Detection & Response Pricing Support USE CASES Deploy Secure Configure Manage Integrate FEATURES Liftoff Passport Auto Apps Managed OS Migration Compliance Prism Integrations iOS & iPadOS RESOURCES Resources Hub Blog Customer Stories MacAdmins Community Security Details PARTNERS Resellers Technology Partners Become a Partner Register a Deal Partner Portal COMPANY About Kandji Careers News & Press Contact Log in Get Started Get Started Kandji logo Product SOLUTIONS Device Management Advanced automation and frictionless experiences for Apple devices Endpoint Detection & Response Cutting-edge performance and extensive threat detection for Mac WHY KANDJI? Device Harmony Tear down the wall between IT and InfoSec to keep every Apple user secure and productive at work FEATURES Liftoff Onboard users with a personalized setup experience Passport Let users unlock devices with their single sign-on credentials Auto Apps Automatically ensure devices always have the right software Managed OS Set and enforce macOS update parameters fleet-wide Migration Move users onto Kandji via an existing MDM platform Compliance Map settings to compliance benchmarks in minutes Prism Get instant visibility and reporting on the state of your Apple fleet. Integrations Connect Kandji with the rest of your software stack to save even more time. iOS & iPadOS Deploy, manage, and secure iOS and iPadOS devices at scale. SEE KANDJI IN ACTION Try Kandji Free Discover the power of Kandji with a personalized demo and 14-day trial. Get Started Pricing Resources Resources Hub Blog Customer Stories MacAdmins Community Security Details Support Partners Resellers Technology Partners Become a Partner Register a Deal Partner Portal Company About Kandji Careers News & Press Contact Log in Get Started Blog Product Update Kandji Pac... KANDJI PACKAGES: CREATE AND UPDATE CUSTOM APPS VIA API Noah Anderson Noah Anderson May 3, 2024 Systems Engineer at Kandji 7 min read In Kandji, you can deploy custom apps—software you want your users to have but isn’t available as one of Kandji’s Auto Apps or from the Mac App Store—using our Custom App Library Item. In concrete terms, that means creating a new Library Item, uploading installation files—PKG, DMG, or ZIP—to it, setting enforcement policies, adding optional pre- or postinstall scripts, then putting that Library Item in the appropriate Blueprint. Once that’s done, your custom app will appear on all devices assigned to that Blueprint. But there’s another way to add custom apps: using our recently released API endpoints. These make it possible to manage custom Library Items programmatically. However, we recognize that building a workable solution on top of APIs can be a technically complex, time-intensive project. That’s why we’re excited to share two new open-source frameworks—Kandji Packages and KAPPA—both of which provide a frictionless way to create and update Custom Apps over API. Here’s how they work. LINK TO THIS SECTION KANDJI PACKAGES: WHAT IT DOES, HOW IT WORKS Kandji Packages is a way to deploy custom installers programmatically so that users always have the current version. (In that respect, it’s similar to Kandji Auto Apps.) So if, for example, you want your developers to always have the most current version of the AWS Command Line Interface, you could use Kandji Packages to distribute it to that team. Packages is appropriate for apps that require customized configurations, such as an installer package for which you need to modify an included file or attach a config file before deploying. It works with command line tools and binaries that have versioning; it can check the current version on a download source against the version that’s already deployed. As long as the vendor provides version information in the package, Kandji Packages can enforce it. Before you use Kandji Packages, you need a couple of things: a valid Kandji tenant; an API token with these permissions; and (optionally) a Slack token for reporting status. After that initial configuration, download a macOS app installer—either a PKG or DMG—and point Packages at the download. It will upload to your Kandji instance, auto-populate details like the app name, and post to Slack once it’s finished. As detailed in the README file, there are other customizations available, such as selecting a per-app enforcement type or Self Service category. It’s important to note that when you use Kandji Packages to initially create a new Custom App, it will not add it to a Blueprint; you still need to use the Kandji web app for that. But if you use it to update an existing Library Item that's already scoped to a Blueprint, it'll update the installer and version for enforcement (if set) and keep the existing scope as is. You run Kandji Packages on a Mac (it’s primarily Python, with a little shell scripting to manage setup and configuration). You can also use it as part of a continuous integration/delivery flow to continually update and distribute custom apps as they become available; it can interact with files you have in a repo. (This still requires a Mac node.) See Kandji in Action Experience Apple device management and security that actually gives you back your time. Get Started Contact Us In addition to working with local files, Kandji Packages can also source an installer by name directly from Homebrew. As long as the Homebrew cask source is a PKG or DMG, Packages will execute the same workflow as above when adding that installer to, or updating it in, Kandji. LINK TO THIS SECTION KANDJI PACKAGES AND AUTOPKG If all that sounds familiar, it’s because the functionality is similar to what you get from AutoPkg, the venerable automation framework for packaging and distributing macOS software. Like AutoPkg, Kandji Packages can download installer files from a specified source site, extract them (if archived), parse their versioning information, and provide identifying information about the installation. Unlike AutoPkg, Kandji Packages can then leverage the Kandji API to actually upload the installer file to your Kandji instance for deployment to specific devices. For customers who are already invested in an AutoPkg environment, we’ve built an AutoPkg processor—the Kandji AutoPkg Processor Actions, or KAPPA for short—to connect such existing AutoPkg infrastructures to Kandji. If you’ve ever used something like Munki, which integrates tightly with AutoPkg to handle package uploads, scoping, and more, the behavior should be familiar; KAPPA hopes to provide similarly seamless integration. All of their existing recipes and all of the workflows they've set up to download installers and build and assign packages remain the same; they just need to modify their existing recipes to add a step for KAPPA that would, in essence, say, "After this package is built, pass it off to the Kandji processor." You can also create a recipe to define the name of the package, the group it should be assigned to, and where it should appear in Kandji Self Service, among other configuration options. We do a few things to check on versioning: If it’s just an app bundle that you're distributing—something like Slack—we will read the short version string from its info.plist. We then check the current installation to see which version is running. If it’s a binary, we can record a PKG value instead and then use that for validating the installed version. If you’re using the Audit and enforce installation option, you can set a number of days before version enforcement triggers. When enforcement is due, the user will be prompted to close the open app before the update proceeds, with an option to defer once. If it's a binary or background process with an update pending, that update will proceed without issue. Both frameworks are open source, with licensing details available for Kandji Packages and for KAPPA. We actively welcome contributions and feedback from the community. LINK TO THIS SECTION ABOUT KANDJI Kandji is the Apple device management and security platform that empowers secure and productive global work. With Kandji, Apple devices transform themselves into enterprise-ready endpoints, with all the right apps, settings, and security systems in place. Through advanced automation and thoughtful experiences, we’re bringing much-needed harmony to the way IT, InfoSec, and Apple device users work today and tomorrow. See Kandji in Action Experience Apple device management and security that actually gives you back your time. Get Started Contact Us See Kandji in Action Experience Apple device management and security that actually gives you back your time. Start Free Trial Contact Us Share Post LinkedIn Facebook Twitter Reddit Print Previous Post Search More Product Updates Kandji's Integration with ServiceNow Streamlines Asset Management KANDJI'S INTEGRATION WITH SERVICENOW STREAMLINES ASSET MANAGEMENT Kandji Prism Gives Admins Quick Visibility into Apple Device Fleets KANDJI PRISM GIVES ADMINS QUICK VISIBILITY INTO APPLE DEVICE FLEETS Kandji Earns ISO 27001 Certification KANDJI EARNS ISO 27001 CERTIFICATION Related Topics Introducing Custom Apps and Scripts in Self Service INTRODUCING CUSTOM APPS AND SCRIPTS IN SELF SERVICE Kandji Raises $60 Million Series B to Drive the Future of Apple Enterprise Management KANDJI RAISES $60 MILLION SERIES B TO DRIVE THE FUTURE OF APPLE ENTERPRISE MANAGEMENT Create Multiple Instances of Auto Apps and Managed OSes CREATE MULTIPLE INSTANCES OF AUTO APPS AND MANAGED OSES Get the latest blog updates in your inbox SUBSCRIBE Email* utm_campaign utm_content utm_medium utm_source utm_term Kandji Blog Email Subscription PRODUCT * Device Harmony * Device Management * Endpoint Detection & Response * Updates USE CASES * Deploy * Secure * Configure * Manage * Integrate * macOS MDM Solutions * iOS MDM Solutions FEATURES * Liftoff * Passport * Auto Apps * Managed OS * Migration * Compliance * Prism * Integrations RESOURCES * Resources Hub * Blog * Customer Stories * Support * MacAdmins Slack * Apple MDM Definitions COMPANY * About Kandji * The Kandji Difference * Careers * News & Press * Contact * Partners Link to Kandji's Twitter Link to Kandji's Facebook Link to Kandji's LinkedIn Logo for AICPA SOC for Service Organizations * Device Harmony * Device Management * Endpoint Detection & Response * Get Started * Pricing * Support * About * Careers * Blog Link to Kandji's Twitter Link to Kandji's Facebook Link to Kandji's LinkedIn Logo for AICPA SOC for Service Organizations Kandji logo © Copyright 2024 Kandji, Inc. All Rights Reserved. Kandji, the bee logo and Device Harmony are trademarks of Kandji, Inc. * Privacy Policy * Your Privacy Choices * Accessibility * Legal This website uses cookies and other tracking technologies to enhance user experience and to analyze performance and traffic on our website. We also share information about your use of our site with our social media, advertising and analytics partners. If we have detected an opt-out preference signal then it will be honored. Further information is available in our Accept All Cookies Reject Optional Cookies Manage Privacy Preferences PRIVACY PREFERENCE CENTER When you visit any website, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to. The information does not usually directly identify you, but it can give you a more personalized web experience. Because we respect your right to privacy, you can choose not to allow some types of cookies. Click on the different category headings to find out more and change our default settings. However, blocking some types of cookies may impact your experience of the site and the services we are able to offer. Privacy Policy . Allow All MANAGE CONSENT PREFERENCES STRICTLY NECESSARY COOKIES Always Active These cookies are necessary for the website to function and cannot be switched off in our systems. They are usually only set in response to actions made by you which amount to a request for services, such as setting your privacy preferences, logging in or filling in forms. You can set your browser to block or alert you about these cookies, but some parts of the site will not then work. These cookies do not store any personally identifiable information. FUNCTIONAL COOKIES Always Active These cookies enable the website to provide enhanced functionality and personalisation. They may be set by us or by third party providers whose services we have added to our pages. If you do not allow these cookies then some or all of these services may not function properly. PERFORMANCE COOKIES Performance Cookies These cookies allow us to count visits and traffic sources so we can measure and improve the performance of our site. They help us to know which pages are the most and least popular and see how visitors move around the site. All information these cookies collect is aggregated and therefore anonymous. If you do not allow these cookies we will not know when you have visited our site, and will not be able to monitor its performance. TARGETING COOKIES Targeting Cookies These cookies may be set through our site by our advertising partners. They may be used by those companies to build a profile of your interests and show you relevant adverts on other sites. They do not store directly personal information, but are based on uniquely identifying your browser and internet device. If you do not allow these cookies, you will experience less targeted advertising. Back Button COOKIE LIST Search Icon Filter Icon Clear checkbox label label Apply Cancel Consent Leg.Interest checkbox label label checkbox label label checkbox label label Reject All Confirm My Choices