<?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: Ryan Swift</title>
    <description>The latest articles on DEV Community by Ryan Swift (@thisisryanswift).</description>
    <link>https://dev.to/thisisryanswift</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3669112%2F4911d3fc-6abb-4012-98b2-bfe70a261034.jpeg</url>
      <title>DEV Community: Ryan Swift</title>
      <link>https://dev.to/thisisryanswift</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thisisryanswift"/>
    <language>en</language>
    <item>
      <title>Mac-Only? Just Fork It</title>
      <dc:creator>Ryan Swift</dc:creator>
      <pubDate>Wed, 06 May 2026 23:26:00 +0000</pubDate>
      <link>https://dev.to/thisisryanswift/mac-only-just-fork-it-57ka</link>
      <guid>https://dev.to/thisisryanswift/mac-only-just-fork-it-57ka</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR - A friend showed me a small macOS-only menu bar app that lists local dev ports. I'm one of the dozens of people who uses Linux (Fedora KDE in particular) as my primary operating system. I used OpenCode to fork and create a working KDE Plasma widget called &lt;a href="https://github.com/thisisryanswift/portmanteau" rel="noopener noreferrer"&gt;Portmanteau&lt;/a&gt;.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;I keep encountering the same problem: I see a cool, new AI or developer tool that I want to try, except they all seem to be macOS only. A few years ago that usually meant time to move on. Now I tend to think, "I can probably fork that."&lt;/p&gt;

&lt;p&gt;This time the tool was &lt;a href="https://github.com/wieandteduard/port-menu" rel="noopener noreferrer"&gt;Port Menu&lt;/a&gt;, a simple little macOS menu bar app for seeing local development servers. If you run a bunch of Vite, Rails, Django, Flask, Next.js, or whatever servers during the day, the basic idea is obvious: show me the ports, tell me which project owns them, and let me open or kill them without spelunking through terminal tabs.&lt;/p&gt;

&lt;p&gt;But again, macOS-only, so I did what any enterprising vibe coder would do. I started an OpenCode session with a pretty low-stakes question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This looks macOS only. how feasible would a port to linux be?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Asking More Questions
&lt;/h2&gt;

&lt;p&gt;The first answer was optimistic in the way AI and agents often are. The port scanning idea is very portable. Linux has &lt;code&gt;ss&lt;/code&gt;, &lt;code&gt;lsof&lt;/code&gt;, &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/cwd&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;kill&lt;/code&gt;, and all the raw ingredients you need.&lt;/p&gt;

&lt;p&gt;But the app itself was not going to be a normal port. The original is a SwiftUI/AppKit menu bar app. A KDE version wants to be a Plasma widget. That means QML, Plasma packaging, a panel representation, a popup, and a different set of desktop integration edges.&lt;/p&gt;

&lt;p&gt;After some poking and additional questioning, the answer got less shiny and more useful. This was not really a port. It was a KDE reimplementation of the same idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The algorithm is portable.&lt;/li&gt;
&lt;li&gt;The Swift UI is not worth trying to reuse.&lt;/li&gt;
&lt;li&gt;A KDE Plasma widget is a good target for my actual desktop.&lt;/li&gt;
&lt;li&gt;The scanner should be a small helper that emits JSON.&lt;/li&gt;
&lt;li&gt;The widget should stay mostly UI-focused.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That became the shape of the project: a Linux scanner plus a Plasma 6 widget.&lt;/p&gt;

&lt;h2&gt;
  
  
  Planning Using Tickets (tk)
&lt;/h2&gt;

&lt;p&gt;The next thing I asked for was a plan. And then captured it using &lt;a href="https://github.com/wedow/ticket" rel="noopener noreferrer"&gt;ticket&lt;/a&gt; &lt;code&gt;tk&lt;/code&gt;. I really dig ticket and recommend it if you're working with agents.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can you plan out the steps/tickets that we need to create this? Let's use tk (ticket) to create epics/tasks/etc.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My agent proposed five epics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux Scanner Core&lt;/li&gt;
&lt;li&gt;KDE Plasma Widget MVP&lt;/li&gt;
&lt;li&gt;User Actions and Safety&lt;/li&gt;
&lt;li&gt;Packaging and Local Install&lt;/li&gt;
&lt;li&gt;Polish, Reliability, and Release Readiness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent created 38 tickets as part of those epics, added dependencies, and &lt;code&gt;tk ready&lt;/code&gt; gave us an implementation order. This is when a project crosses from "exploratory chat" to "work queue".&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%2F1wmu8obx6cimm9lmopcd.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%2F1wmu8obx6cimm9lmopcd.png" alt=" " width="800" height="975"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I then made the irresponsible request:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can you work on implementing this? Ideally don't stop until all tickets are completed :)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And it mostly did.&lt;/p&gt;

&lt;h2&gt;
  
  
  What The Agent Built
&lt;/h2&gt;

&lt;p&gt;The agent built the Linux version as a separate &lt;code&gt;linux/&lt;/code&gt; tree so the original macOS app stayed untouched. That feels like the right shape: keep the idea, do not pretend the SwiftUI app was coming with us.&lt;/p&gt;

&lt;p&gt;The important pieces were a Python scanner, a JSON contract, and a Plasma widget. The scanner figures out what is listening locally and the widget turns that into a panel popup I can actually use.&lt;/p&gt;

&lt;p&gt;It also added the first set of actions: open, copy URL, copy port, and kill. Some of those survived. Copy port did not.&lt;/p&gt;

&lt;p&gt;The agent closed all its own tickets too. I do not think of "all tickets closed" as a quality signal, so I did a review pass. That caught real problems: packaging was too fragile, scanner timeouts could break the JSON contract, and Plasma had a few runtime quirks that only show up when you actually run the thing.&lt;/p&gt;

&lt;p&gt;This is part of the loop. Ask a question. Plan. Implement. Review. Test.&lt;/p&gt;

&lt;h2&gt;
  
  
  User Testing
&lt;/h2&gt;

&lt;p&gt;After some agent work, it was my time to test and complain about rough edges.&lt;/p&gt;

&lt;p&gt;I had the agent install and activate the plugin. I realized I didn't have any local dev ports that were currently in use. But again, not a problem. We have agents. I just asked the agent to start a tiny Flask server to test detection. The scanner saw it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"processName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cwd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/tmp/opencode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"projectName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"opencode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:5000"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the addictive part of agentic development. A random idea becomes a panel widget, then a test server shows up in it, and suddenly the thing is real enough to complain about.&lt;/p&gt;

&lt;p&gt;One button was blank because the icon name did not exist in my Plasma theme. That button was supposed to mean "copy port." The second button already looked like copy. So I asked the obvious question.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;why are there two copy-looking actions next to each other?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My agent simplified to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open&lt;/li&gt;
&lt;li&gt;Copy URL&lt;/li&gt;
&lt;li&gt;Kill&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then kill did not work from the widget, even though the helper worked directly. The confirmation dialog path was broken. We made the red X kill immediately, which matches what the icon implies anyway.&lt;/p&gt;

&lt;p&gt;This is where I still feel involved in the loop. The agent can implement the feature, but it cannot feel that a tiny blank square in my panel is weird. It cannot be annoyed by two copy buttons. It cannot look at a red X that does not kill the thing and say, "no, that feels wrong."&lt;/p&gt;

&lt;h2&gt;
  
  
  Port Menu to Portmanteau
&lt;/h2&gt;

&lt;p&gt;While my agent was busy working on the app, I had time for other important endeavors. Like renaming the project. Portmanteau sounds sorta like Port Menu and sorta is itself a portmanteau. Feels a little old timey to me. I thought it was clever. I'm not sure if you'll agree with me. I also had time to switch to a ship icon because I felt like that was clever too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Workflow is the Learning Here
&lt;/h2&gt;

&lt;p&gt;This is not a full, traditional software project. It's a small piece of personal software. It was ~10 messages back and forth with an agent. But it's legitimately useful to me. The productive loop was small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask if an idea is feasible.&lt;/li&gt;
&lt;li&gt;Push back on the optimistic parts.&lt;/li&gt;
&lt;li&gt;Fork or build off existing progress.&lt;/li&gt;
&lt;li&gt;Plan and actually use the plan (I do this with ticket).&lt;/li&gt;
&lt;li&gt;Let the agent chew through implementation.&lt;/li&gt;
&lt;li&gt;Try it out on the real desktop.&lt;/li&gt;
&lt;li&gt;Complain about the parts that feel wrong.&lt;/li&gt;
&lt;li&gt;Get it into a usable shape.&lt;/li&gt;
&lt;/ul&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%2F8eqzla7zqzx5fifhayye.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%2F8eqzla7zqzx5fifhayye.png" alt=" " width="383" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is an excellent agent task: small enough to steer, annoying enough that I would not have done it by hand, and concrete enough that I could tell when it worked.&lt;/p&gt;

&lt;p&gt;Think about all the rough edges in your life that you can solve with 10 questions and an overeager intern.&lt;/p&gt;

&lt;p&gt;I'm going to continue to find cool ideas that are macOS only. I'm gonna continue to fork them. Translating ideas or projects across operating systems no longer feels like a giant project. Sometimes it is just a conversation with an agent, a few questions, and a tiny ship icon in your system tray.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/thisisryanswift/portmanteau" rel="noopener noreferrer"&gt;Portmanteau&lt;/a&gt; is a KDE Plasma widget for local development ports. It is still rough, but it works on my Fedora KDE setup. And that's all I need :)&lt;/p&gt;

</description>
      <category>agents</category>
      <category>linux</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Stop Using Your Clipboard to Share Context</title>
      <dc:creator>Ryan Swift</dc:creator>
      <pubDate>Thu, 30 Apr 2026 16:27:59 +0000</pubDate>
      <link>https://dev.to/thisisryanswift/stop-using-your-clipboard-to-share-context-3941</link>
      <guid>https://dev.to/thisisryanswift/stop-using-your-clipboard-to-share-context-3941</guid>
      <description>&lt;p&gt;We're all learning how to code with agents. If you're "in the bubble" it can feel like everyone is tokenmaxxing. Automating everything. Spinning up overnight agents to write full apps while they sleep. The reality I see with a lot of developers is much more normal:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;They are copying and pasting code back and forth from VS Code and ChatGPT.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I am seeing slow adoption of built-in chat interfaces in IDEs like Copilot, Cursor, and Antigravity. CLI agents still feel relatively fringe among next-gen developers. I know this likely is not what you're hearing or seeing on Twitter.&lt;/p&gt;

&lt;p&gt;Anyway, I've roasted plenty of developers for copying code back and forth from their IDEs into web chat interfaces. This week, I realized I have been doing the same thing, just with more terminal panes. A test fails in one terminal pane. An agent is working in another. I copy the error, paste it into the agent, wait, run another command, copy the next error, paste again.&lt;/p&gt;

&lt;p&gt;My cool hacker-y CLI workflow suddenly felt... less cool.&lt;/p&gt;

&lt;p&gt;The obvious fix is: let the agent read the terminal. The less obvious problem is: I do not want agents casually reading every terminal pane I have open. &lt;/p&gt;

&lt;h2&gt;
  
  
  The CLI Version Of Copy/Paste
&lt;/h2&gt;

&lt;p&gt;I use &lt;a href="https://zellij.dev/" rel="noopener noreferrer"&gt;Zellij&lt;/a&gt; as my terminal multiplexer. If you have used Tmux, it is the same general idea: panes, tabs, sessions, and a bunch of terminal state living in one place. I really like Zellij. I struggled with Tmux for whatever reason and never looked back. I seem to be in a minority here though.&lt;/p&gt;

&lt;p&gt;I use a variety of CLI coding agents: OpenCode, Gemini CLI, Claude Code, Codex, and whatever else I am trying that week.&lt;/p&gt;

&lt;p&gt;A normal tab looks like OpenCode on the left, and one or two panes on the right for running commands, observing tests, or watching a dev server.&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%2Fe07i0qca15l2io8hbp3h.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%2Fe07i0qca15l2io8hbp3h.png" alt=" " width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But the panes are distinct. Agents do not automatically know what happened in the test pane. My test pane does not know what the agent is trying to debug. So I become the bridge, manually ferrying errors and logs back and forth. &lt;em&gt;Copying and pasting.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Integrated agent shells help sometimes, but they are not the whole answer. Long-running commands eat up agent time. Many commands need elevated permissions. Plus, I already have a terminal layout and workflow I like.&lt;/p&gt;

&lt;p&gt;I did not want to move everything into the agent. I wanted the agent to see what I see.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything Means Everything
&lt;/h2&gt;

&lt;p&gt;The naive version of my project was easy: give the agent full  access. Let it read the whole Zellij session. And call it a day.&lt;/p&gt;

&lt;p&gt;Except... secrets and security are a thing. I already play it too fast and loose with my agents. I'm trying to be better about that. I needed selected-pane awareness, not full terminal visibility.&lt;/p&gt;

&lt;p&gt;That became the design constraint for &lt;a href="https://github.com/thisisryanswift/zellij-agent-tools" rel="noopener noreferrer"&gt;&lt;code&gt;zellij-agent-tools&lt;/code&gt;&lt;/a&gt;: agents should only read panes I explicitly approve, and that approval should be visible where the pane actually lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zellij As The Consent Surface
&lt;/h2&gt;

&lt;p&gt;The project is a Zellij plugin plus a local MCP sidecar.&lt;/p&gt;

&lt;p&gt;The Zellij plugin is the human-facing part. It lists panes, asks for approval, marks watched panes, and lets me revoke access.&lt;/p&gt;

&lt;p&gt;The sidecar is the agent-facing part. It exposes a small set of MCP tools so agents can list watched panes and read bounded output from the panes I approved.&lt;/p&gt;

&lt;p&gt;I did not want consent hidden inside an agent chat. I can see the agent calling the tools in line, but I approve it in the Zellij plugin. I wanted separate surfaces. MCP is the agent interface. Zellij is the human interface.&lt;/p&gt;

&lt;p&gt;That feels like the right boundary.&lt;/p&gt;

&lt;p&gt;The v1 tool surface is intentionally boring. Just: ask to watch a pane, list watched panes, read a bounded snapshot, read output after a cursor, check status.&lt;/p&gt;

&lt;p&gt;That is enough to stop me from copy/pasting every error by hand.&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%2Fdh63ffegd6znbn5lkoeg.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%2Fdh63ffegd6znbn5lkoeg.png" alt=" " width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Not Security Itself
&lt;/h2&gt;

&lt;p&gt;I'm not naive to the fact that agents can probably get around this. If an agent has unrestricted shell access as my user, it may be able to call the Zellij CLI directly or do other things I did not intend.&lt;/p&gt;

&lt;p&gt;I am not trying to solve malicious local code here. I am trying to make my normal workflow less sloppy.&lt;/p&gt;

&lt;p&gt;The goal is for the easy path to be the safer path: ask for the pane, show the user, read only what was approved, fail closed when state is stale or revoked.&lt;/p&gt;

&lt;p&gt;That already feels better than copy/paste chaos or full terminal visibility.&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%2Fza7a4qogg3iprfi4nf1s.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%2Fza7a4qogg3iprfi4nf1s.png" alt=" " width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More To Do
&lt;/h2&gt;

&lt;p&gt;I still have plenty to do on this project. It's a very rough first pass. But the direction feels right and I think it solves a real problem that I imagine other folks have.&lt;/p&gt;

&lt;p&gt;I'm gonna keep using it and iterating on it for my workflows. &lt;a href="https://github.com/thisisryanswift/zellij-agent-tools" rel="noopener noreferrer"&gt;Feel free to check it out!&lt;/a&gt; &lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>cli</category>
    </item>
    <item>
      <title>Forking Paseo: Mobile vibe coding for me</title>
      <dc:creator>Ryan Swift</dc:creator>
      <pubDate>Wed, 29 Apr 2026 19:02:07 +0000</pubDate>
      <link>https://dev.to/thisisryanswift/forking-paseo-mobile-vibe-coding-for-me-48pa</link>
      <guid>https://dev.to/thisisryanswift/forking-paseo-mobile-vibe-coding-for-me-48pa</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR - I wanted to upgrade my coding-from-my-phone workflow. I found &lt;a href="https://paseo.sh" rel="noopener noreferrer"&gt;Paseo&lt;/a&gt;, forked it, and used AI agents to make the parts I cared about work better for me.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm spending a few weeks thinking about the process of coding with AI agents. Not just "which model is best" or "which harness performs best," but my actual mechanics. How I use these tools day-to-day. Where sessions live. How I know what an agent is doing when I am not staring at the same terminal.&lt;/p&gt;

&lt;p&gt;On my laptop and desktop, I am slowly getting that into shape. The missing piece is my phone. I am admittedly obsessed with vibe coding, and lugging my laptop around everywhere is a bit of a social faux pas. Or at least I feel like it is.&lt;/p&gt;

&lt;p&gt;I want to be able to check on agents, answer prompts, nudge a task forward, and occasionally kick off work when I do not have a computer in front of me.&lt;/p&gt;

&lt;p&gt;The tool I wanted needed to match how I actually work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux support&lt;/li&gt;
&lt;li&gt;Android support&lt;/li&gt;
&lt;li&gt;Local coding, not a cloud service or Saas&lt;/li&gt;
&lt;li&gt;Support for the agents I already use, especially OpenCode&lt;/li&gt;
&lt;li&gt;A way to continue or inspect sessions from my real dev environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SSH on a phone technically exists, but that is not the workflow I wanted. I wanted a control plane, not a tiny, inconvenient terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paseo Mostly Worked
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://paseo.sh" rel="noopener noreferrer"&gt;Paseo&lt;/a&gt; was the first thing I found that felt shaped like the problem I actually had.&lt;/p&gt;

&lt;p&gt;There are other apps in this space. I also looked at &lt;a href="https://www.emdash.sh/" rel="noopener noreferrer"&gt;Emdash&lt;/a&gt;, &lt;a href="https://soloterm.com/" rel="noopener noreferrer"&gt;SoloTerm&lt;/a&gt;, and a handful of other projects. I suspect that Google, Anthropic, OpenAI, and other providers will continue to develop their own handoff to phone workflows. But I wanted one consistent layer across agents.&lt;/p&gt;

&lt;p&gt;Paseo is a local-first app for monitoring and controlling coding agents remotely. A daemon runs on your machine. The mobile app talks to that. Your code does not need to move into a cloud workspace just so you can poke an agent from the couch. This was important. I did not want a separate mobile coding environment. I wanted a remote control for the environment I already have.&lt;/p&gt;

&lt;p&gt;Paseo was also open source, which turned out to be the difference between "this is close" and "I can probably make this work."&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Paseo already handled the working usable mobile app.&lt;/em&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%2Fozd4ptnzmu6hfmiipich.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%2Fozd4ptnzmu6hfmiipich.png" alt="Paseo already had a working, usable mobile app." width="800" height="1781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Gaps Were My Gaps
&lt;/h3&gt;

&lt;p&gt;Paseo was already thoughtfully designed and looked great on mobile. It supported the core agents I cared about, but my OpenCode workflow exposed some rough edges.&lt;/p&gt;

&lt;p&gt;The biggest one was session handoff. I would start a session in terminal OpenCode, then later want to pick it up in Paseo. Not a new agent. Not a fresh chat. The same session, with the same context. The details matter here. Who owns the session right now? What happens if the terminal and Paseo both try to drive it? &lt;/p&gt;

&lt;p&gt;There were smaller papercuts too. Slash command autocomplete did not quite feel like OpenCode. Typing &lt;code&gt;/q&lt;/code&gt; should obviously mean quit, but the app's ranking and visual ordering could make that feel wrong. Workspace defaults mattered too. If OpenCode already knows the right model or mode for a project, Paseo should not casually override that with its own preferences.&lt;/p&gt;

&lt;p&gt;And then there were subagents. OpenCode can spawn subagents, but in Paseo those could look like generic long-running tool calls. From the phone, that read as "is this thing stuck?" even when the agent is doing exactly what it should be doing.&lt;/p&gt;

&lt;p&gt;Gemini CLI support is also on my list, but that is probably a future rabbit hole.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Paseo doesn't currently richly support subagents for OpenCode.&lt;/em&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%2Fcf272ve7hkpxzdckms22.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%2Fcf272ve7hkpxzdckms22.png" alt="OpenCode Subagents Upstream in Paseo" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  I Can &lt;em&gt;Probably&lt;/em&gt; Fix That
&lt;/h3&gt;

&lt;p&gt;Turns out, if I can articulate a problem, agents can solve it. So I forked Paseo and used AI coding agents to improve Paseo's support for my needs.&lt;/p&gt;

&lt;p&gt;Most of the work was not me sitting down with a perfect design doc and typing code by hand. It was me steering with human language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I want to resume an OpenCode session that started outside Paseo."&lt;/li&gt;
&lt;li&gt;"This resumed session looks empty, but I know there is history."&lt;/li&gt;
&lt;li&gt;"Make &lt;code&gt;/q&lt;/code&gt; behave more like terminal OpenCode."&lt;/li&gt;
&lt;li&gt;"Subagents look like mysterious hangs. What's going on?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agents investigated the codebase, made changes, wrote tests, and occasionally wandered into a wall like agents do. I still had to make decisions and review the results. I was less "implementing a feature" and more describing the workflow I wanted until the software caught up.&lt;/p&gt;

&lt;p&gt;I fear professional developers will cringe at parts of my approach. But I also think I am part of an interesting archetype that software people should pay attention to: technical enough to prompt well, inspect results, and push through rough edges, but not necessarily approaching every problem like a traditional dev.&lt;/p&gt;

&lt;p&gt;That is not a replacement for engineering discipline. It is a new on-ramp to shaping software.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Changed
&lt;/h3&gt;

&lt;p&gt;I think my fork now has a much better OpenCode handoff story. But I really only focused on three areas where the "mobile gap" was most painful &lt;em&gt;to me&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero-Friction Handoffs:&lt;/strong&gt; The app now discovers active OpenCode sessions in any workspace. I can resume a session and immediately see a preview of recent history, making the jump from laptop to phone feel seamless rather than like a context-switch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Muscular Defaults:&lt;/strong&gt; We tuned the UX to respect OpenCode's workspace settings and ranked slash commands so that common intents like &lt;code&gt;/q&lt;/code&gt; or &lt;code&gt;/exit&lt;/code&gt; are always at the top. The mobile keyboard is enough of a hurdle; the software shouldn't add to it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subagent Transparency:&lt;/strong&gt; Instead of opaque "tool calls," subagents now report their identity and current task status directly in the timeline. If I can't see what a subagent is doing, I'm inclined to assume it's stuck. Surfacing that intent turns a mysterious "hang" into a visible, productive task.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Better in-line support for OpenCode subagents.&lt;/em&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%2F89gqsg6u2chm2vmhfr3i.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%2F89gqsg6u2chm2vmhfr3i.png" alt="Updated subagent support on my fork" width="800" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Where This Is Going
&lt;/h3&gt;

&lt;p&gt;I am really interested in personal software right now. I am contributing small changes back to Paseo's main branch when appropriate, but I would not be surprised if my fork keeps diverging. That is kind of the point. I am trying to make it work for me and my workflows.&lt;/p&gt;

&lt;p&gt;Gemini CLI integration is probably next. I am also interested in usage tracking across providers. I want Paseo to become a sort of home base for my available usage, active projects, and the agents I can point at them. A control plane for my agents and projects.&lt;/p&gt;

&lt;p&gt;Open source plus coding agents made the gap between "this tool is close" and "this tool fits me" much smaller. Open source software has always invited tinkering. AI agents make the tinkering cheaper.&lt;/p&gt;

&lt;p&gt;And now, apparently, some of that tinkering can happen from my phone. Which is either very cool or a sign I should touch grass.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>vibecoding</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How are you managing git &amp; gh access with Agents?</title>
      <dc:creator>Ryan Swift</dc:creator>
      <pubDate>Sun, 26 Apr 2026 20:40:27 +0000</pubDate>
      <link>https://dev.to/thisisryanswift/how-are-you-managing-git-gh-access-with-agents-1gel</link>
      <guid>https://dev.to/thisisryanswift/how-are-you-managing-git-gh-access-with-agents-1gel</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR - I want to steal your Git workflows for agents. I talk about some of my config and setup recently, but I'm still not fully happy with where I'm at.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My setup was treating "AI Agent" and "Me" at the same level of trust. Local tools can push code, create PRs, and act as me on GitHub with almost no friction. That's starting to feel sketchy, and I don't want to waste maintainers' time with slop PRs.&lt;/p&gt;

&lt;p&gt;I've had pretty persistent imposter syndrome as a developer. At work I've managed our internal ERP (Zoho Creator if you're curious) for years, which has tens of thousands of lines of code at this point. But I've never quite felt like I do 'real' dev work.&lt;/p&gt;

&lt;p&gt;I've helped thousands of next-gen devs with their projects at hackathons. I am pretty good at fixing folks' Git issues in the wild. Historically though, Git was not a tool I needed heavily day to day. That's been changing recently with AI coding agents.&lt;/p&gt;

&lt;p&gt;Recently, I embarrassed myself with a few slop PRs opened without human review. I didn't realize what my agents were doing with my GitHub identity, which is the actual problem. Nothing catastrophic, but I don't want a reputation and I don't want to bug maintainers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ambient Authority
&lt;/h3&gt;

&lt;p&gt;Most AI agents just "ambiently" inherit your authority. They use your SSH agent, your &lt;code&gt;gh&lt;/code&gt; tokens, and your Git identity/config.&lt;/p&gt;

&lt;p&gt;For local edits and personal projects, that's great. For open source and published repos, it's dangerous. Agents had the same level of access that I had as a human user.&lt;/p&gt;

&lt;p&gt;I had one too many slop PRs out there in my name, and wanted to update my workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Current Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Action Split:&lt;/strong&gt; I forced all pushes to a passphrase-protected SSH key while keeping other actions like fetches on HTTPS. This means pulls are silent and low-friction, but pushes should hit both a human confirmation step and the passphrase-protected SSH key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSH Passphrase:&lt;/strong&gt; I created a dedicated key for GitHub and told SSH not to use my running SSH agent for that key (&lt;code&gt;IdentityAgent none&lt;/code&gt;). It's intentionally inconvenient; every push requires a passphrase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read-Only CLI:&lt;/strong&gt; I swapped my main &lt;code&gt;gh&lt;/code&gt; CLI auth for a Fine-Grained Token that is strictly &lt;strong&gt;read-only&lt;/strong&gt;. Agents can see PR status, but &lt;code&gt;gh pr create&lt;/code&gt; now fails server-side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Pre-Push Hook:&lt;/strong&gt; More on this below since it's the piece I'm most chuffed with!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Read-Only CLI is suddenly the most inconvenient part of my workflow right now. If anyone has advice on better controlling &lt;code&gt;gh&lt;/code&gt; CLI, I'd love to hear about it.&lt;/p&gt;

&lt;p&gt;What I really want is a way to let agents inspect issues, PRs, checks, and reviews, while requiring human confirmation for anything that writes to GitHub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pre-Push Hook
&lt;/h3&gt;

&lt;p&gt;I wrote a global Git hook that intercepts pushes, checks for a graphical session, and gets explicit approval from the user.&lt;/p&gt;

&lt;p&gt;Instead of a generic passphrase prompt, I get a popup that shows me a summary of what is being pushed and where. If an agent tries to push in the background, it hits both the confirmation dialog and the SSH passphrase prompt.&lt;/p&gt;

&lt;p&gt;If you're on Linux (KDE), you can use this. If you're on GNOME, just swap &lt;code&gt;kdialog&lt;/code&gt; for &lt;code&gt;zenity&lt;/code&gt;. I would still read the hook first unless you trust my agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hook (&lt;code&gt;~/.config/git/hooks/pre-push&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

&lt;span class="nv"&gt;remote_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;unknown&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;remote_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;unknown&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;repo_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git rev-parse &lt;span class="nt"&gt;--show-toplevel&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git branch &lt;span class="nt"&gt;--show-current&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;zero&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0000000000000000000000000000000000000000

&lt;span class="c"&gt;# Capture the refs being pushed&lt;/span&gt;
&lt;span class="nv"&gt;updates_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;mktemp&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="s1"&gt;'rm -f "$updates_file"'&lt;/span&gt; EXIT
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$updates_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Generate a short summary of the ref updates and new commits&lt;/span&gt;
&lt;span class="nv"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; local_ref local_oid remote_ref remote_oid&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$local_oid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$zero&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s1"&gt;'- Delete %s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$remote_ref&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;remote_oid&lt;/span&gt;&lt;span class="k"&gt;:-}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$zero&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s1"&gt;'- Create %s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$remote_ref&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    git log &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'  - %s'&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 5 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$local_oid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
  &lt;/span&gt;&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s1"&gt;'- Update %s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$remote_ref&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    git log &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'  - %s'&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 5 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$remote_oid&lt;/span&gt;&lt;span class="s2"&gt;..&lt;/span&gt;&lt;span class="nv"&gt;$local_oid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
  &lt;/span&gt;&lt;span class="k"&gt;fi
done&lt;/span&gt; &amp;lt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$updates_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'!seen[$0]++'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
Git push requested from &lt;/span&gt;&lt;span class="nv"&gt;$repo_path&lt;/span&gt;&lt;span class="sh"&gt;

Branch: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;branch&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;detached&lt;/span&gt;&lt;span class="p"&gt; HEAD&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;
Remote: &lt;/span&gt;&lt;span class="nv"&gt;$remote_name&lt;/span&gt;&lt;span class="sh"&gt; (&lt;/span&gt;&lt;span class="nv"&gt;$remote_url&lt;/span&gt;&lt;span class="sh"&gt;)

Summary of push:
&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;summary&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;No&lt;/span&gt;&lt;span class="p"&gt; ref updates found&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;

Allow this push?
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 1. Try KDE Popup&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WAYLAND_DISPLAY&lt;/span&gt;&lt;span class="k"&gt;:-}${&lt;/span&gt;&lt;span class="nv"&gt;DISPLAY&lt;/span&gt;&lt;span class="k"&gt;:-}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; kdialog &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null 2&amp;gt;&amp;amp;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  if &lt;/span&gt;kdialog &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Git Push Confirmation"&lt;/span&gt; &lt;span class="nt"&gt;--warningcontinuecancel&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0
  &lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# 2. Fallback to Terminal&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; /dev/tty &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; /dev/tty &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n\nType '&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s1"&gt;'push'&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s1"&gt;' to continue: '&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/tty
  &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; answer &amp;lt;/dev/tty
  &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$answer&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"push"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# 3. Fail closed if non-interactive&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Push blocked: No human confirmation available."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
&lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make this work across every project on your machine, just run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git config --global core.hooksPath ~/.config/git/hooks&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is not a security boundary. A process running as me can bypass hooks with &lt;code&gt;--no-verify&lt;/code&gt; or modify my Git config. I'm treating this as a safety check: it catches accidental or low-effort agent actions during normal pushes, but I still rely on GitHub permissions and branch protection for anything important.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How are you handling Git access and authorship?
&lt;/h3&gt;

&lt;p&gt;I'm spending a couple of cycles thinking about the "process" of coding right now. I am trying to build a more robust setup for my own projects. This Git hangup is part of that, but it still doesn't feel solved. Do you have a better setup? Let me steal it please!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>git</category>
      <category>github</category>
    </item>
    <item>
      <title>Taming MCPs, Skills, and Agent Chaos with ToolHive</title>
      <dc:creator>Ryan Swift</dc:creator>
      <pubDate>Sat, 25 Apr 2026 21:01:12 +0000</pubDate>
      <link>https://dev.to/thisisryanswift/taming-mcps-skills-and-agent-chaos-with-toolhive-192e</link>
      <guid>https://dev.to/thisisryanswift/taming-mcps-skills-and-agent-chaos-with-toolhive-192e</guid>
      <description>&lt;p&gt;I use a lot of AI coding tools: OpenCode, Antigravity, Claude Code, Codex, Gemini CLI, Pi, Zed, GitHub Copilot, and probably others too. I'm having a ton of fun vibe coding and learning each of these systems. But ultimately, I need to understand these tools because my job is helping developers make sense of this stuff.&lt;/p&gt;

&lt;p&gt;I'm lucky to have a (reasonably) unlimited AI budget. But managing what feels like 30 different tools has become a pain. Every tool wants its own config, MCP setup, skills folder, auth, etc.&lt;/p&gt;

&lt;p&gt;Trying every AI dev tool has stopped feeling like product research and started feeling like I'm torturing a tiny fleet of confused robots.&lt;/p&gt;

&lt;h2&gt;
  
  
  A dream of consistency
&lt;/h2&gt;

&lt;p&gt;I am painfully organized at times. My sprawling collection of agents feels out of hand. It is not strictly difficult to reconfigure an MCP server or drop in a skill I need, but I find myself wanting a more consistent experience across every tool.&lt;/p&gt;

&lt;p&gt;If I (read: my agents) create a skill, I do not want to copy it into six different folders. This has been the real pain point for me:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI tool sprawl is the new dotfile hell.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I tried (today)
&lt;/h2&gt;

&lt;p&gt;I've bumped into the &lt;a href="https://github.com/stacklok/toolhive" rel="noopener noreferrer"&gt;Stacklok/ToolHive&lt;/a&gt; folks at a couple of conferences and finally had time to try out their project today. Initial thoughts are pretty positive. &lt;/p&gt;

&lt;p&gt;I ended up using their CLI and desktop app, &lt;a href="https://github.com/stacklok/toolhive-studio" rel="noopener noreferrer"&gt;ToolHive Studio&lt;/a&gt;. My hope was that ToolHive could become the control plane for running MCPs, storing auth, and distributing skills. Most importantly, I wanted one command that could register an MCP or skill across all of my coding agents.&lt;/p&gt;

&lt;p&gt;It mostly worked!&lt;/p&gt;

&lt;p&gt;There was still plenty of configuration and testing to do, but I am pretty happy with where I landed. I have the start of a governable setup that works across my agents.&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%2Fwzz2ecr53imfk6a9bkz7.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%2Fwzz2ecr53imfk6a9bkz7.png" alt="List of ToolHive managed MCPs and Clients" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I ran into a Podman configuration issue with their official package. Skills are still a beta/alpha feature and needed to be enabled to be used inside Studio. Their built-in playground worked well for testing.&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%2Fbqevchxyom0dh5t9xab7.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%2Fbqevchxyom0dh5t9xab7.png" alt="A list of repositories pulled from the GitHub MCP inside ToolHive's Playground." width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;p&gt;If you're using one AI coding tool, config is an annoying chore. The agent can probably configure itself. &lt;/p&gt;

&lt;p&gt;When you're using ten coding tools, config is a nightmare. &lt;/p&gt;

&lt;p&gt;ToolHive made my system governable and solved a real problem for me right now. I needed a control plane. Not perfect, but useful in exactly the way I needed: one place to make the growing pile of AI tools behave like an environment instead of a junk drawer.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>agentskills</category>
      <category>mcp</category>
    </item>
    <item>
      <title>3 Takeaways from All Things AI: 80/20 Rule, Non-Deterministic Humans, and Why We're Still Early</title>
      <dc:creator>Ryan Swift</dc:creator>
      <pubDate>Wed, 01 Apr 2026 12:44:00 +0000</pubDate>
      <link>https://dev.to/thisisryanswift/3-takeaways-from-all-things-ai-8020-rule-non-deterministic-humans-and-why-were-still-early-2mln</link>
      <guid>https://dev.to/thisisryanswift/3-takeaways-from-all-things-ai-8020-rule-non-deterministic-humans-and-why-were-still-early-2mln</guid>
      <description>&lt;p&gt;Last week, I attended &lt;a href="https://allthingsai.org/" rel="noopener noreferrer"&gt;All Things AI&lt;/a&gt; in Durham, NC. The event was geared toward technical AI practitioners with workshops on Day 1 and standard conference talks on Day 2. A few takeaways from the conference are below for y'all!&lt;/p&gt;

&lt;h2&gt;
  
  
  MLH AI Roadshow
&lt;/h2&gt;

&lt;p&gt;On Day 1, I helped &lt;a href="https://mlh.io" rel="noopener noreferrer"&gt;Major League Hacking (MLH)&lt;/a&gt; run an AI Roadshow. We're hosting about one of these a month right now. Some are standalone events. Others have been at partner conferences. I &lt;em&gt;think&lt;/em&gt; you'll see us again at All Things Open in the fall. &lt;/p&gt;

&lt;p&gt;At the AI Roadshow, we run ~6 practical, hands-on-keyboard activities. You walk up and use a ready-to-go laptop to learn a new skill or technique with AI. We typically have snacks, drinks, and networking throughout the events. If you want to keep an eye on the next stop, check out &lt;a href="https://luma.com/calendar/cal-YherBiOwFev0Kov" rel="noopener noreferrer"&gt;our Luma&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.amazonaws.com%2Fuploads%2Farticles%2F0384zzngrsy5cjw3nb4c.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%2F0384zzngrsy5cjw3nb4c.jpeg" alt="MLH AI Roadshow" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The 80/20 Rule in Practice&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;(Inspired by Justin Jeffress: &lt;a href="https://2026.allthingsai.org/sessions/vibe-coding-in-action-transforming-coding-practices-for-the-future" rel="noopener noreferrer"&gt;Vibe Coding in Action&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I enjoyed Justin's whole talk, but he had a specific slide on the 80/20 rule that is still sticking with me. AI feels really good at getting you 80% of the way there on most problems. &lt;/p&gt;

&lt;p&gt;What do you do with that remaining 20%, though? Justin's advice was to simply repeat. Send the "remaining" 20% back to your AI tool of choice.&lt;/p&gt;

&lt;p&gt;I've been doing this myself for a while with coding agents, but this talk has me thinking again about the effectiveness of simple loops and repetition. I imagine this advice hasn't penetrated to folks who mostly use AI through chat applications. It might also not work as well for outcomes that can't be tested. But the framing really resonated with me. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Humans Are Also Non-Deterministic&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;(Inspired by Calvin Hendryx-Parker: &lt;a href="https://2026.allthingsai.org/sessions/orchestrate-agentic-ai-context-checklists-and-no-miss-reviews" rel="noopener noreferrer"&gt;Orchestrate Agentic AI&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Through my work at MLH, I'm constantly talking to software developers. The last ~18 months have been even more intense, driven by all the AI development. &lt;/p&gt;

&lt;p&gt;A common concern I haven't felt ready to address is that AI tools are non-deterministic. I get it. When you're writing code, you're building for specific outcomes. I think devs like the certainty. &lt;/p&gt;

&lt;p&gt;Calvin made a small comment during his talk, reminding the audience that humans are also non-deterministic. The observation really hit home. I knew this. I'm sure you know it, too. But it was a good reframe. Process-driven thinking and guardrails feel suddenly important.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;We're Still So So Early&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;(Just a personal reflection)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Like many of you, I've been following AI heavily recently. It's been important for the work I'm doing at MLH. It's so easy to get caught up in the fad-of-the-week on Twitter. But the reality is that most people still aren't leveraging AI tools. Especially not to their maximum capabilities. &lt;/p&gt;

&lt;p&gt;Even at a conference for AI practitioners, I met people who hadn't used a coding agent. There were jokes about OpenClaw and Mac Minis, but not everyone was "in the know". &lt;/p&gt;

&lt;p&gt;We're still so damn early in this wave of change. No time like the present to roll up your sleeves and give something a try yourself. I still think learning by doing is the right methodology with AI tools. &lt;/p&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>mlh</category>
      <category>opensource</category>
    </item>
    <item>
      <title>SaaS Companies Fear Me: Cloning* Granola for Linux</title>
      <dc:creator>Ryan Swift</dc:creator>
      <pubDate>Tue, 03 Mar 2026 21:23:35 +0000</pubDate>
      <link>https://dev.to/thisisryanswift/saas-companies-fear-me-cloning-granola-for-linux-3pk0</link>
      <guid>https://dev.to/thisisryanswift/saas-companies-fear-me-cloning-granola-for-linux-3pk0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh/built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've been spending a lot of time on Twitter recently because it seems to be one of the best places to get AI news. A really common refrain I see on Twitter is about how the "end" of SaaS (Software as a Service) companies is approaching now that vibe coding enables folks to just build their own customized SaaS tools. I don't know that I fully agree with that take, but I suppose I am the hypothetical person in those tweets. There was a SaaS tool I loved that I couldn't use on Linux, so I just built my own (albeit notably worse) version of it.&lt;/p&gt;

&lt;p&gt;I, unfortunately, find myself in back-to-back meetings most days. I've played around with a few different note-taking tools. About half a year ago, I discovered &lt;a href="https://www.granola.ai/" rel="noopener noreferrer"&gt;Granola&lt;/a&gt;. I really really really liked it. It did transcriptions. It enhanced your existing notes. I could run it without inviting another note taker to the meeting. It had a nice little chat interface where I could ask questions about my meetings. 10/10 would (and still do) recommend.&lt;/p&gt;

&lt;p&gt;A month or so after discovering Granola, I decided I wanted to switch back to using Linux as my primary OS though. Windows was an uphill battle with CLI coding tools like Gemini CLI, OpenCode, and Claude Code (at least in my experience at the time).&lt;/p&gt;

&lt;p&gt;Unfortunately, Granola didn't support Linux and didn't have plans on adding support for it (I did ask).&lt;/p&gt;

&lt;p&gt;So, I built &lt;a href="https://github.com/thisisryanswift/quinoa" rel="noopener noreferrer"&gt;Quinoa&lt;/a&gt;. A note-taking tool for me. &lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;I think it's &lt;strong&gt;very important&lt;/strong&gt; to call out again this is a tool for me. While I do have the code up on GitHub, I regularly tell my coding agents that they're building for me. My systems. My configs. My preferences. I've had a few design choices where a coding agent raises a concern that might impact other users, but I have very intentionally been designing this tool for myself. This has been a big learning for me in this project. &lt;/p&gt;

&lt;p&gt;Coding agents allow us to will software into existence in a way we couldn't a few years ago. It feels like it's okay to be a bit less intentional about certain things. It's okay to build stuff just for you and just for your friends. Not every project needs to be perfectly engineered. If you hit a bug, you can just ask an agent to resolve it. &lt;/p&gt;

&lt;p&gt;I made Quinoa almost exclusively using Gemini CLI and OpenCode (using Google, Anthropic, OpenAI, and a bunch of other models). I'm sure some folks will cringe at this, but I try not to write any code myself for this project. That does absolutely lead to some mistakes, but it's been a great way to learn how to harness and direct coding agents. Most of my code review is fully agent-driven as well. &lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;Quinoa itself fully uses Google Gemini models under the hood. I deliberately used it as a project to experiment with new Gemini releases. &lt;/p&gt;

&lt;p&gt;The Gemini API handles all of the following.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meeting transcription.&lt;/strong&gt; Gemini handles identifying folks' names and labeling them for the transcript. &lt;a href="https://ai.google.dev/gemini-api/docs/audio" rel="noopener noreferrer"&gt;Audio understanding docs are here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meeting summaries.&lt;/strong&gt; Two- to three-sentence summaries of what happened and action item extractions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notes enhancement.&lt;/strong&gt; Takes my notes from the app and then enhances them with additional context and information from the audio recording and transcript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RAG notes search.&lt;/strong&gt; This was a huge time saver for me. Google literally has RAG as a service. Allows me to search notes and cites where it's pulling information from. Drop-in API that did exactly what I needed to do. &lt;a href="https://ai.google.dev/gemini-api/docs/file-search" rel="noopener noreferrer"&gt;File search docs are here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I also used &lt;a href="https://ai.google.dev/gemini-api/docs/image-generation" rel="noopener noreferrer"&gt;Nano Banana&lt;/a&gt; to make my project's icon too :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;My note-taker is a local application, so I can't embed a demo for y'all. Here's a sample screenshot of the app though. I'm clearly not a designer. &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%2F5c9tlxwfg0stqa7mmfsm.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%2F5c9tlxwfg0stqa7mmfsm.png" alt="Showing today view, asking the assistant a question, and another transcript" width="800" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;p&gt;The biggest issue across all coding agents currently seems to be getting the right context, especially if you're building tools that use new libraries. Google Gemini struggles to implement itself sometimes. I heavily recommend using the &lt;a href="https://github.com/google-gemini/gemini-skills" rel="noopener noreferrer"&gt;Gemini API Dev&lt;/a&gt; skill if you haven't tried it out yet. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Just wanted to quickly mention that I'm not entering this contest to win. I am pretty sure I'm ineligible since I work for MLH, but wanted to share something I've been working on!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
