<?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: Dor Lugasi-Gal</title>
    <description>The latest articles on DEV Community by Dor Lugasi-Gal (@dorlugasigal).</description>
    <link>https://dev.to/dorlugasigal</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%2F2871459%2F93e430cf-ea88-44c6-886a-7a9a44470699.png</url>
      <title>DEV Community: Dor Lugasi-Gal</title>
      <link>https://dev.to/dorlugasigal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dorlugasigal"/>
    <language>en</language>
    <item>
      <title>One app, two native codebases: how I keep Swift and C# in step, and ship both from one commit</title>
      <dc:creator>Dor Lugasi-Gal</dc:creator>
      <pubDate>Fri, 23 Oct 2026 08:32:18 +0000</pubDate>
      <link>https://dev.to/dorlugasigal/one-app-two-native-codebases-how-i-keep-swift-and-c-in-step-and-ship-both-from-one-commit-4k5b</link>
      <guid>https://dev.to/dorlugasigal/one-app-two-native-codebases-how-i-keep-swift-and-c-in-step-and-ship-both-from-one-commit-4k5b</guid>
      <description>&lt;p&gt;Annotator is a free, open-source app for drawing on your screen while you explain something. You pick a tool from a small floating toolbar and draw over any app: circle a number, bend an arrow to a button, highlight a line. The marks stay on screen while you keep working in the app underneath, and you can move, restyle or undo them later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foy5ykq9d01k6v0a3g29s.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foy5ykq9d01k6v0a3g29s.jpg" alt="Annotator's toolbar under a sample page: a hand-drawn ellipse around a time and a highlighted line" width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Arrows are placed point by point, so you can bend them around things. Smart Draw turns a quick sketch into a neat box or arrow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwtk1p14djhrft48tsu17.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwtk1p14djhrft48tsu17.jpg" alt="Annotator's toolbar editing a curved arrow from a Draft box to a Review ellipse" width="800" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It also zooms around the pointer, puts a spotlight on it, blurs a busy picture for a moment, and shares one part of your screen in a meeting with your drawings in it. There are about 40 tools in all, and there's a short demo on &lt;a href="https://getannotator.app" rel="noopener noreferrer"&gt;getannotator.app&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvag5lck2pp2qbgabbda1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvag5lck2pp2qbgabbda1.jpg" alt="The spotlight settings in Annotator's toolbar" width="784" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No account, nothing leaves your computer, and usage counts are off unless you turn them on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why two native apps
&lt;/h3&gt;

&lt;p&gt;It started on the Mac in Swift. When people asked for Windows, I had to decide between a cross-platform UI toolkit and a second native app.&lt;/p&gt;

&lt;p&gt;I went native twice. The overlay has to sit above every other window, pass clicks through to the app underneath, and read the screen for zoom and blur. Those are the parts where each OS has its own rules. So the Mac app is Swift, AppKit and Metal, and the Windows app is C# on .NET 10 with WinUI 3, compiled ahead of time with Native AOT.&lt;/p&gt;

&lt;p&gt;Two codebases drift apart. Here's what keeps them together, and how one GitHub Actions run ships both.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Mac is the reference
&lt;/h3&gt;

&lt;p&gt;Every behavior is defined by the Mac app first. The Windows app matches it, and "matches" has to be something a test can check, not a feeling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A conformance corpus.&lt;/strong&gt; A small Swift tool, &lt;code&gt;ConformanceExport&lt;/code&gt;, runs the Mac's annotation core and writes the results to &lt;code&gt;reference/conformance&lt;/code&gt;: how a shape is stored, where a hit test lands, how a rough ellipse is drawn for a given seed. A manifest records a SHA-256 for every file. The Windows test project reads the same files and runs the C# port against them. If the Mac changes a rule and nobody ports it, the Windows tests fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A UX reference.&lt;/strong&gt; The Mac's native UI tests can capture each panel and menu: labels, accessibility identifiers, values, order and frames. A script packs those into &lt;code&gt;reference/ux-reference&lt;/code&gt;. The Windows tests compare their own surfaces with that capture, within 1 DIP, with exact labels and order.&lt;/p&gt;

&lt;p&gt;Both folders are generated on the Mac and never edited by hand. A Mac change that affects them regenerates them in the same pull request, so the diff shows exactly what Windows now has to match.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plain rules in review.&lt;/strong&gt; Every user-visible change ships on both platforms in the same release. If something can't work the same way on Windows, it gets a written deviation in the parity docs instead of a silent difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  One commit, every channel
&lt;/h3&gt;

&lt;p&gt;A release has a lot of destinations: a signed and notarized Mac disk image and ZIP, a Sparkle update feed, a Homebrew cask, a Microsoft Store bundle, portable Windows ZIPs for winget, and the website. I wanted all of them to come from one commit, built once.&lt;/p&gt;

&lt;p&gt;The release notes live in &lt;code&gt;releases/notes.json&lt;/code&gt;. That one file produces the changelog, the GitHub release text and the app's own "What's changed" screen. When a version is ready, its entry records the exact source commit. A check then fails if any app code changed after that commit, so the thing I tested is the thing I ship.&lt;/p&gt;

&lt;p&gt;The Release workflow only starts by hand, on &lt;code&gt;main&lt;/code&gt;. It runs, roughly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Preflight&lt;/strong&gt; checks that the commit, the version and the frozen notes agree, and stops before anything is built if they don't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate&lt;/strong&gt; runs the release and packaging guards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign&lt;/strong&gt; builds the Mac app, signs it with a Developer ID, notarizes and staples it, and builds the disk image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows packages&lt;/strong&gt; builds the x64 and ARM64 Native AOT packages, the MSIX bundle and the portable ZIPs. The Windows package version is derived from the shared one, &lt;code&gt;(Major + 1).Minor.Build.0&lt;/code&gt;, because the Store wants a version that only goes up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish&lt;/strong&gt; creates the GitHub release and updates the Homebrew tap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store&lt;/strong&gt; sends the bundle to the Microsoft Store.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After that, a website workflow deploys the site and the update feeds from the published release.&lt;/p&gt;

&lt;p&gt;Secrets sit in GitHub environments, each visible only to the job that needs it, and each environment waits for my approval. Pull requests, including ones from forks, get no secrets at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Things that bit me
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A signing step failed with "a base64 signing secret is invalid". The secret it pointed at was fine. The real problem was a public key variable missing its final &lt;code&gt;=&lt;/code&gt;. Now I check every value when signing fails, not only the one I suspect.&lt;/li&gt;
&lt;li&gt;The pull request checks used &lt;code&gt;cancel-in-progress&lt;/code&gt;. Opening a labelled pull request fires two events at once, one run got cancelled, and its cancelled checks blocked the merge. The checks take seconds, so every event now gets its own run.&lt;/li&gt;
&lt;li&gt;The Microsoft Store CLI refuses every command until it has been signed in with &lt;code&gt;reconfigure&lt;/code&gt;, even setting its own options. The order matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Try it, or help
&lt;/h3&gt;

&lt;p&gt;Annotator is free and Apache-2.0: &lt;a href="https://github.com/dorlugasigal/annotator" rel="noopener noreferrer"&gt;https://github.com/dorlugasigal/annotator&lt;/a&gt;. On the Mac, &lt;code&gt;brew install --cask dorlugasigal/annotator/annotator&lt;/code&gt;. On Windows, it's in the Microsoft Store.&lt;/p&gt;

&lt;p&gt;The open issues are written so anyone can pick one up. Several need real hardware I don't have: an Intel Mac, an ARM64 PC, a pen display, a second screen at another scale. If you have one of those, an hour of testing helps a lot.&lt;/p&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/dorlugasigal" rel="noopener noreferrer"&gt;
        dorlugasigal
      &lt;/a&gt; / &lt;a href="https://github.com/dorlugasigal/annotator" rel="noopener noreferrer"&gt;
        annotator
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Draw on your screen as you explain. Native apps for macOS and Windows. Free and open source.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/dorlugasigal/annotator/.github/readme/icon.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fdorlugasigal%2Fannotator%2FHEAD%2F.github%2Freadme%2Ficon.png" width="112" height="112" alt=""&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Annotator&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Draw on your screen as you explain.&lt;/strong&gt;&lt;br&gt;
Use it in demos, reviews and lessons. Every mark stays editable
Native apps for macOS and Windows.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://getannotator.app/downloads/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/a&gt; &amp;nbsp;·&amp;nbsp;
&lt;a href="https://getannotator.app/" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt; &amp;nbsp;·&amp;nbsp;
&lt;a href="https://getannotator.app/docs/" rel="nofollow noopener noreferrer"&gt;Help&lt;/a&gt; &amp;nbsp;·&amp;nbsp;
&lt;a href="https://github.com/dorlugasigal/annotator/releases" rel="noopener noreferrer"&gt;Release notes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/dorlugasigal/annotator/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/90b31842f2bcba8fa9c38750143ec1d78860a28fd83d973aaf2a0c2c2cdd1eb0/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f646f726c756761736967616c2f616e6e6f7461746f723f696e636c7564655f70726572656c6561736573266c6162656c3d72656c6561736526636f6c6f723d666662353863266c6162656c436f6c6f723d313131393238" alt="Latest release"&gt;&lt;/a&gt;
&lt;a href="https://github.com/dorlugasigal/annotator#install" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f5908ed36b00e63cfb7541c3220decb5a361799aa952bcfcad1ce553b339b62e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d61634f532d31342532422d6538656566393f6c6162656c436f6c6f723d313131393238" alt="macOS 14 or later"&gt;&lt;/a&gt;
&lt;a href="https://github.com/dorlugasigal/annotator#install" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/779f198b99b7826ffa42ba03c5bf207e4767399347f362b4ad67adc2e917bbc2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f57696e646f77732d31312d6538656566393f6c6162656c436f6c6f723d313131393238" alt="Windows 11"&gt;&lt;/a&gt;
&lt;a href="https://github.com/dorlugasigal/annotator/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4bb52dd5fb7798e5b433baae5a3968029b621df8ad5ad6a454f31469faeafec4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302d6538656566393f6c6162656c436f6c6f723d313131393238" alt="License: Apache 2.0"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/dorlugasigal/annotator/actions/workflows/validate.yml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/edeada7df0aedf2861331368a93b653857521bd1e694e64229a6a1401231d174/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f646f726c756761736967616c2f616e6e6f7461746f722f76616c69646174652e796d6c3f6272616e63683d6d61696e266c6162656c3d4349266c6162656c436f6c6f723d313131393238" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://scorecard.dev/viewer/?uri=github.com/dorlugasigal/annotator" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/85ec20bc78087b45d306a9098b43a50cbc7b12a9322a6fd9ea4488f49d04e659/68747470733a2f2f696d672e736869656c64732e696f2f6f7373662d73636f7265636172642f6769746875622e636f6d2f646f726c756761736967616c2f616e6e6f7461746f723f6c6162656c3d4f70656e53534625323053636f726563617264266c6162656c436f6c6f723d313131393238" alt="OpenSSF Scorecard"&gt;&lt;/a&gt;
&lt;a href="https://github.com/dorlugasigal/annotator/discussions" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d6827055885136f333a3ec0cd3f5b3fc25280d5a2a466a9a6101849f1ffca552/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f64697363757373696f6e732f646f726c756761736967616c2f616e6e6f7461746f723f6c6162656c3d64697363757373696f6e7326636f6c6f723d653865656639266c6162656c436f6c6f723d313131393238" alt="Discussions"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

  
    
    &lt;span class="m-1"&gt;annotator-reel.mp4&lt;/span&gt;
    
  

  

  


&lt;p&gt;Recorded in the real Mac app, with a scripted pointer and made-up sample apps.&lt;br&gt;
Music: “Product Launch Advertising Commercial Music” by lNPLUSMUSIC, from Pixabay.&lt;/p&gt;
&lt;div class="markdown-alert markdown-alert-note"&gt;
&lt;p class="markdown-alert-title"&gt;Note&lt;/p&gt;
&lt;p&gt;Annotator is in public beta. Expect rough edges, and please
&lt;a href="https://github.com/dorlugasigal/annotator/issues/new/choose" rel="noopener noreferrer"&gt;report them&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What you can do&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Pick a tool in the floating toolbar and draw over any app. Your marks stay on
screen while you keep working in the app underneath, and you can move, restyle
or undo them later.&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="50%"&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/dorlugasigal/annotator/.github/readme/circle.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fdorlugasigal%2Fannotator%2FHEAD%2F.github%2Freadme%2Fcircle.jpg" alt="A rough teal ellipse around a number on a sample dashboard"&gt;&lt;/a&gt;&lt;br&gt;
&lt;b&gt;Circle&lt;/b&gt;&lt;br&gt;
Choose Ellipse and circle a number. The Sketchy style keeps it hand-drawn.
&lt;/td&gt;
&lt;td width="50%"&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/dorlugasigal/annotator/.github/readme/arrow.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fdorlugasigal%2Fannotator%2FHEAD%2F.github%2Freadme%2Farrow.jpg" alt="A curved blue arrow from a percentage down to a dip in a chart"&gt;&lt;/a&gt;&lt;br&gt;
&lt;b&gt;Arrow&lt;/b&gt;&lt;br&gt;
Click to place points and press Return. Drag a point to bend the arrow.
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/dorlugasigal/annotator/.github/readme/smart-draw.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fdorlugasigal%2Fannotator%2FHEAD%2F.github%2Freadme%2Fsmart-draw.jpg" alt="A neat box and arrow around a Pay now button, labelled Make it bigger"&gt;&lt;/a&gt;&lt;br&gt;
&lt;b&gt;Smart Draw&lt;/b&gt;&lt;br&gt;
Sketch a box or an arrow, and Smart Draw makes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/dorlugasigal/annotator" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>opensource</category>
      <category>swift</category>
      <category>csharp</category>
      <category>productivity</category>
    </item>
    <item>
      <title>GitHub Just Proved That Remote Terminal Access Matters - Here's the Mobile IDE I Built for It</title>
      <dc:creator>Dor Lugasi-Gal</dc:creator>
      <pubDate>Tue, 14 Apr 2026 08:54:40 +0000</pubDate>
      <link>https://dev.to/dorlugasigal/github-just-proved-that-remote-terminal-access-matters-heres-the-mobile-ide-i-built-for-it-3ng9</link>
      <guid>https://dev.to/dorlugasigal/github-just-proved-that-remote-terminal-access-matters-heres-the-mobile-ide-i-built-for-it-3ng9</guid>
      <description>&lt;p&gt;GitHub just shipped &lt;a href="https://github.blog/changelog/2026-04-13-remote-control-cli-sessions-on-web-and-mobile-in-public-preview/" rel="noopener noreferrer"&gt;&lt;code&gt;copilot --remote&lt;/code&gt;&lt;/a&gt; - the ability to stream a Copilot CLI session to your phone or browser. Claude Code has had something similar with their &lt;code&gt;--remote&lt;/code&gt; flag. The idea is the same: you should be able to reach your coding session from wherever you are.&lt;/p&gt;

&lt;p&gt;I agree. In fact, I've been building exactly that in the last month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dorlugasigal/TermBeam" rel="noopener noreferrer"&gt;TermBeam&lt;/a&gt; is an open-source tool that turns your terminal into a mobile IDE. Run &lt;code&gt;npx termbeam&lt;/code&gt;, scan the QR code, and you get a full terminal on your phone — any shell, any command, any folder. It's a PWA, so after the first scan you add it to your home screen and it's just an app. One tap and you're in, works on any device since its just a web page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxaxoswnmje6n8ohjj8qc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxaxoswnmje6n8ohjj8qc.png" alt="Copilot SDK session in TermBeam" width="430" height="932"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;TermBeam's built-in Copilot SDK integration — markdown rendering, tool call visibility, and the terminal right there on my phone.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I can be pushing my daughter on the swings at the park, or sitting in a bomb shelter during a missile alert, and still pull out my phone, open TermBeam, and create a new session in whatever folder I need. thinking retrospectively, that kind of access isn't a nice-to-have for work-life balance, it's a necessity.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx termbeam
// or
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; termbeam
termbeam
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That starts a server, prints a QR code, and when you scan it you get a real terminal session in your browser. Full PTY — whatever shell you use, whatever commands you run. It tunnels through Azure DevTunnels by default so it works from anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You start it in whatever folder you want, with whatever shell you want.&lt;/strong&gt; You're not locked into a specific tool's session model. And you can create new sessions from your phone — pick a folder, pick a shell, go.&lt;/p&gt;

&lt;p&gt;For something permanent, install it as a background service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;termbeam service &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PM2-managed, starts on boot. Your terminal is always one tap away.&lt;/p&gt;

&lt;h2&gt;
  
  
  It Runs AI Agents Too
&lt;/h2&gt;

&lt;p&gt;This is where the &lt;code&gt;copilot --remote&lt;/code&gt; connection gets interesting. TermBeam has a proper &lt;code&gt;@github/copilot-sdk&lt;/code&gt; integration — a dedicated UI pane with markdown rendering, tool call display, and a chat interface, all alongside the terminal. It's built specifically for interacting with Copilot on a small screen.&lt;/p&gt;

&lt;p&gt;On top of that, TermBeam auto-detects AI coding tools in your PATH — Copilot CLI, Claude Code, Aider, Codex, OpenCode — and lets you launch any of them from the new session dialog. One tap.&lt;/p&gt;

&lt;p&gt;So while &lt;code&gt;copilot --remote&lt;/code&gt; gives you remote access to an existing Copilot session, TermBeam gives you the ability to open a full terminal session where Copilot (or any other agent) is just one of the things you can run. Different approach to a similar idea — and they work well together.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes It Usable on a Phone
&lt;/h2&gt;

&lt;p&gt;A terminal on your phone is a gimmick unless the UX is built for touch, like the existing ssh solutions. Here's what makes the difference:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Touch bar.&lt;/strong&gt; Two rows of dedicated buttons: Esc, Copy, Paste, Home, End, ↑, ←, ↓, →, Enter, Ctrl, Shift, Tab, ^C, and a microphone for voice commands. These are the keys phone keyboards either don't have or hide behind long-presses. This makes running a Copilot session — or vim, or anything — actually practical on a phone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8nrr44bwbuhdb2klnrr6.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8nrr44bwbuhdb2klnrr6.jpeg" alt="Terminal with touch bar" width="430" height="932"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Multiple tabs at the top, git and folder context info, and the touch bar above your keyboard. This is a real session on my phone.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command palette.&lt;/strong&gt; Tap the Tools button on the top right and you get a panel with six sections: &lt;strong&gt;Session&lt;/strong&gt; (new tab, upload/download files, view markdown, close/rename/split/stop sessions, resume agent sessions), &lt;strong&gt;Search&lt;/strong&gt; (find in terminal), &lt;strong&gt;View&lt;/strong&gt; (font size, themes, port preview, code viewer, git changes), &lt;strong&gt;Share&lt;/strong&gt; (copy shareable link), &lt;strong&gt;Notifications&lt;/strong&gt; (toggle push notifications), and &lt;strong&gt;System&lt;/strong&gt; (refresh, clear terminal, about). Every feature is two taps away.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpzae6nucr1ilq68aoa8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftpzae6nucr1ilq68aoa8.jpeg" alt="Command palette" width="430" height="932"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The full command palette. Upload files, view markdown, preview a port, switch themes, check git changes — all from one panel.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sessions hub.&lt;/strong&gt; Each session gets a card showing the working directory, shell, PID, git branch, repo name, and git status — which sessions have staged changes, which are clean, how long ago they were active. The "+ New Session" button lets you create a session in any folder, right from your phone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayjea3rgn3rfbbrdqija.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayjea3rgn3rfbbrdqija.jpeg" alt="Sessions hub" width="430" height="932"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Three sessions across different projects, each showing git info and status. Tap to connect, "+ New Session" to start one anywhere.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File browser.&lt;/strong&gt; Browse the session's working directory, search files, view code, download files, and see git changes — all in a side panel. The Changes tab shows what's modified and staged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqo8ikrjdlz1ujjnek05.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqo8ikrjdlz1ujjnek05.jpeg" alt="File browser" width="430" height="932"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The file browser with Files and Changes tabs, browsing a project directory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And the rest:&lt;/strong&gt; 40 themes (yes, i got carried away lol), push notifications when commands finish, port preview that proxies your local dev server. It's a PWA with iPhone safe-area support, so it feels native.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vhko5z3iik0c54dlzgu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vhko5z3iik0c54dlzgu.png" alt=" " width="800" height="1700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood
&lt;/h2&gt;

&lt;p&gt;TermBeam spawns a PTY with your shell, serves a React frontend (xterm.js, Zustand, Radix UI) over Express, and bridges them with WebSocket. Azure DevTunnels handles the public URL, or you can choose to work on LAN. Sessions persist when you disconnect.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx termbeam                           &lt;span class="c"&gt;# default: tunnel + auto password&lt;/span&gt;
termbeam &lt;span class="nt"&gt;--password&lt;/span&gt; secret &lt;span class="nt"&gt;--lan&lt;/span&gt;       &lt;span class="c"&gt;# LAN only, custom password&lt;/span&gt;
termbeam &lt;span class="nt"&gt;--persisted-tunnel&lt;/span&gt;            &lt;span class="c"&gt;# stable URL across restarts&lt;/span&gt;
termbeam resume                        &lt;span class="c"&gt;# reconnect from CLI&lt;/span&gt;
termbeam service &lt;span class="nb"&gt;install&lt;/span&gt;               &lt;span class="c"&gt;# always-on background service&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On security — auto-generated passwords, rate-limited login (5 attempts/min/IP), httpOnly cookies, CSP and X-Frame-Options headers, WebSocket origin validation, and single-use QR auth tokens that expire in 5 minutes. Full threat model in &lt;a href="https://github.com/dorlugasigal/TermBeam/blob/main/SECURITY.md" rel="noopener noreferrer"&gt;SECURITY.md&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;1350+ tests across Windows, macOS, and Linux on Node 20, 22, and 24. The less glamorous work was the mobile edge cases — Safari viewport bugs, PTY behavior differences across platforms, WebSocket reconnection after screen locks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;TermBeam is open source, MIT licensed, v1.20.1 on npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx termbeam
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scan the QR code, add to home screen, and you've got a terminal on your phone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dorlugasigal/TermBeam" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://www.npmjs.com/package/termbeam" rel="noopener noreferrer"&gt;npm&lt;/a&gt; · &lt;a href="https://dorlugasigal.github.io/TermBeam/" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
