<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: KAMEGAWA Kazushi</title>
    <description>The latest articles on DEV Community by KAMEGAWA Kazushi (@kkamegawa).</description>
    <link>https://dev.to/kkamegawa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F468624%2F471e4ca1-5e06-48b4-84da-d7bd0f418560.jpeg</url>
      <title>DEV Community: KAMEGAWA Kazushi</title>
      <link>https://dev.to/kkamegawa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kkamegawa"/>
    <language>en</language>
    <item>
      <title>Codex for Visual Studio v0.4.0 / v0.4.1 Released</title>
      <dc:creator>KAMEGAWA Kazushi</dc:creator>
      <pubDate>Sat, 17 Oct 2026 10:09:28 +0000</pubDate>
      <link>https://dev.to/kkamegawa/codex-for-visual-studio-v040-v041-released-2f63</link>
      <guid>https://dev.to/kkamegawa/codex-for-visual-studio-v040-v041-released-2f63</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Translation note:&lt;/strong&gt; The original Japanese article was written by me. This English version was translated with the help of AI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've released v0.4.0 and v0.4.1 of &lt;strong&gt;Codex for Visual Studio&lt;/strong&gt;, a Visual Studio extension that lets you use Codex directly from Visual Studio.&lt;/p&gt;

&lt;p&gt;Version &lt;strong&gt;0.4.0&lt;/strong&gt; contains the main feature additions, while &lt;strong&gt;v0.4.1&lt;/strong&gt; includes dependency updates and smaller fixes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marketplace: &lt;a href="https://marketplace.visualstudio.com/items?itemName=KazushiKamegawa.relaytocodexforvs" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=KazushiKamegawa.relaytocodexforvs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;v0.4.0 Release Notes: &lt;a href="https://github.com/kkamegawa/vsextensionforcodex/releases/tag/v0.4.0" rel="noopener noreferrer"&gt;https://github.com/kkamegawa/vsextensionforcodex/releases/tag/v0.4.0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;v0.4.1 Release Notes: &lt;a href="https://github.com/kkamegawa/vsextensionforcodex/releases/tag/v0.4.1" rel="noopener noreferrer"&gt;https://github.com/kkamegawa/vsextensionforcodex/releases/tag/v0.4.1&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main changes in this release are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Improved Goal / Plan mode behavior&lt;/li&gt;
&lt;li&gt;Remote Codex App Server support (Experimental)&lt;/li&gt;
&lt;li&gt;MXC sandbox support&lt;/li&gt;
&lt;li&gt;Updated for Codex CLI 0.162.1&lt;/li&gt;
&lt;li&gt;Other bug fixes&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Improved Goal / Plan Mode Behavior
&lt;/h2&gt;

&lt;p&gt;Previously, when a goal started with &lt;code&gt;/goal&lt;/code&gt; was running, the button remained labeled &lt;strong&gt;Send&lt;/strong&gt;, making it impossible to stop execution.&lt;/p&gt;

&lt;p&gt;Starting with v0.4.0, the button changes to &lt;strong&gt;Stop&lt;/strong&gt; whenever a goal is active, including between turns during automatic continuation.&lt;/p&gt;

&lt;p&gt;When Stop is pressed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The goal is paused while preserving its objective, budget, and usage.&lt;/li&gt;
&lt;li&gt;The latest turn in the thread is interrupted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Timed-out operations are treated as having an unknown outcome and are &lt;strong&gt;not retried automatically&lt;/strong&gt;, preventing unexpected re-execution.&lt;/p&gt;

&lt;p&gt;Plan mode received several related improvements:&lt;/p&gt;

&lt;h3&gt;
  
  
  Persistent Plan Mode
&lt;/h3&gt;

&lt;p&gt;A checkbox has been added to the composer.&lt;/p&gt;

&lt;p&gt;Using &lt;code&gt;/plan&lt;/code&gt; also enables it.&lt;/p&gt;

&lt;p&gt;Once enabled, Plan mode stays active until explicitly turned off, even if turns complete, fail, or are interrupted. If Codex asks follow-up questions, Plan mode remains active throughout the conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Codex-style Plan Presentation
&lt;/h3&gt;

&lt;p&gt;Suggested plans are displayed as Markdown under &lt;strong&gt;"Proposed plan"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When a plan turn finishes, an &lt;strong&gt;"Implement this plan?"&lt;/strong&gt; card appears, allowing you to either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proceed with implementation&lt;/li&gt;
&lt;li&gt;Continue refining the plan&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Experimental API Detection
&lt;/h3&gt;

&lt;p&gt;Plan mode relies on the App Server's experimental &lt;code&gt;collaborationMode&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;Because Codex rejects this field when Experimental APIs are unavailable, the extension now determines availability based on the currently negotiated connection rather than saved settings.&lt;/p&gt;

&lt;p&gt;When unsupported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Plan checkbox becomes disabled&lt;/li&gt;
&lt;li&gt;Entering &lt;code&gt;/plan&lt;/code&gt; explains how to enable the feature&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  One Question at a Time
&lt;/h3&gt;

&lt;p&gt;When multiple questions arrive, they are presented individually using a &lt;strong&gt;"Question n of N"&lt;/strong&gt; workflow.&lt;/p&gt;

&lt;p&gt;This also fixes earlier issues where answer choices could become partially hidden.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stop Works After Questions and Implementation
&lt;/h3&gt;

&lt;p&gt;Fixed an issue where the Stop button stopped working after:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starting implementation from a plan&lt;/li&gt;
&lt;li&gt;Answering a question&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choices Embedded in Text Become Cards
&lt;/h3&gt;

&lt;p&gt;When Codex returns numbered or bulleted choices in normal text, those options are now converted into interactive question cards.&lt;/p&gt;

&lt;h3&gt;
  
  
  v0.4.1 Goal Confirmation Fix
&lt;/h3&gt;

&lt;p&gt;v0.4.1 fixes an issue where the final goal confirmation message failed to display the Yes/No card if the confirmation text was formatted in bold Markdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Connect to a Remote Codex App Server (Experimental)
&lt;/h2&gt;

&lt;p&gt;The extension can now connect to an already-running Codex App Server through WebSocket.&lt;/p&gt;

&lt;p&gt;This feature is currently marked as &lt;strong&gt;Experimental&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The default behavior remains unchanged:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The extension launches &lt;code&gt;codex app-server&lt;/code&gt; locally as a child process.&lt;/li&gt;
&lt;li&gt;Communication uses stdio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Internally, the extension still communicates with its local Worker. The Worker decides whether the backend transport should be stdio or WebSocket.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security and Connection Design
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Remote connections require &lt;code&gt;wss&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Plain &lt;code&gt;ws&lt;/code&gt; is allowed only for loopback (&lt;code&gt;localhost&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Certificate validation cannot be disabled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Authentication uses Bearer tokens.&lt;/p&gt;

&lt;p&gt;Profiles store only the path to the token file.&lt;/p&gt;

&lt;p&gt;The Worker reads the token during connection establishment, and the token itself is never persisted in configuration files or logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Path Mapping
&lt;/h3&gt;

&lt;p&gt;The extension maps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local solution root&lt;/li&gt;
&lt;li&gt;Remote server root&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Path matching is performed component-by-component rather than through string replacement.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;will not match:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\repo2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The implementation should also reject paths that escape through symlinks or junctions, although I have not yet fully validated those scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connection Isolation
&lt;/h3&gt;

&lt;p&gt;Approvals, caches, and related state are isolated by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connection&lt;/li&gt;
&lt;li&gt;Account&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents leakage between different server connections.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reconnection Behavior
&lt;/h3&gt;

&lt;p&gt;When a connection drops:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic reconnection is attempted&lt;/li&gt;
&lt;li&gt;Draft messages remain in memory&lt;/li&gt;
&lt;li&gt;Operations with unknown delivery status are never retried automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Separate Commands
&lt;/h3&gt;

&lt;p&gt;Local connections use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Restart local app-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remote connections use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reconnect remote app-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The extension never attempts to stop a remote server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup Guide
&lt;/h3&gt;

&lt;p&gt;I also added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;doc/codex-cli-setup.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;doc/codex-cli-setup_ja.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The guide covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI installation&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Configuration files&lt;/li&gt;
&lt;li&gt;Connection target settings&lt;/li&gt;
&lt;li&gt;Remote App Server setup&lt;/li&gt;
&lt;li&gt;Reconnection&lt;/li&gt;
&lt;li&gt;Diagnostics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So far I've only tested loopback connections on the same machine.&lt;/p&gt;

&lt;p&gt;I haven't yet validated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross-machine connections&lt;/li&gt;
&lt;li&gt;TLS deployments&lt;/li&gt;
&lt;li&gt;Cross-platform path translation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try those scenarios, I'd love to hear your feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. MXC Sandbox Support
&lt;/h2&gt;

&lt;p&gt;For local App Server scenarios, you can now choose MXC as the Windows sandbox backend.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Windows sandbox&lt;/strong&gt; panel now provides three options:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Follow Codex configuration&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Uses Codex configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prefer MXC&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-c features.prefer_mxc=true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uses MXC when policy permits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Require MXC&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-c windows.sandbox=mxc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Always uses MXC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Changes take effect the next time the local App Server starts.&lt;/p&gt;

&lt;p&gt;Remote profiles are unaffected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sandbox Status
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Check sandbox status&lt;/strong&gt; action shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Effective configuration&lt;/li&gt;
&lt;li&gt;Policy status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although it cannot determine which backend executed a specific command.&lt;/p&gt;

&lt;p&gt;MXC itself requires no setup.&lt;/p&gt;

&lt;p&gt;The elevated/unelevated setup options shown in the UI apply only to the traditional sandbox backends.&lt;/p&gt;

&lt;h3&gt;
  
  
  MXC Observation
&lt;/h3&gt;

&lt;p&gt;While testing, I noticed that force-terminating only the root Codex process under MXC may leave child processes running.&lt;/p&gt;

&lt;p&gt;This does not occur with the unelevated backend.&lt;/p&gt;

&lt;p&gt;Since the extension shuts down the entire process tree, users should not encounter this issue during normal use.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Updated for Codex CLI 0.162.1
&lt;/h2&gt;

&lt;p&gt;Communication with the App Server has been updated for compatibility with &lt;strong&gt;Codex CLI 0.162.1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Because some remote servers may still use older versions, I continue to keep &lt;strong&gt;0.159.1&lt;/strong&gt; available for regression testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extension ↔ Worker Protocol Updates
&lt;/h3&gt;

&lt;p&gt;The protocol version between the extension and Worker has also been updated.&lt;/p&gt;

&lt;p&gt;Version 23 introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Experimental API status reporting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;which enables the new Plan mode availability checks.&lt;/p&gt;

&lt;p&gt;MXC support adds protocol version 24.&lt;/p&gt;

&lt;p&gt;Unsupported combinations fail safely rather than attempting to continue with incompatible behavior.&lt;/p&gt;

&lt;p&gt;Additional 0.162.1-related changes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Goal operations now send &lt;code&gt;origin: "user"&lt;/code&gt; for proper authorization handling&lt;/li&gt;
&lt;li&gt;MCP OAuth completion is matched using &lt;code&gt;loginId&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Skill paths are now treated as server-provided identifiers rather than requiring absolute paths&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Other Notable Fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fixed a banner that failed to disappear after successful manual reconnection&lt;/li&gt;
&lt;li&gt;Fixed a state where loading a remote token could leave the UI stuck at "Connecting / Checking account"&lt;/li&gt;
&lt;li&gt;Improved readability of question cards in dark themes by using Visual Studio theme resources&lt;/li&gt;
&lt;li&gt;Added an &lt;strong&gt;MCP details&lt;/strong&gt; toggle to collapse MCP server information&lt;/li&gt;
&lt;li&gt;Missing or unreadable attachments now cause send operations to fail instead of being silently skipped&lt;/li&gt;
&lt;li&gt;v0.4.1 updates NuGet dependencies, including MessagePack packages affected by a published vulnerability&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;This release primarily focuses on improving Goal and Plan mode usability while laying the groundwork for remote connectivity.&lt;/p&gt;

&lt;p&gt;Remote App Server support is still experimental, so please file an issue if you encounter problems.&lt;/p&gt;

&lt;p&gt;To install:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download &lt;code&gt;Codex.VisualStudio.Extension.vsix&lt;/code&gt; from GitHub Releases and double-click it, or&lt;/li&gt;
&lt;li&gt;Install directly from the Visual Studio Marketplace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Visual Studio 17.14 or later is required.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;After .NET 8 reaches end-of-support, I plan to fully migrate the extension to &lt;strong&gt;.NET 10&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At that point, &lt;strong&gt;Visual Studio 2026 or later&lt;/strong&gt; will be required.&lt;/p&gt;

</description>
      <category>visualstudio</category>
      <category>codex</category>
    </item>
    <item>
      <title>I Built RelayPublisher: A winget-like Publishing Workflow for Microsoft Intune</title>
      <dc:creator>KAMEGAWA Kazushi</dc:creator>
      <pubDate>Tue, 01 Sep 2026 05:09:19 +0000</pubDate>
      <link>https://dev.to/kkamegawa/i-built-relaypublisher-a-winget-like-publishing-workflow-for-microsoft-intune-1oep</link>
      <guid>https://dev.to/kkamegawa/i-built-relaypublisher-a-winget-like-publishing-workflow-for-microsoft-intune-1oep</guid>
      <description>&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Note about this article
&lt;/h2&gt;

&lt;p&gt;The original version of this article was written entirely by me in Japanese.&lt;/p&gt;

&lt;p&gt;I used AI to translate and polish the English version for a global audience, but the ideas, design decisions, implementation details, and original content are all my own work.&lt;/p&gt;

&lt;p&gt;If you'd like to read the original Japanese article, you can find it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kkamegawa.hatenablog.jp/entry/2026/08/30/220813" rel="noopener noreferrer"&gt;https://kkamegawa.hatenablog.jp/entry/2026/08/30/220813&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Managing Intune Apps as Code with RelayPublisher
&lt;/h2&gt;

&lt;p&gt;Managing custom applications in Microsoft Intune has always felt more complicated than it should be.&lt;/p&gt;

&lt;p&gt;When you need to publish an internal application, you typically have a few options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Register it manually through the Intune portal&lt;/li&gt;
&lt;li&gt;Use one of the sample PowerShell scripts available online&lt;/li&gt;
&lt;li&gt;Build your own automation around Microsoft Graph APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these approaches work, but none of them feel particularly developer-friendly.&lt;/p&gt;

&lt;p&gt;In my case, the process was even more frustrating because I normally don't operate with elevated privileges. Every time I needed to publish or update an application, I had to perform a PIM elevation before making changes.&lt;/p&gt;

&lt;p&gt;That led me to a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why can't Intune application publishing work more like winget?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wanted a workflow where application definitions could live in source control, be described in YAML, and be published automatically through CI/CD.&lt;/p&gt;

&lt;p&gt;That idea became &lt;strong&gt;RelayPublisher&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kkamegawa" rel="noopener noreferrer"&gt;
        kkamegawa
      &lt;/a&gt; / &lt;a href="https://github.com/kkamegawa/Relaypublisher" rel="noopener noreferrer"&gt;
        Relaypublisher
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Relaypublisher&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Relaypublisher publishes winget-like YAML manifests as Microsoft Intune LOB apps from CI.&lt;/p&gt;
&lt;p&gt;Distribution:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NuGet global tool package id: &lt;code&gt;relaypublisher&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Command name: &lt;code&gt;relaypublisher&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Package version: injected by CI from Git tag &lt;code&gt;vX.Y.Z&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Feeds: nuget.org, GitHub Packages (this repository), and Azure Artifacts&lt;/li&gt;
&lt;li&gt;Self-contained single-file apps for &lt;code&gt;win-x64&lt;/code&gt;, &lt;code&gt;win-arm64&lt;/code&gt;, and &lt;code&gt;osx-arm64&lt;/code&gt; are attached to each
GitHub release. They are neither code-signed nor notarized, so macOS shows a Gatekeeper warning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quick install:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;dotnet tool install --global relaypublisher&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;See &lt;a href="https://github.com/kkamegawa/Relaypublisher/doc/05-operation.md#0-tool-installation-and-version-control" rel="noopener noreferrer"&gt;doc/05-operation.md&lt;/a&gt; for installing
from GitHub Packages or Azure Artifacts instead.&lt;/p&gt;
&lt;p&gt;The repository now contains the .NET CLI foundation for the normal workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;validate&lt;/code&gt; checks manifest schema rules and repository-wide identity uniqueness.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plan&lt;/code&gt; resolves the target manifest set once and writes &lt;code&gt;manifest-list.json&lt;/code&gt; for later CI jobs.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;package&lt;/code&gt; stages app files: Windows Win32 &lt;code&gt;.intunewin&lt;/code&gt; packages (Windows runner required) or a
staged, checksum-verified macOS &lt;code&gt;.pkg&lt;/code&gt; (any OS).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;publish&lt;/code&gt; creates or updates Intune apps, uploads packaged content…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kkamegawa/Relaypublisher" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;/h2&gt;

&lt;h2&gt;
  
  
  What is RelayPublisher?
&lt;/h2&gt;

&lt;p&gt;RelayPublisher is an open-source tool that allows you to define Intune applications using YAML and publish them through automation.&lt;/p&gt;

&lt;p&gt;Instead of clicking through the Intune portal, you manage application definitions as code.&lt;/p&gt;

&lt;p&gt;If you're already familiar with Infrastructure as Code (IaC) or GitOps practices, the concept should feel natural.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;Historically, building this type of tool felt like a lot of work.&lt;/p&gt;

&lt;p&gt;There are many moving parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft Graph integration&lt;/li&gt;
&lt;li&gt;Intune packaging&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Configuration management&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The emergence of generative AI significantly reduced the effort required to create and maintain a project like this. Tasks that would previously have been tedious became much easier to implement.&lt;/p&gt;

&lt;p&gt;As a result, I was finally able to build the tool I had wanted for a long time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;YAML-based application definitions&lt;/li&gt;
&lt;li&gt;CI/CD-friendly workflow&lt;/li&gt;
&lt;li&gt;Microsoft Intune integration&lt;/li&gt;
&lt;li&gt;Source-controlled application management&lt;/li&gt;
&lt;li&gt;Support for GitHub and Azure Repos workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A sample YAML definition is included in the repository to help you get started quickly.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
&lt;span class="na"&gt;SchemaVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0"&lt;/span&gt;
&lt;span class="na"&gt;PackageIdentifier&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Microsoft.PowerShell&lt;/span&gt;
&lt;span class="na"&gt;PackageName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PowerShell&lt;/span&gt;
&lt;span class="na"&gt;Developer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Microsoft Corporation&lt;/span&gt;
&lt;span class="na"&gt;Publisher&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Microsoft Corporation&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PowerShell 7 cross-platform automation and configuration tool.&lt;/span&gt;
&lt;span class="na"&gt;PackageVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;7.6.5&lt;/span&gt;
&lt;span class="na"&gt;AssignmentSync&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;merge&lt;/span&gt;

&lt;span class="na"&gt;Apps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;macos&lt;/span&gt;
    &lt;span class="na"&gt;Architecture&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arm64&lt;/span&gt;
    &lt;span class="na"&gt;InstallerType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pkg&lt;/span&gt;
    &lt;span class="c1"&gt;# pkg (default): unmanaged macOSPkgApp, unsigned allowed, up to 8 GB, and the&lt;/span&gt;
    &lt;span class="c1"&gt;# only AppType that can target MinimumOSVersion 14+ (v14_0/v15_0 are beta-only&lt;/span&gt;
    &lt;span class="c1"&gt;# flags; see doc/01-manifest-schema.md 5.7 and MacOsMinimumOperatingSystemTable).&lt;/span&gt;
    &lt;span class="na"&gt;AppType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pkg&lt;/span&gt;
    &lt;span class="na"&gt;DisplayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PowerShell [macOS ARM64]&lt;/span&gt;

    &lt;span class="c1"&gt;# Single Source item for macOS (unified source item shape, doc/01-manifest-schema.md 5.0.1).&lt;/span&gt;
    &lt;span class="c1"&gt;# PowerShell/PowerShell is a public repository, so Auth.Type: none is enough&lt;/span&gt;
    &lt;span class="c1"&gt;# for anonymous asset download.&lt;/span&gt;
    &lt;span class="na"&gt;Source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;githubRelease&lt;/span&gt;
      &lt;span class="na"&gt;Owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PowerShell&lt;/span&gt;
      &lt;span class="na"&gt;Repository&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PowerShell&lt;/span&gt;
      &lt;span class="na"&gt;Tag&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v7.6.5&lt;/span&gt;
      &lt;span class="na"&gt;AssetName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;powershell-7.6.5-osx-arm64.pkg&lt;/span&gt;
      &lt;span class="na"&gt;Destination&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;powershell-7.6.5-osx-arm64.pkg&lt;/span&gt;
      &lt;span class="na"&gt;Sha256&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;6ea58f4e91ab2df133ac18a42e291e4e870a623e3c5ab6f8368259cd9ac22770"&lt;/span&gt;
      &lt;span class="na"&gt;Auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;none&lt;/span&gt;

    &lt;span class="na"&gt;Requirements&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# PowerShell 7.6 (LTS) supports macOS 14 (Sonoma), 15 (Sequoia), and 26 (Tahoe).&lt;/span&gt;
      &lt;span class="c1"&gt;# 14.0 is the lowest version Relaypublisher's version table can map (26.0 is not&lt;/span&gt;
      &lt;span class="c1"&gt;# yet defined there); AppType: pkg allows the beta-only v14_0 flag.&lt;/span&gt;
      &lt;span class="na"&gt;MinimumOSVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;15.0"&lt;/span&gt;

    &lt;span class="na"&gt;Detection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;IgnoreAppVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="na"&gt;IncludedApps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;BundleId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;com.microsoft.powershell&lt;/span&gt;
          &lt;span class="na"&gt;BundleVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;7.6.5&lt;/span&gt;

    &lt;span class="c1"&gt;# Optional, AppType: pkg only (doc/01-manifest-schema.md §5.4.2): pre/post-install&lt;/span&gt;
    &lt;span class="c1"&gt;# shell scripts, mapped to Graph macOSPkgApp.preInstallScript/postInstallScript.&lt;/span&gt;
    &lt;span class="c1"&gt;# Paths are relative to --repo-root (samples/, per this file's own README).&lt;/span&gt;
    &lt;span class="na"&gt;Scripts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;PreInstall&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;scripts/macos/powershell/preinstall.sh&lt;/span&gt;
      &lt;span class="na"&gt;PostInstall&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;scripts/macos/powershell/postinstall.sh&lt;/span&gt;

    &lt;span class="c1"&gt;# Left empty so this manifest applies unmodified in any tenant. Add your own&lt;/span&gt;
    &lt;span class="c1"&gt;# target group(s) before a real (non-dry-run) publish, for example:&lt;/span&gt;
    &lt;span class="c1"&gt;# Assignments:&lt;/span&gt;
    &lt;span class="c1"&gt;#   - Target: group&lt;/span&gt;
    &lt;span class="c1"&gt;#     GroupId: "&amp;lt;your-assignment-group-guid&amp;gt;"&lt;/span&gt;
    &lt;span class="c1"&gt;#     Intent: required&lt;/span&gt;
    &lt;span class="na"&gt;Assignments&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>opensource</category>
      <category>dotnet</category>
      <category>microsoft</category>
      <category>intune</category>
    </item>
    <item>
      <title>Visual Studio 2022 Memory Eater Extension</title>
      <dc:creator>KAMEGAWA Kazushi</dc:creator>
      <pubDate>Fri, 18 Jun 2021 11:19:02 +0000</pubDate>
      <link>https://dev.to/kkamegawa/visual-studio-2022-memory-eater-extension-4iem</link>
      <guid>https://dev.to/kkamegawa/visual-studio-2022-memory-eater-extension-4iem</guid>
      <description>&lt;p&gt;I had just published simple extension for Visual Studio 2022 Preview 1.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kkamegawa/memoryeaterextension"&gt;GitHub/kkamegawa/memoryeaterextension&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yC5_qQds--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aq1zophdaha135gvfq4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yC5_qQds--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aq1zophdaha135gvfq4y.png" alt="Over 2GB use in Visual Studio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This extension will not publish to marketplace. &lt;/p&gt;

&lt;p&gt;It's simple memory eater extension :-).&lt;/p&gt;

</description>
      <category>visualstudio</category>
    </item>
  </channel>
</rss>
