{"id":621,"date":"2025-01-29T17:00:08","date_gmt":"2025-01-30T01:00:08","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/?p=621"},"modified":"2025-03-05T09:51:31","modified_gmt":"2025-03-05T17:51:31","slug":"automating-developer-environments-with-microsoft-dev-box-and-teams-customizations","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/automating-developer-environments-with-microsoft-dev-box-and-teams-customizations\/","title":{"rendered":"Automating Developer Environments with Microsoft Dev Box and Teams Customizations"},"content":{"rendered":"<p>The following blog walks through the experience of defining and automating the creation of developer environments with the newly announced <a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/understanding-the-basics-of-dev-box-teams-customizations\/\">Teams Customizations<\/a> feature in Microsoft Dev Box. This allows developer team leads or managers to define the software installed by default every time a developer creates a new environment, ensuring that every team member has the latest tools and frameworks needed to deliver on a project right away. This automates the typical process of using a combination of custom images, miscellaneous scripts, and manual configuration that is used in most organizations today. Moving to an automated approach enables developer teams to work more efficiently and not have to spend additional time configuring developer environments. If you are new to Dev Box, there may be some concepts that are mentioned below you may not be aware of. To learn more about the core concepts for Microsoft Dev Box, check out our docs page <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/dev-box\/concept-dev-box-concepts\">here. <\/a><\/p>\n<h3 aria-level=\"2\"><span data-contrast=\"none\">What are Dev Box Customizations?<\/span><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}\">\u00a0<\/span><\/h3>\n<p>With Dev Box, developers have the option to define the necessary tools, frameworks and settings they want pre-configured when creating a dev environment with the<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/dev-box\/how-to-write-customization-file\"> customizations<\/a> feature. Customizations allow you to either link a customization file (defined as YAML)\u2014via adding a catalog (either a GitHub or Azure DevOps Repository) to the dev center linked to your team\u2019s projects\u2014or upload a customization file directly during the Dev Box creation process. Below is an example of the second option.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/create-customization.gif\"><img decoding=\"async\" class=\"alignnone wp-image-658\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/create-customization.gif\" alt=\"Image create customization\" width=\"800\" height=\"450\" \/><\/a><\/p>\n<h3 aria-level=\"2\"><span data-contrast=\"none\">Introducing Teams Customizations<\/span><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}\">\u00a0<\/span><\/h3>\n<p>As a developer, being able to define your own environment makes it possible to get a setup that\u2019s just right. Plus, it\u2019s great to have the flexibility to upload or add that environment in a repo (either GitHub or Azure DevOps). There is one drawback with this individual approach, however. The responsibility is on the developer to define all the tools that are needed for a particular project. Wouldn\u2019t it be much better if there was a way to define a project-wide customization that would be referenced every time a dev box tied to a particular project is created? This is what using Teams Customizations can do for dev teams, enabling dev leads or managers to define the environment an application is built in and ensuring it is consistent for every developer on the team.<\/p>\n<p>This approach of defining a developer environment per project is similar to the concept of custom images with one large difference. Images can become stale, meaning that tools and packages may have updates that are not part of that image. What Teams Customizations provides is the ability to add an additional layer on top of the image, ensuring the latest versions of the required tools are installed.<\/p>\n<p>Here is an example:<\/p>\n<ul>\n<li>Base Image contains Visual Studio 2022 and Docker Desktop<\/li>\n<\/ul>\n<ul>\n<li>Teams Customization added to install latest version of .NET, NodeJS, and Visual Studio Code with relevant extensions.<\/li>\n<\/ul>\n<p>In the above example, the items listed in the Teams Customization could be part of the base-image, but once any of those tools require an update, the developer would be responsible for doing that once the dev box is created and they are logged in.<\/p>\n<p>Teams Customizations eliminates the need for developers to make these updates, giving them a \u201cready to code\u201d environment upon login, so they are that much closer to contributing without dealing with environment configuration. If the developer has additional tools or settings that they would like as part of their environment (for instance having Windows in dark mode, specific Visual Studio Code extensions, or a customized Windows Terminal enabled with <a href=\"https:\/\/ohmyposh.dev\/\">Oh My Posh<\/a>) they still have that flexibility with the individual customizations mentioned above.<\/p>\n<h3 aria-level=\"2\"><span data-contrast=\"none\">Setting up Teams Customizations<\/span><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}\">\u00a0<\/span><\/h3>\n<p>To setup Teams Customizations, we should assume a few things as it pertains to your role on your team and your access in the Azure Portal:<\/p>\n<ul>\n<li>You are a team lead or dev manager and are responsible for handling new developer or project onboarding<\/li>\n<\/ul>\n<ul>\n<li>You are (or have access to someone that is) the owner of a dev center or have write access on the Azure subscription<\/li>\n<\/ul>\n<ul>\n<li>You have access to a Git repo (either in GitHub or Azure DevOps) to store customizations that will be added to dev center as a catalog<\/li>\n<\/ul>\n<p>The first thing you need when setting up Teams Customizations is to enable catalogs per project from within your dev center. That is done from the <strong>Settings<\/strong> section of dev center.<\/p>\n<p><span data-ccp-props=\"{}\"> <a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/enable-project-catalogs.gif\"><img decoding=\"async\" class=\"alignnone wp-image-655\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/enable-project-catalogs.gif\" alt=\"Image enable project catalogs\" width=\"800\" height=\"450\" \/><\/a><\/span><\/p>\n<p>Once enabled, you can now add catalogs to your project. Catalogs act as containers for reusable workflows in dev center. They are leveraged by both Dev Box and Azure Deployment Environments. These workflows are stored in code repositories. In our case, it will be hosted on GitHub: <a href=\"https:\/\/github.com\/isaaclevintest\/contoso-co-eShop\">isaaclevintest\/contoso-co-eShop: A reference .NET application implementing an eCommerce site<\/a><\/p>\n<p>In this repo, there are two folders that have to do with Team Customizations:<\/p>\n<ul>\n<li><strong>.devcenter folder\u00a0<\/strong>\n<ul>\n<li>This folder holds the Teams Customizations themselves. For instance, here we have a customization for our frontend team.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104411.png\"><img decoding=\"async\" class=\"alignnone wp-image-646\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104411.png\" alt=\"Image Screenshot 2025 01 24 104411\" width=\"801\" height=\"514\" srcset=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104411.png 936w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104411-300x193.png 300w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104411-768x493.png 768w\" sizes=\"(max-width: 801px) 100vw, 801px\" \/><\/a><\/p>\n<ul>\n<li style=\"list-style-type: none;\" data-leveltext=\"o\" data-font=\"Courier New\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Courier New&quot;,&quot;469769242&quot;:[9675],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;o&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"2\">\n<ul>\n<li>This customization references a base image (Windows 11 24H2 in this case) that can be either defined by our IT organization, or one that is provided in the Azure Compute Gallery that we approve of.<\/li>\n<li>On top of that base image, we are running three additional tasks\n<ul>\n<li>Run a winget command with a particular file as input (more on that below)<\/li>\n<li>Install the Azure Developer CLI<\/li>\n<li>Install Visual Studio Code<\/li>\n<li>Install the necessary extensions needed for the frontend team<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li data-leveltext=\"o\" data-font=\"Courier New\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Courier New&quot;,&quot;469769242&quot;:[9675],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;o&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"2\"><strong>.configurations folder\u00a0<\/strong>\n<ul>\n<li>Because Dev Box customizations (both Team and Individual) support PowerShell DSC (Desired State Configuration) for more complex tasks we can leverage DSC to do that additional work. Here is the <strong>common-config.dsc.yaml <\/strong>configuration that is referenced in the above customization<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104525.png\"><img decoding=\"async\" class=\"alignnone wp-image-647\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104525.png\" alt=\"Image Screenshot 2025 01 24 104525\" width=\"800\" height=\"707\" srcset=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104525.png 925w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104525-300x265.png 300w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104525-768x678.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li data-leveltext=\"o\" data-font=\"Courier New\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:1440,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Courier New&quot;,&quot;469769242&quot;:[9675],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;o&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"2\"><span data-contrast=\"auto\">This DSC file completes the following tasks<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:2160,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Wingdings&quot;,&quot;469769242&quot;:[9642],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0a7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"3\"><span data-contrast=\"auto\">Configures Dev Drive in the environment with a capacity of 50GB<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:2160,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Wingdings&quot;,&quot;469769242&quot;:[9642],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0a7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"3\"><span data-contrast=\"auto\">Installs the Git CLI<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li data-leveltext=\"\uf0a7\" data-font=\"Wingdings\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559685&quot;:2160,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Wingdings&quot;,&quot;469769242&quot;:[9642],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0a7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"3\"><span data-contrast=\"auto\">Configures Git to use the default WAM (Web Account Manager) account, which will allow git commands to run successfully.\u00a0<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>If you look in both of these folders, you can see that we also have Teams Customizations for our backend engineering team as well. If you currently use other orchestration tools such as Ansible, you can leverage them as well via Dev Box Customizations.<\/p>\n<h3 aria-level=\"2\"><span data-contrast=\"none\">Add Catalog to our project<\/span><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}\">\u00a0<\/span><\/h3>\n<p>Now that we have a better understanding of what customizations will be run when new dev boxes are created, we can now link the catalog to our dev center project. To do that, we will go to the dev center project we want to add Teams customizations to, then go through the newly enabled catalogs experience for that project. Here is a video of that flow:<\/p>\n<p><span data-ccp-props=\"{}\"> <a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/adding-project-catalog.gif\"><img decoding=\"async\" class=\"alignnone wp-image-659\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/adding-project-catalog.gif\" alt=\"Image adding project catalog\" width=\"800\" height=\"450\" \/><\/a><\/span><\/p>\n<p><span data-contrast=\"auto\">In summary, we will do the following things to add our catalog<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<ul>\n<li data-leveltext=\"-\" data-font=\"Aptos\" data-listid=\"1\" data-list-defn-props=\"{&quot;335551671&quot;:0,&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Aptos&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"7\" data-aria-level=\"1\"><span data-contrast=\"auto\">Give the catalog a name<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"-\" data-font=\"Aptos\" data-listid=\"1\" data-list-defn-props=\"{&quot;335551671&quot;:0,&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Aptos&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"8\" data-aria-level=\"1\"><span data-contrast=\"auto\">Choose Repo (GitHub or Azure DevOps)<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"-\" data-font=\"Aptos\" data-listid=\"1\" data-list-defn-props=\"{&quot;335551671&quot;:0,&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Aptos&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"9\" data-aria-level=\"1\"><span data-contrast=\"auto\">In our case with GitHub, authenticate either via the GitHub App or a Personal Access Token<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"-\" data-font=\"Aptos\" data-listid=\"1\" data-list-defn-props=\"{&quot;335551671&quot;:0,&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Aptos&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"10\" data-aria-level=\"1\">Pick Repo, Branch, and the path to our customizations folder in the repo<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"-\" data-font=\"Aptos\" data-listid=\"1\" data-list-defn-props=\"{&quot;335551671&quot;:0,&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Aptos&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"11\" data-aria-level=\"1\"><span data-contrast=\"auto\">Add catalog<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><span data-contrast=\"auto\">After some time, you will see that the catalog has been successfully added and synced.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104605.png\"><img decoding=\"async\" class=\"alignnone wp-image-648\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104605.png\" alt=\"Image Screenshot 2025 01 24 104605\" width=\"800\" height=\"193\" srcset=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104605.png 936w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104605-300x72.png 300w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104605-768x185.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<p><span data-contrast=\"auto\">If the configuration of Teams Customizations is successful, you can see each individual customization in the <\/span><b><span data-contrast=\"auto\">Manager <\/span><\/b><b><span data-contrast=\"auto\">Image definitions<\/span><\/b><span data-contrast=\"auto\"> area of the project<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104632.png\"><img decoding=\"async\" class=\"alignnone wp-image-649\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104632.png\" alt=\"Image Screenshot 2025 01 24 104632\" width=\"800\" height=\"287\" srcset=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104632.png 928w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104632-300x108.png 300w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104632-768x276.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<p>From here, you have the ability to use Teams Customizations in one of two ways:<\/p>\n<ul>\n<li>Run the customizations on top of your preferred image (after the environment is created)<\/li>\n<li>Build an image with those customizations baked into it. This will create a new image that you could extend further if you like.<\/li>\n<\/ul>\n<h3 aria-level=\"2\"><span data-contrast=\"none\">Create dev box pool for new image definition<\/span><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}\">\u00a0<\/span><\/h3>\n<p>The next step to ensuring Teams Customizations will run when new dev boxes are created is to create a new dev box pool that leverages the recently created image definition that represents our Teams Customization. The following video walks through this process:<\/p>\n<p><span data-ccp-props=\"{}\"> <a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/create-dev-pool.gif\"><img decoding=\"async\" class=\"alignnone wp-image-656\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/create-dev-pool.gif\" alt=\"Image create dev pool\" width=\"800\" height=\"450\" \/><\/a><\/span><\/p>\n<p><span data-contrast=\"auto\">In summary, we will do the following things to create that dev box pool<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<ul>\n<li data-leveltext=\"-\" data-font=\"Aptos\" data-listid=\"1\" data-list-defn-props=\"{&quot;335551671&quot;:0,&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Aptos&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"12\" data-aria-level=\"1\"><span data-contrast=\"auto\">Give the pool a name<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"-\" data-font=\"Aptos\" data-listid=\"1\" data-list-defn-props=\"{&quot;335551671&quot;:0,&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Aptos&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"13\" data-aria-level=\"1\"><span data-contrast=\"auto\">Select the image definition we want the dev box to reference<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"-\" data-font=\"Aptos\" data-listid=\"1\" data-list-defn-props=\"{&quot;335551671&quot;:0,&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Aptos&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"14\" data-aria-level=\"1\"><span data-contrast=\"auto\">Choose compute and storage of dev boxes that will be created<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"-\" data-font=\"Aptos\" data-listid=\"1\" data-list-defn-props=\"{&quot;335551671&quot;:0,&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Aptos&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"15\" data-aria-level=\"1\"><span data-contrast=\"auto\">Choose additional settings that meet the needs of your dev box (network, privileges, auto-stop, stop time and licensing)<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"-\" data-font=\"Aptos\" data-listid=\"1\" data-list-defn-props=\"{&quot;335551671&quot;:0,&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Aptos&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;-&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"16\" data-aria-level=\"1\"><span data-contrast=\"auto\">Click Create<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><span data-contrast=\"auto\">After the pool has been created, we can confirm that there are no errors, and we can create dev boxes with it<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-105251.png\"><img decoding=\"async\" class=\"alignnone wp-image-651\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-105251.png\" alt=\"Image Screenshot 2025 01 24 105251\" width=\"800\" height=\"182\" srcset=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-105251.png 942w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-105251-300x68.png 300w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-105251-768x174.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<h3 aria-level=\"2\"><span data-contrast=\"none\">Create dev box with Teams Customizations<\/span><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}\">\u00a0<\/span><\/h3>\n<p>Now that we have enabled Teams Customizations on our project, and completed the necessary steps needed to create dev boxes with those customizations, we can go through the dev box creation process to create a new developer environment with those customizations. Here is what that flow looks like:<\/p>\n<p><span data-ccp-props=\"{}\"> <a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/create-dev-box.gif\"><img decoding=\"async\" class=\"alignnone wp-image-657\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/create-dev-box.gif\" alt=\"Image create dev box\" width=\"800\" height=\"450\" \/><\/a><\/span><\/p>\n<p>In summary, we will do the following steps to create a dev box:<\/p>\n<ul>\n<li>Give the dev box a name<\/li>\n<\/ul>\n<ul>\n<li>Since there is only one dev box pool for this project, there is no dropdown. If you have multiple projects and\/or dev box pools, there will be a drop down to select the one that fits your needs<\/li>\n<\/ul>\n<ul>\n<li>Click <strong>Create<\/strong><\/li>\n<\/ul>\n<p>We can verify that our dev box is being created with those Teams Customization even before the dev box creation is done.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/dev-box-teams-customization-part1-11.png\"><img decoding=\"async\" class=\"alignnone wp-image-661\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/dev-box-teams-customization-part1-11.png\" alt=\"Image dev box teams customization part1 11\" width=\"800\" height=\"897\" srcset=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/dev-box-teams-customization-part1-11.png 611w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/dev-box-teams-customization-part1-11-268x300.png 268w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104703.png\"><img decoding=\"async\" class=\"alignnone wp-image-650\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104703.png\" alt=\"Image Screenshot 2025 01 24 104703\" width=\"800\" height=\"573\" srcset=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104703.png 922w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104703-300x215.png 300w, https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/Screenshot-2025-01-24-104703-768x550.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<p><span data-ccp-props=\"{}\">\u00a0<\/span>You may recall that these tasks are the same as what are defined in our catalog from above.<\/p>\n<p>Once the dev box is created and ready for use, we can connect to it using the Windows App and confirm that all our customizations have been completed, and we are ready to contribute to the frontend project immediately.<\/p>\n<p><span data-ccp-props=\"{}\"> <a href=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/open-dev-box.gif\"><img decoding=\"async\" class=\"alignnone wp-image-654\" src=\"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-content\/uploads\/sites\/81\/2025\/01\/open-dev-box.gif\" alt=\"Image open dev box\" width=\"800\" height=\"450\" \/><\/a><\/span><\/p>\n<h3 aria-level=\"2\"><span data-contrast=\"none\">Conclusion<\/span><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335559738&quot;:160,&quot;335559739&quot;:80}\">\u00a0<\/span><\/h3>\n<p>Teams Customizations empowers developer teams not only to configure the tools needed to complete a project but also enables you to do this in a straightforward and autonomous way. With Dev Box, developers can focus on building solutions instead of managing environments.<\/p>\n<p>You can start working with Teams Customizations today. To learn more about the inner-workings of the functionality, take a look at the <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/dev-box\/concept-what-are-team-customizations\">docs<\/a> and <a href=\"https:\/\/aka.ms\/devbox\/feedback\">provide feedback<\/a> to the team.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The following blog walks through the experience of defining and automating the creation of developer environments with the newly announced Teams Customizations feature in Microsoft Dev Box. This allows developer team leads or managers to define the software installed by default every time a developer creates a new environment, ensuring that every team member has [&hellip;]<\/p>\n","protected":false},"author":170612,"featured_media":721,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[13,2],"class_list":["post-621","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev-box","tag-cde","tag-dev-box"],"acf":[],"blog_post_summary":"<p>The following blog walks through the experience of defining and automating the creation of developer environments with the newly announced Teams Customizations feature in Microsoft Dev Box. This allows developer team leads or managers to define the software installed by default every time a developer creates a new environment, ensuring that every team member has [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-json\/wp\/v2\/posts\/621","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-json\/wp\/v2\/users\/170612"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-json\/wp\/v2\/comments?post=621"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-json\/wp\/v2\/posts\/621\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-json\/wp\/v2\/media\/721"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-json\/wp\/v2\/media?parent=621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-json\/wp\/v2\/categories?post=621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/develop-from-the-cloud\/wp-json\/wp\/v2\/tags?post=621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}