<?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: GBTI Network</title>
    <description>The latest articles on DEV Community by GBTI Network (gbti-network).</description>
    <link>https://dev.to/gbti-network</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%2Forganization%2Fprofile_image%2F10466%2F2e22c94b-ee5b-408c-9b74-002b7b9336a6.png</url>
      <title>DEV Community: GBTI Network</title>
      <link>https://dev.to/gbti-network</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gbti-network"/>
    <language>en</language>
    <item>
      <title>Upwork will now take a job post from your AI agent</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Fri, 14 Aug 2026 02:50:56 +0000</pubDate>
      <link>https://dev.to/gbti-network/upwork-will-now-take-a-job-post-from-your-ai-agent-3m1p</link>
      <guid>https://dev.to/gbti-network/upwork-will-now-take-a-job-post-from-your-ai-agent-3m1p</guid>
      <description>&lt;p&gt;&lt;strong&gt;By &lt;a class="mentioned-user" href="https://dev.to/gbti"&gt;@gbti&lt;/a&gt;, &lt;a href="https://gbti.network/members/gbtilabs/" rel="noopener noreferrer"&gt;GBTI Network Member&lt;/a&gt;.&lt;/strong&gt; Originally published on &lt;a href="https://gbti.network/articles/upwork-mcp-server-agents-hiring-humans/" rel="noopener noreferrer"&gt;gbti.network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On August 10, 2026, Upwork announced a server for the Model Context Protocol. An agent can now post a job, shortlist freelancers, prepare an offer and summarize proposals as they arrive, without anyone opening a browser tab.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Before getting to why Upwork built one, the protocol itself needs explaining. An MCP server resembles a REST API, and Upwork's sits on the same APIs its website and public API already use.&lt;sup id="fnref2"&gt;2&lt;/sup&gt; The difference is who does the calling. A REST endpoint waits for code a developer wrote against its documentation. An MCP server publishes a typed list of what it can do, things like searching jobs, sending a message or creating a milestone, and the assistant, the agent app you added the server to, puts that list in front of the model, then makes whichever calls the model picks. No page is fetched, nothing is rendered, no human clicks anything, and the result lands in the conversation you are already having. Think of an MCP server as an extension to the assistant rather than to the model: the model arrives able to converse, and the server gives the assistant a set of things it can now do on your behalf.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/petersanborn1/" rel="noopener noreferrer"&gt;Peter Sanborn&lt;/a&gt;, Upwork's chief business officer, described what prompted it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We started seeing something remarkable this year: AI agents attempting to log into Upwork on their users' behalf to search for the right person to hire.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A marketplace watched software try to get in through the front door and decided to install a door.&lt;/p&gt;

&lt;h2&gt;
  
  
  Any MCP-compatible assistant can reach the Upwork server
&lt;/h2&gt;

&lt;p&gt;The announcement names Claude, ChatGPT and Cursor, then adds "any MCP-compatible product."&lt;sup id="fnref1"&gt;1&lt;/sup&gt; The documentation goes further, listing Claude on web, desktop and Code, Cursor and Codex in app and CLI form, and naming Windsurf, Cline, VS Code and Goose as examples of anything else that speaks remote MCP with OAuth.&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Upwork's documentation gives &lt;code&gt;claude.ai/directory/connectors/upwork&lt;/code&gt; as the recommended install path, with a ChatGPT listing still to come.&lt;sup id="fnref2"&gt;2&lt;/sup&gt; That address is not a public page. It opens Claude's own connector directory inside the app, where the entry credits Upwork as the developer and exposes 46 tools under names like &lt;code&gt;upwork__find_freelancers&lt;/code&gt;, &lt;code&gt;upwork__confirm_draft&lt;/code&gt; and &lt;code&gt;upwork__end_contract&lt;/code&gt;.&lt;sup id="fnref3"&gt;3&lt;/sup&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%2F5f8prvmczoqy3u9efywa.webp" 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%2F5f8prvmczoqy3u9efywa.webp" alt="The Upwork entry in Claude's connector directory, labelled Community, listing 46 tools" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anthropic files it under &lt;strong&gt;Community&lt;/strong&gt; rather than verified, noting that community connectors "have undergone automated reviews" and "may not yet meet the quality tier of verified connectors". The notice beside it reads "Only use connectors from developers you trust. Anthropic does not control which tools developers make available and cannot verify that they will work as intended or that they won't change."&lt;sup id="fnref3"&gt;3&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Every Upwork account gets it free, but your assistant plan may block it
&lt;/h2&gt;

&lt;p&gt;Upwork's MCP server is open to every Upwork user at no additional cost: "available today for every Upwork client and freelancer, at no additional cost."&lt;sup id="fnref1"&gt;1&lt;/sup&gt; The documentation says the same, that it is "free to use with any Upwork account."&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;ChatGPT offers custom MCP connectors on Plus, Pro, Team, Business and Enterprise, which leaves a free ChatGPT account unable to add the Upwork server at all; a Claude free account can add it, but only as its one permitted connector; and ChatGPT's Instant mode cannot make MCP tool calls whatever the plan.&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;On the marketplace side, universal availability decides who benefits. A capability that ships to everyone at once and costs nothing confers no advantage by being adopted, only on people who restructure how they work around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the agent can do: mostly administration, plus one delivery step
&lt;/h2&gt;

&lt;p&gt;The announcement lists the prompts it expects:&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"My prototype is almost ready to launch. Help me find a freelancer on Upwork who can test it end-to-end before it goes live."&lt;/li&gt;
&lt;li&gt;"I'm launching a new ecommerce product and need help with paid acquisition. Post a job to Upwork and summarize proposals as they arrive."&lt;/li&gt;
&lt;li&gt;"Show me this week's jobs that match my skills and fit my budget and availability."&lt;/li&gt;
&lt;li&gt;"Summarize my Upwork client messages and flag which ones need a follow-up today."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three of the four are administration. Finding, posting, summarizing, triaging. The agent handles the paperwork around the work rather than the work.&lt;/p&gt;

&lt;p&gt;The documentation covers a third role the announcement skips. Alongside clients and freelancers, agencies get a team-wide view: one call returning every member's invitations, offers, messages and contracts.&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;One capability does touch delivery. A freelancer can submit milestone work through the connector.&lt;sup id="fnref2"&gt;2&lt;/sup&gt; With job posting, proposal review and client messaging already inside the agent, the only steps reserved for a person are the binding ones, and a pipeline running from brief to delivered work without anyone opening a browser starts to look like a question of policy rather than plumbing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a client is meant to de-risk the expert they pick
&lt;/h2&gt;

&lt;p&gt;Upwork's answer is identity and money. Every connection runs through an authenticated account, and the company leans on its existing identity verification, escrow and dispute protections.&lt;sup id="fnref1"&gt;1&lt;/sup&gt; Those cover fraud and non-delivery, and they say nothing about whether the three names in front of you are the right three. We read the documentation looking for the ranking inputs and they are not disclosed: a client can "Pull up ranked profiles" and "review proposals received, with ranked summaries", and the page never names Job Success Score, Top Rated, or any other quality signal Upwork already publishes.&lt;sup id="fnref2"&gt;2&lt;/sup&gt; The word doing the work is "ranked", and nothing says ranked by what.&lt;/p&gt;

&lt;p&gt;The controls on the agent itself are documented far better than the ones on the shortlist. Every write action is drafted for separate confirmation, binding financial actions complete on upwork.com rather than inside the agent, and connecting nonetheless "grants the full set of scopes", so there is no way to attach an agent to job search while withholding messaging, contracts or financial history.&lt;sup id="fnref2"&gt;2&lt;/sup&gt; Rohit Singh, founder of Populosof and one of two customers quoted in the announcement, put the upside plainly: "every action that changes anything is previewed and requires my explicit confirmation."&lt;sup id="fnref1"&gt;1&lt;/sup&gt; So a client de-risks the transaction and picks the expert on trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are AI Agents Themselves Able to Shop On Upwork?
&lt;/h2&gt;

&lt;p&gt;Upwork's FAQ asks whether an AI agent can hire on your behalf without you, which is the client side of the question, and answers: "Not today. In the current release, a person confirms every binding action."&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Read the hedge. "Not today" and "in the current release" are the words of a company that has thought about the other version and has not shipped it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does the affiliate program work with MCP?
&lt;/h2&gt;

&lt;p&gt;Upwork's affiliate program pays 70% of a new client's first contract spend, capped at $150, tracked through the Impact platform with a cookie window measured in weeks.&lt;sup id="fnref4"&gt;4&lt;/sup&gt; Every part of that mechanism assumes a browser. A link is clicked, a cookie is set, a signup is attributed.&lt;/p&gt;

&lt;p&gt;An MCP conversation runs directly between the agent and the server, so the browser, the click and the cookie that mechanism depends on never come into existence. A founder who asks Claude to post a job and hires someone that afternoon leaves no referral trail, so whoever recommended Upwork in the first place is invisible to the attribution system.&lt;/p&gt;

&lt;p&gt;Will Anthropic and OpenAI demand a share of the profit? There are arguments for it, most certainly, however there does not seem to be any sign of merchants needing to register with large language models for commission sharing. It is not a crazy model. We would break off a point for the right of representation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an agent-driven marketplace means for a vetted network like Codeable
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; the &lt;a href="https://gbti.network/outbound/codeable" rel="noopener noreferrer"&gt;Codeable&lt;/a&gt; link here is a referral link. GBTI Network is a big fan of the Codeable community for React and WordPress work.&lt;/p&gt;

&lt;p&gt;Codeable is a closed talent network that accepts roughly 2.2% of applicants, where a client brief goes to a small group of pre-vetted experts who discuss it in a shared workroom and independently estimate, and the platform returns one averaged fixed price against a 17.5% fee.&lt;sup id="fnref5"&gt;5&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;A network like Codeable has several reasons to publish an MCP server of its own, and they are mostly the reasons Upwork did. A connector puts a vetted talent pool inside the tools its best clients already work in. It makes that same pool reachable by the network's own contractors, who could assemble a team on demand instead of routing it through a coordinator. A devops lead could pipe work straight to the embedded developer they already trust, without rebuilding the relationship each time there is something to do. And every party keeps agentic help for the transactional layer, the scoping and scheduling and status chasing, which is the part none of them wanted to be doing by hand.&lt;/p&gt;

&lt;p&gt;Cover photograph by Polina Zimmerman on Pexels.&lt;sup id="fnref6"&gt;6&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;The resource shared in this post is a new article published by GBTI Network member GBTI Network. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Are you a writer, musician, or product developer? We would love to support your work on the GBTI Network. For more information about how to join our community visit &lt;a href="https://gbti.network" rel="noopener noreferrer"&gt;https://gbti.network&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To follow GBTI Network's work more closely, consider joining our network and subscribing to them directly: &lt;a href="https://gbti.network/members/gbtilabs/" rel="noopener noreferrer"&gt;https://gbti.network/members/gbtilabs/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Upwork Inc., "Upwork Talent Is Now Everywhere AI Works," press release via GlobeNewswire, August 10, 2026. Source of the launch date, the example prompts, the escrow and dispute language, and the quotes from Sanborn and from Singh, who is one of two customers quoted; the other is Allison Lee. Sanborn's linked profile was opened and confirmed on August 13, 2026: &lt;a href="https://www.globenewswire.com/news-release/2026/08/10/3342153/0/en/upwork-talent-is-now-everywhere-ai-works.html" rel="noopener noreferrer"&gt;globenewswire.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;Upwork, "Upwork MCP Server," product documentation dated August 4, 2026, read in a browser on August 12, 2026; the page returns 403 to non-browser clients. Source of the compatible-agent list, the capability sets, the draft-confirm and binding-actions rules, the per-assistant plan requirements, the full-scopes line, the same-APIs comparison and the FAQ answers quoted above. It says "ranked profiles" and "ranked summaries" and names no quality signal anywhere on the page, neither Job Success Score nor Top Rated: &lt;a href="https://www.upwork.com/ai/mcp" rel="noopener noreferrer"&gt;upwork.com/ai/mcp&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;Claude connector directory, Upwork entry, captured on August 13, 2026 from a signed-in session and supplied by the author. The one claim here resting on a logged-in view: the directory is served inside the application and the address returns 403 to signed-out clients, so the screenshot above is the evidence rather than a link anyone can follow. Source of the Community label and its notice, the "Developed by Upwork" credit, the disclaimer, and the stated count of 46 tools, of which eight are visible.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;Published summaries of the Upwork affiliate program, read August 12, 2026. Source of the 70% first-contract commission, the $150 cap and the Impact platform. Reported cookie windows vary by link type and none of these figures appears on Upwork's own affiliate page, so the window is given as a range. The conclusion drawn about MCP attribution is ours: &lt;a href="https://www.upwork.com/affiliates" rel="noopener noreferrer"&gt;upwork.com/affiliates&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn5"&gt;
&lt;p&gt;Codeable, "Codeable vs Upwork," read August 12, 2026, for "roughly 2.2% of applicants are accepted" and the fixed 17.5% fee on hourly rates of $80 to $120: &lt;a href="https://www.codeable.io/blog/codeable-vs-upwork/" rel="noopener noreferrer"&gt;codeable.io/blog/codeable-vs-upwork&lt;/a&gt;. The workroom and the averaged estimate are described on the company's how-it-works page.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn6"&gt;
&lt;p&gt;Cover photograph, "Person Holding Black And Silver Laptops", by Polina Zimmerman on Pexels, used under the &lt;a href="https://www.pexels.com/license/" rel="noopener noreferrer"&gt;Pexels License&lt;/a&gt;: &lt;a href="https://www.pexels.com/photo/person-holding-black-and-silver-laptops-3747130/" rel="noopener noreferrer"&gt;pexels.com/photo/3747130&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>mcp</category>
      <category>aiagents</category>
      <category>upwork</category>
      <category>freelancing</category>
    </item>
    <item>
      <title>App Clips let someone use part of your iOS app without installing it</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Wed, 12 Aug 2026 03:20:35 +0000</pubDate>
      <link>https://dev.to/gbti-network/app-clips-let-someone-use-part-of-your-ios-app-without-installing-it-930</link>
      <guid>https://dev.to/gbti-network/app-clips-let-someone-use-part-of-your-ios-app-without-installing-it-930</guid>
      <description>&lt;p&gt;&lt;strong&gt;By &lt;a class="mentioned-user" href="https://dev.to/gbti"&gt;@gbti&lt;/a&gt;, &lt;a href="https://gbti.network/members/gbtilabs/" rel="noopener noreferrer"&gt;GBTI Network Member&lt;/a&gt;.&lt;/strong&gt; Originally published on &lt;a href="https://gbti.network/articles/ios-app-clips-what-they-are-and-who-uses-them/" rel="noopener noreferrer"&gt;gbti.network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We came across &lt;strong&gt;App Clips&lt;/strong&gt; recently and realized how little we knew about them beyond the name. An App Clip runs part of an iOS app with no install: the person never visits the App Store, downloads anything, or creates an account. They do the one thing they came to do and move on, and the software removes itself later without being asked.&lt;/p&gt;

&lt;p&gt;App Clips have existed since iOS 14 in 2020, and Apple is still adding to them, most recently in June 2025.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;An App Clip is a second, smaller build of an app that already exists, made from the same project and sharing that app's code.&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;That smaller build compiles down to its own binary, and that is what makes an install unnecessary: someone runs the clip without installing the full app, and the system removes it from the device after a period of inactivity.&lt;sup id="fnref3"&gt;3&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Everything depends on that binary staying small, so &lt;a href="https://developer.apple.com/documentation/appclip/choosing-the-right-functionality-for-your-app-clip" rel="noopener noreferrer"&gt;the size limit&lt;/a&gt; is the constraint that decides what an App Clip can be. It varies by iOS version and by how the clip is launched: 10 MB on iOS 15 and earlier, 15 MB on iOS 16 and earlier. iOS 17 raises the ceiling to 100 MB, but only for clips launched digitally, from a website or Spotlight, and never from an App Clip Code, a QR code, or an NFC tag. The one route that keeps those physical launches at 100 MB is the demo link App Store Connect generates.&lt;/p&gt;

&lt;p&gt;If a tapped link can run part of an app, it is fair to wonder what stops any link from running anything. Apple reviews every app on the store, and a clip ships as part of one.&lt;sup id="fnref4"&gt;4&lt;/sup&gt; Launching one is governed separately and checked every time: a developer has to prove they own the domain a link points at, by publishing a file on it that names the App Clip allowed to launch from there.&lt;sup id="fnref5"&gt;5&lt;/sup&gt; It is the same mechanism behind a link that opens an app instead of a browser page.&lt;/p&gt;

&lt;p&gt;Which leaves the question of whether a clip is a substitute for an app or an addition to one. Apple settles it by requiring the full app to contain everything the clip offers, so a clip is a way to hand someone the useful part of an app before they commit to the rest.&lt;sup id="fnref6"&gt;6&lt;/sup&gt; People can reach one eight different ways, from a QR code or an NFC tag to a link shared in Messages.&lt;sup id="fnref7"&gt;7&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it is used in the real world
&lt;/h2&gt;

&lt;p&gt;The public record here is thin, but named deployments exist, and they sort into three kinds: reached at a physical place, sent to someone who is not the customer, and offered as a trial.&lt;/p&gt;

&lt;h3&gt;
  
  
  ExxonMobil
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://appleinsider.com/articles/22/12/11/what-happened-to-apples-app-clips" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;ExxonMobil&lt;/strong&gt;&lt;/a&gt; put tap to pay at the pump in 2020, one of the examples Apple advertised from day one. The &lt;strong&gt;Apple Store&lt;/strong&gt; used a barcode scan in its own stores to pull up accessory details in 2021, and &lt;a href="https://www.heady.io/blog/the-app-clips-playbook-5-inspiring-examples-teardowns" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;ParkWhiz&lt;/strong&gt;&lt;/a&gt; put an NFC tag at the spot so someone could pay without installing anything. &lt;strong&gt;Panera Bread&lt;/strong&gt; sits off to the side of this group: its ordering flow comes through Apple Maps rather than something you scan.&lt;/p&gt;

&lt;h3&gt;
  
  
  SignEasy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SignEasy&lt;/strong&gt; lets someone sign a document that was sent to them, with no install required of the signer. &lt;strong&gt;Parcel&lt;/strong&gt; tracks a single package from a shared link. &lt;strong&gt;Flash Note Cards&lt;/strong&gt; makes and shares cards inside a conversation.&lt;sup id="fnref8"&gt;8&lt;/sup&gt; None of those people are the customer. They were handed a thing and needed to deal with it, the strongest argument for the whole feature, and not the one Apple leads with.&lt;/p&gt;

&lt;h3&gt;
  
  
  Elloveo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Elloveo&lt;/strong&gt;, a free trial of a children's science app, is the single early example on record.&lt;sup id="fnref8"&gt;8&lt;/sup&gt; It is also the kind of use Apple has invested in most recently, which is what the June 2025 demo work is for.&lt;/p&gt;

&lt;p&gt;What every one of them shares, across all three kinds, is that the task happens to finish in about a minute, a pattern in what has been built so far, not a limit Apple sets.&lt;/p&gt;

&lt;p&gt;No source reports an install lift, a conversion rate, or a completion figure for any of them. We looked specifically for outcomes: a search for App Clip campaign results returns marketing case studies about other things entirely, and a search for App Clip business results returns mobile-ordering and micromobility material with no App Clips in it. We would rather report that absence than dress up unrelated statistics as evidence.&lt;/p&gt;

&lt;p&gt;Both sources are dated: the Heady teardown is from March 2021 and the AppleInsider piece is from December 2022.&lt;sup id="fnref8"&gt;8&lt;/sup&gt;&lt;sup id="fnref9"&gt;9&lt;/sup&gt; Nothing comparable has surfaced since.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it might fit next
&lt;/h2&gt;

&lt;p&gt;Picture the same kind of task wherever it lands next: a diner ordering without installing anything, a driver tapping to pay at the pump, someone trying one level of a game before deciding whether to buy the rest. An App Clip fits a task that small and that self-contained, and stops fitting the moment it needs to remember who you are or run while nobody is looking, both hard platform limits.&lt;/p&gt;

&lt;p&gt;The case worth watching is try before you buy on the devices carrying a LiDAR scanner. This already works inside a full app: point the camera at the room and the sofa appears at true scale, sitting behind the coffee table rather than floating in front of it. As an App Clip the same thing would run straight from the product page, with nothing installed and nothing left behind once the decision is made.&lt;/p&gt;

&lt;p&gt;Two constraints decide where that works. LiDAR narrows the audience to the devices that have it, so accurate placement is an enhancement rather than the whole experience. And while putting a sofa in your living room sounds like the in-person scenario App Clips were sold on, the 100 MB ceiling belongs to clips launched digitally, and a 3D model is heavy. The door that fits is the product page rather than a code printed on a showroom tag, unless the clip ships through the demo link, which is the one physical route Apple allows the larger budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tell us what it was like
&lt;/h2&gt;

&lt;p&gt;If you have built an App Clip, or scoped one and decided against it, the useful part is what documentation never captures: what App Store Connect was like to configure, whether people found the thing at all, whether it moved installs or replaced them, and what you would not do again. A report that it was not worth building is as useful as one that it was.&lt;/p&gt;

&lt;p&gt;Leave a comment, or bring it to Discord if it turns into a longer conversation.&lt;/p&gt;

&lt;p&gt;Cover photograph by Douglas Mendes on Pexels.&lt;sup id="fnref10"&gt;10&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;The resource shared in this post is a new article published by GBTI Network member GBTI Network. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Are you a writer, musician, or product developer? We would love to support your work on the GBTI Network. For more information about how to join our community visit &lt;a href="https://gbti.network" rel="noopener noreferrer"&gt;https://gbti.network&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To follow GBTI Network's work more closely, consider joining our network and subscribing to them directly: &lt;a href="https://gbti.network/members/gbtilabs/" rel="noopener noreferrer"&gt;https://gbti.network/members/gbtilabs/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Apple, "App Clips updates," Apple Developer Documentation, read August 10, 2026. The June 2025 entry covers demo App Clips, the autogenerated demo URL, and Background Assets: &lt;a href="https://developer.apple.com/documentation/updates/appclips" rel="noopener noreferrer"&gt;developer.apple.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;Apple, "Creating an App Clip with Xcode," Apple Developer Documentation, read August 10, 2026. Source of the target-based architecture and the guidance to share code between the App Clip and the full app rather than duplicate it, refactoring to modular, shared code "to avoid duplicating code": &lt;a href="https://developer.apple.com/documentation/appclip/creating-an-app-clip-with-xcode" rel="noopener noreferrer"&gt;developer.apple.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;Apple, "App Clips," Apple Developer Documentation, read August 10, 2026. Source of the inactivity-removal behavior: &lt;a href="https://developer.apple.com/documentation/appclip" rel="noopener noreferrer"&gt;developer.apple.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;Apple, "App Review Guidelines," Apple Developer Documentation, re-read August 11, 2026. Source of the review requirement: "every app is reviewed by experts." The document names App Clips twice, requiring that "all App Clip features and functionality must be included in the main app binary" and that they carry no advertising. It does not say when review happens, so no timing is claimed above: &lt;a href="https://developer.apple.com/app-store/review/guidelines/" rel="noopener noreferrer"&gt;developer.apple.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn5"&gt;
&lt;p&gt;Apple, "Supporting associated domains," Apple Developer Documentation, read August 10, 2026. Source of the &lt;code&gt;apple-app-site-association&lt;/code&gt; file format and the &lt;code&gt;appclips&lt;/code&gt; key that authorizes a domain to launch a given App Clip: &lt;a href="https://developer.apple.com/documentation/xcode/supporting-associated-domains" rel="noopener noreferrer"&gt;developer.apple.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn6"&gt;
&lt;p&gt;Apple, "Choosing the right functionality for your App Clip," Apple Developer Documentation, read August 10, 2026. Source of the size ceiling, the demo-link conditions, the requirement that "the full app must include the same functionality as the App Clip," and the background and privacy limits: &lt;a href="https://developer.apple.com/documentation/appclip/choosing-the-right-functionality-for-your-app-clip" rel="noopener noreferrer"&gt;developer.apple.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn7"&gt;
&lt;p&gt;Apple, "Configuring App Clip experiences," Apple Developer Documentation, read August 10, 2026. Source of the eight invocation methods: &lt;a href="https://developer.apple.com/documentation/appclip/configuring-the-launch-experience-of-your-app-clip" rel="noopener noreferrer"&gt;developer.apple.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn8"&gt;
&lt;p&gt;Heady, "The App Clips Playbook: 5 Inspiring Examples and Teardowns," March 17, 2021. Source of the ParkWhiz, SignEasy, Parcel, Elloveo, and Flash Note Cards examples. Notably it reports no outcome figures for any of them: &lt;a href="https://www.heady.io/blog/the-app-clips-playbook-5-inspiring-examples-teardowns" rel="noopener noreferrer"&gt;heady.io&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn9"&gt;
&lt;p&gt;Lila Riesen, "What happened to Apple's App Clips," AppleInsider, December 11, 2022. Source of the ExxonMobil, Apple Store, and Panera Bread examples: &lt;a href="https://appleinsider.com/articles/22/12/11/what-happened-to-apples-app-clips" rel="noopener noreferrer"&gt;appleinsider.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn10"&gt;
&lt;p&gt;Cover photograph by Douglas Mendes on Pexels, used under the &lt;a href="https://www.pexels.com/license/" rel="noopener noreferrer"&gt;Pexels License&lt;/a&gt;: &lt;a href="https://www.pexels.com/photo/close-up-of-an-iphone-keyboard-laptop-and-airpods-lying-on-a-desk-14666034/" rel="noopener noreferrer"&gt;pexels.com/photo/14666034&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>ios</category>
      <category>mobile</category>
      <category>appclips</category>
      <category>apple</category>
    </item>
    <item>
      <title>AirLLM runs a 70B model on a 4GB GPU by refusing to load it all at once</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Wed, 12 Aug 2026 01:05:36 +0000</pubDate>
      <link>https://dev.to/gbti-network/airllm-runs-a-70b-model-on-a-4gb-gpu-by-refusing-to-load-it-all-at-once-i5</link>
      <guid>https://dev.to/gbti-network/airllm-runs-a-70b-model-on-a-4gb-gpu-by-refusing-to-load-it-all-at-once-i5</guid>
      <description>&lt;p&gt;&lt;strong&gt;By &lt;a class="mentioned-user" href="https://dev.to/gbti"&gt;@gbti&lt;/a&gt;, &lt;a href="https://gbti.network/members/gbtilabs/" rel="noopener noreferrer"&gt;GBTI Network Member&lt;/a&gt;.&lt;/strong&gt; Originally published on &lt;a href="https://gbti.network/articles/airllm-large-models-on-small-gpus/" rel="noopener noreferrer"&gt;gbti.network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Most advice about running a large language model locally starts with the same gate: check your VRAM, then pick a model that fits inside it. A 70B model in half precision wants roughly 140GB, so the usual answer is to quantize it down, distill it, prune it, or accept a smaller model.&lt;/p&gt;

&lt;p&gt;AirLLM takes a different position. It argues the gate is an artifact of how models are loaded, not a law of the hardware.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;A transformer runs one layer at a time. Layer 1 produces an output, that output feeds layer 2, and so on to the end. At the moment layer 40 is computing, layers 1 through 39 have already done their work and layers 41 onward have not started. Nothing requires all of them to be sitting in VRAM simultaneously. It is simply convenient, and until recently there was little reason to arrange things otherwise.&lt;/p&gt;

&lt;p&gt;AirLLM shards the model to disk and loads each layer as its turn arrives, then releases it. Peak VRAM stops tracking the size of the model and starts tracking the size of its largest single layer. The project's headline claim follows from that: 70B inference on a single 4GB card, with no quantization, distillation, or pruning involved.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Two details do the practical work. Weights are read through memory-mapped files, so a layer does not need a full copy in system RAM on its way to the GPU. And a prefetch thread pulls layer N plus one from disk while the GPU is still working on layer N, which the project measured at roughly a ten percent improvement over loading strictly in sequence.&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;For sparse mixture-of-experts models the same reasoning goes further. A token routes to a small number of experts, so AirLLM streams individual experts rather than whole layers. The project reports Kimi K3, at 2.8 trillion parameters, running in 3.72GB of VRAM measured end to end on a single RTX 6000 Ada.&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;This is where a careful reading matters, because the framing invites a misunderstanding.&lt;/p&gt;

&lt;p&gt;AirLLM does not make a 70B model fast on a 4GB card. It makes a 70B model possible on a 4GB card. Every layer crosses the disk-to-GPU boundary on every forward pass, which as one write-up puts it converts a memory bottleneck into a disk bottleneck, feasible only because an NVMe drive reading at several gigabytes per second can keep the GPU fed at reduced throughput.&lt;sup id="fnref3"&gt;3&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;The most useful framing we found comes from Umesh Malik, who points out that the floor is arithmetic rather than opinion. A 70B model in half precision is roughly 140GB, and every token has to pull all of it past the GPU, so the storage bandwidth alone sets a minimum: about 20 seconds per token on a 7GB/s Gen4 NVMe, about 40 on Gen3, and around 255 seconds on a SATA SSD. Those are pure transfer floors that assume zero compute and zero overhead. Quantizing to 4-bit cuts the bytes per token to roughly 35GB and the Gen4 floor to about 5 seconds.&lt;sup id="fnref4"&gt;4&lt;/sup&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%2Fazr2fw4otnqlm2xuut7y.webp" 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%2Fazr2fw4otnqlm2xuut7y.webp" alt="An NVMe SSD beside mechanical hard drives and an optical disc" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reported speeds from people who ran it vary enough that the spread is itself the finding, which is a good reason to read several accounts rather than one:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Reported speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dashen Tech&lt;/td&gt;
&lt;td&gt;typically 1 to 3 tokens per second&lt;sup id="fnref5"&gt;5&lt;/sup&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;explainx.ai&lt;/td&gt;
&lt;td&gt;0.5 to 2 tokens per second, against 10 to 20 for a resident-in-memory setup&lt;sup id="fnref6"&gt;6&lt;/sup&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nerd Level Tech&lt;/td&gt;
&lt;td&gt;about 0.7 tokens per second for Llama 2 70B on NVMe with a dedicated GPU, and about 0.07 on an M2 MacBook Pro, roughly 50 tokens in 12 minutes&lt;sup id="fnref7"&gt;7&lt;/sup&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Community reports cited by Umesh Malik&lt;/td&gt;
&lt;td&gt;as low as 0.003 tokens per second, at which rate a 108,000-token output would take 416 days&lt;sup id="fnref4"&gt;4&lt;/sup&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Abrarqasim frames the comparison bluntly: a response that a 4-bit quantized 70B under llama.cpp returns in 20 to 90 seconds can take 5 to 20 minutes through AirLLM, putting it somewhere between 50 and 200 times slower than either a paid API or a quantized local model.&lt;sup id="fnref8"&gt;8&lt;/sup&gt; Nerd Level Tech reaches the same conclusion from the other direction, calling it a genuine accessibility achievement but not a replacement for production inference tools like llama.cpp or vLLM.&lt;sup id="fnref7"&gt;7&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Those are the terms the project is offering, and they suit a batch job or an overnight evaluation, where the work can run unattended and the wait costs nothing. They suit anything interactive very poorly.&lt;/p&gt;

&lt;p&gt;One cost that is easy to miss, and that we have not seen the project address: Abrarqasim notes that streaming an entire model off the drive for every token puts serious mileage on consumer SSDs, which are typically rated somewhere between 600 and 1200 terabytes written. Sustained use draws down a measurable share of that budget.&lt;sup id="fnref8"&gt;8&lt;/sup&gt; If you plan to leave a job running for days, that is worth thinking about before you start.&lt;/p&gt;

&lt;p&gt;The project does offer a speed lever: optional block-wise quantization compression, which it reports at up to three times faster inference with what it describes as almost ignorable accuracy loss.&lt;sup id="fnref9"&gt;9&lt;/sup&gt; Note that turning it on means the run is quantized, which trades away the specific thing that makes the unquantized claim interesting. Dashen Tech adds a fair counterpoint here: because the bottleneck is disk throughput rather than compute, only the weights need compressing, which is an easier thing to do without hurting accuracy than quantizing an entire inference path.&lt;sup id="fnref5"&gt;5&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stands
&lt;/h2&gt;

&lt;p&gt;AirLLM is Apache-2.0 licensed and has been in development since June 2023. At the time of writing it carries about 29,800 stars and 3,100 forks, with commits landing this month.&lt;sup id="fnref10"&gt;10&lt;/sup&gt; It has had its rounds of attention on Hacker News, and enough independent write-ups now exist that a reader can triangulate the claims rather than take the README at its word.&lt;sup id="fnref11"&gt;11&lt;/sup&gt;&lt;sup id="fnref12"&gt;12&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Installation is a pip package, and the entry point is deliberately unremarkable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;airllm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AutoModel&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AutoModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Qwen/Qwen3-32B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same single line reportedly scales up, with the project citing Qwen3-235B at around 3GB and DeepSeek-V3 at 671B in around 12GB.&lt;sup id="fnref1"&gt;1&lt;/sup&gt; Version 3.0, released in June 2026, added FP8 support alongside Qwen3, Llama 3.x and 4, DeepSeek V2 and V3, Phi-4 and Gemma. Earlier releases added macOS support and CPU inference.&lt;sup id="fnref2"&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Newer support can carry sharp edges. The Kimi K3 path, for example, requires &lt;code&gt;compressed-tensors&lt;/code&gt; and &lt;code&gt;flash-attn&lt;/code&gt;, a CUDA 12 build of torch because no prebuilt flash-attention wheel exists for CUDA 13 yet, and &lt;code&gt;transformers&lt;/code&gt; 4.56.x because the model's remote code does not load on 5.x.&lt;sup id="fnref2"&gt;2&lt;/sup&gt; That is worth knowing before setting aside an evening for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it is worth a look
&lt;/h2&gt;

&lt;p&gt;The interesting part is not the specific numbers, which will move. It is the reframing.&lt;/p&gt;

&lt;p&gt;Treating VRAM as a hard ceiling makes hardware the thing that decides which models you are allowed to run at all. Treating it as a working buffer makes hardware decide how long you wait. The second framing is the friendlier one for anyone learning, evaluating, or building on a machine they already own, and it is a useful reminder that some constraints are conventions that nobody has yet had a reason to question.&lt;/p&gt;

&lt;h2&gt;
  
  
  We have not run it, and we would like to hear from people who have
&lt;/h2&gt;

&lt;p&gt;To be plain about it: nobody at GBTI Network has used AirLLM. Everything above comes from the project's own documentation and from third-party write-ups, cited as such, and none of the performance figures have been reproduced here. Treat this as a pointer to something worth investigating, not as a review.&lt;/p&gt;

&lt;p&gt;That gap is exactly where the network is useful. If you have run AirLLM, we would like to hear the specifics that documentation never captures: what card and what storage, which model, what token rate you actually saw, whether the compression option was worth enabling, and what broke on the way. A report that it did not work is as useful as one that it did.&lt;/p&gt;

&lt;p&gt;Leave a comment on this article, or bring it to Discord if it turns into a longer conversation. If enough measurements come in, we will write them up as a follow-up and credit the members who supplied them.&lt;/p&gt;

&lt;p&gt;Photographs by Sergei Starostin&lt;sup id="fnref13"&gt;13&lt;/sup&gt; and Andrey Matveev&lt;sup id="fnref14"&gt;14&lt;/sup&gt;, both on Pexels.&lt;/p&gt;

&lt;p&gt;The resource shared in this post is a new article published by GBTI Network member GBTI Network. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Are you a writer, musician, or product developer? We would love to support your work on the GBTI Network. For more information about how to join our community visit &lt;a href="https://gbti.network" rel="noopener noreferrer"&gt;https://gbti.network&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To follow GBTI Network's work more closely, consider joining our network and subscribing to them directly: &lt;a href="https://gbti.network/members/gbtilabs/" rel="noopener noreferrer"&gt;https://gbti.network/members/gbtilabs/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;AirLLM project README, accessed August 7, 2026: &lt;a href="https://github.com/lyogavin/airllm" rel="noopener noreferrer"&gt;lyogavin/airllm&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;AirLLM release notes in the project README (v2.5 prefetching, v2.8.2 macOS, v2.10.1 CPU inference, v3.0 FP8, and the July 2026 Kimi K3 entry), accessed August 7, 2026.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;Starlog, "Running 70B LLMs on a 4GB GPU: How AirLLM Trades Speed for Accessibility," accessed August 7, 2026: &lt;a href="https://starlog.is/articles/llm-engineering/lyogavin-airllm/" rel="noopener noreferrer"&gt;starlog.is&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;Umesh Malik, "Run 70B LLM on 4GB GPU: AirLLM's Real Tradeoff," accessed August 7, 2026. The per-storage-tier floors and the 416-day figure are his: &lt;a href="https://umesh-malik.com/blog/run-70b-llm-on-4gb-gpu-airllm" rel="noopener noreferrer"&gt;umesh-malik.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn5"&gt;
&lt;p&gt;Dashen Tech, "The Complete AirLLM Guide: Run 70B LLMs on a 4GB GPU," accessed August 7, 2026: &lt;a href="https://dashen-tech.com/en/dev-tools/airllm-4gb-gpu-70b-llm-guide/" rel="noopener noreferrer"&gt;dashen-tech.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn6"&gt;
&lt;p&gt;explainx.ai, "AirLLM: Run 70B LLM on 4GB GPU, No Quantization," accessed August 7, 2026: &lt;a href="https://explainx.ai/blog/airllm-run-70b-llm-4gb-gpu-inference-2026" rel="noopener noreferrer"&gt;explainx.ai&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn7"&gt;
&lt;p&gt;Nerd Level Tech, "AirLLM Tested: Run a 70B LLM on a 4GB GPU, Does It Work?," accessed August 7, 2026: &lt;a href="https://nerdleveltech.com/airllm-run-70b-llm-single-4gb-gpu" rel="noopener noreferrer"&gt;nerdleveltech.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn8"&gt;
&lt;p&gt;Abrarqasim, "AirLLM Review: The Truth Behind Running 70B LLMs Locally," accessed August 7, 2026. The 50x to 200x comparison and the SSD endurance point are his: &lt;a href="https://abrarqasim.com/blog/airllm-the-hype-vs-the-reality/" rel="noopener noreferrer"&gt;abrarqasim.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn9"&gt;
&lt;p&gt;AirLLM README, "Model Compression - 3x Inference Speed Up," which cites block-wise quantization research at &lt;a href="https://arxiv.org/abs/2212.09720" rel="noopener noreferrer"&gt;arXiv:2212.09720&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn10"&gt;
&lt;p&gt;GitHub repository metadata for lyogavin/airllm, read August 7, 2026: Apache-2.0, created June 12, 2023, most recent push August 6, 2026.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn11"&gt;
&lt;p&gt;Hacker News discussion, "AirLLM 70B inference with single 4GB GPU": &lt;a href="https://news.ycombinator.com/item?id=49154228" rel="noopener noreferrer"&gt;news.ycombinator.com&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn12"&gt;
&lt;p&gt;Bright Coding, "AirLLM: Run 70B Models on 4GB GPUs Without Compromise," February 27, 2026: &lt;a href="https://www.blog.brightcoding.dev/2026/02/27/airllm-run-70b-models-on-4gb-gpus-without-compromise" rel="noopener noreferrer"&gt;blog.brightcoding.dev&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn13"&gt;
&lt;p&gt;Memory modules photograph by Sergei Starostin on Pexels, used under the &lt;a href="https://www.pexels.com/license/" rel="noopener noreferrer"&gt;Pexels License&lt;/a&gt;: &lt;a href="https://www.pexels.com/photo/green-and-black-computer-ram-stick-6636474/" rel="noopener noreferrer"&gt;pexels.com/photo/6636474&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn14"&gt;
&lt;p&gt;Storage media photograph by Andrey Matveev on Pexels, used under the &lt;a href="https://www.pexels.com/license/" rel="noopener noreferrer"&gt;Pexels License&lt;/a&gt;: &lt;a href="https://www.pexels.com/photo/modern-and-vintage-data-storage-solutions-35147150/" rel="noopener noreferrer"&gt;pexels.com/photo/35147150&lt;/a&gt;&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>llm</category>
      <category>inference</category>
      <category>opensource</category>
      <category>gpu</category>
    </item>
    <item>
      <title>VSCode Extension: Terminal Session Profiles</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Tue, 04 Aug 2026 02:20:57 +0000</pubDate>
      <link>https://dev.to/gbti-network/vscode-extension-terminal-session-profiles-39k5</link>
      <guid>https://dev.to/gbti-network/vscode-extension-terminal-session-profiles-39k5</guid>
      <description>&lt;p&gt;&lt;strong&gt;By &lt;a class="mentioned-user" href="https://dev.to/atwellpub"&gt;@atwellpub&lt;/a&gt;, &lt;a href="https://gbti.network/members/atwellpub/" rel="noopener noreferrer"&gt;GBTI Network Member&lt;/a&gt;.&lt;/strong&gt; Originally published on &lt;a href="https://gbti.network/products/terminal-session-profiles/" rel="noopener noreferrer"&gt;gbti.network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Over the past two years, the introduction of tools such as Claude Code has made terminal management a much more central part of the day-to-day development workbench. Terminals are no longer temporary scratch space. They often represent distinct, long-running parts of a project, each with its own name, working directory, and purpose.&lt;/p&gt;

&lt;p&gt;Our own terminal configuration commonly includes several named Claude Code sessions, each with its own name inside Claude Code and remote control enabled by default. We also tend to keep one PowerShell terminal open for running Windows commands and one WSL terminal for working directly within Windows Subsystem for Linux. It is therefore not unusual for us to have three to five terminal tabs open within a single project.&lt;/p&gt;

&lt;p&gt;VS Code already supports &lt;a href="https://code.visualstudio.com/docs/terminal/advanced" rel="noopener noreferrer"&gt;persistent terminal sessions&lt;/a&gt;, but its native features are spread across terminal profiles, tasks, settings, and workspace permissions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=GBTI.gbti-terminal-sessions" rel="noopener noreferrer"&gt;Terminal Session Profiles&lt;/a&gt; brings those pieces into one UI and adds reusable workspace or global profiles, ordered startup commands, automatic reprovisioning, and optional Claude session resume commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terminal session profile manager
&lt;/h2&gt;

&lt;p&gt;A profile is a saved terminal setup: which shell to open, where, and what to run once it is ready. Create one from the sidebar's ＋, or right-click any terminal and choose &lt;strong&gt;Save as Instance Profile&lt;/strong&gt; to start from a terminal you already have open.&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%2Fru8ox22utmh0apzhe02r.webp" 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%2Fru8ox22utmh0apzhe02r.webp" alt="The Session Profiles view, with a profile launching an agent in the terminal column" width="800" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Profiles can be created from the Session Profiles sidebar or saved from a terminal that is already open. Once created, each profile remains available within the project and can be launched whenever it is needed.&lt;/p&gt;

&lt;p&gt;A typical project might include separate profiles for several named Claude Code sessions, a development server, a build watcher, a general PowerShell terminal, and a WSL terminal. Instead of manually rebuilding each of these environments, they become reusable parts of the project.&lt;/p&gt;

&lt;p&gt;Each profile includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A profile name&lt;/li&gt;
&lt;li&gt;A shell&lt;/li&gt;
&lt;li&gt;A working directory&lt;/li&gt;
&lt;li&gt;An ordered list of commands&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu7yzrr7zin05s1j6gdmi.webp" 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%2Fu7yzrr7zin05s1j6gdmi.webp" alt="The profile editor showing the profile name, shell, working directory, and ordered commands" width="799" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Commands are replayed literally and in the order they are written. Every command except the final one is awaited before the next begins. This allows a profile to prepare an environment before launching a long-running process such as an agent, development server, or file watcher.&lt;/p&gt;

&lt;p&gt;For example, a profile can use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude --resume ClaudeCodeSessionName
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to reopen a particular named Claude Code session.&lt;/p&gt;

&lt;p&gt;This allows each terminal profile to correspond directly with a specific Claude Code session. A project can maintain several independently named agents, each launched in the correct working directory with its intended session restored.&lt;/p&gt;

&lt;p&gt;Commands are not limited to coding agents. A profile can also activate an environment, start a local server, launch a build process, open a project-specific shell, or perform any other command-line preparation the project requires.&lt;/p&gt;

&lt;p&gt;Profiles can optionally be added to the terminal &lt;code&gt;+&lt;/code&gt; dropdown as named terminal profiles. This allows them to remain accessible through VS Code’s familiar terminal controls while still benefiting from the command replay managed by the extension.&lt;/p&gt;

&lt;h2&gt;
  
  
  Restoring profiles after a restart
&lt;/h2&gt;

&lt;p&gt;VS Code includes native terminal persistence, but restoring a terminal tab is not necessarily the same as restoring the terminal session that previously occupied it.&lt;/p&gt;

&lt;p&gt;A restored tab may retain its old name and scrollback while reopening as a new default shell with none of its previous processes running. The tab looks familiar, but the environment it represented is no longer there.&lt;/p&gt;

&lt;p&gt;Terminal Session Profiles handles the other half of that recovery.&lt;/p&gt;

&lt;p&gt;Profiles that were running are remembered per workspace. When the project is opened again, the extension identifies the restored terminal tabs associated with those profiles and relaunches them using the correct shell, working directory, and command sequence.&lt;/p&gt;

&lt;p&gt;Restoration happens automatically by default. It can also be started manually through the &lt;strong&gt;Restore&lt;/strong&gt; control in the status bar.&lt;/p&gt;

&lt;p&gt;Before replacing a restored terminal, the extension compares the process recorded when the profile was launched with the process that returned. If the original process genuinely survived, the terminal is left alone rather than being terminated and recreated.&lt;/p&gt;

&lt;p&gt;The objective is simple: reopening a project should also restore the terminal environment that belongs to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional workspace layout
&lt;/h2&gt;

&lt;p&gt;By default, VS Code places the terminal in a horizontal panel beneath the primary workspace, while the Explorer, editor, and AI chat interface occupy the taller areas above it. This arrangement reflects a workflow in which the terminal is treated as a supporting tool rather than one of the main places where work happens.&lt;/p&gt;

&lt;p&gt;That was no longer true for us. As Claude Code and other terminal-based tools became a larger part of our development process, the terminal became just as central as the editor, and sometimes more important. We wanted the option to bring it into the primary workspace as its own column, alongside the Explorer, editor, and chat interface, rather than leaving it confined to a secondary row at the bottom of the IDE.&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%2F3vto43cq87oo6u1ce2ui.webp" 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%2F3vto43cq87oo6u1ce2ui.webp" alt="Four columns, one keystroke each: Explorer, editor, terminal, and chat with their status bar controls" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once each of these areas became a meaningful part of the daily workbench, we also needed better ways to control focus and move quickly between them. The layout enhancements provide status-bar controls for showing and hiding the Explorer, editor, terminal, and chat areas, with each workspace remembering its own arrangement.&lt;/p&gt;

&lt;p&gt;The layout controls VS Code’s real interface containers rather than replacing or recreating them. The Explorer remains the standard Explorer. The terminal retains its normal terminal list and controls. Claude Code, Codex, and other chat interfaces continue to operate within their existing panels.&lt;/p&gt;

&lt;p&gt;This is important because the layout enhancement does not attempt to introduce a replacement workspace. It provides faster controls for arranging the tools already present in VS Code.&lt;/p&gt;

&lt;p&gt;One column always remains visible, preventing the workspace from being reduced to an empty window. A &lt;strong&gt;Reset Layout&lt;/strong&gt; command restores the standard arrangement whenever needed.&lt;/p&gt;

&lt;p&gt;We felt these improvements belonged naturally within the same extension because they address the workspace surrounding the terminal sessions it manages. The layout remains entirely optional and can be disabled through the extension settings without affecting session profiles, command replay, or terminal restoration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Independent features
&lt;/h2&gt;

&lt;p&gt;The terminal session profile manager and the column layout are related enhancements, but neither depends on the other.&lt;/p&gt;

&lt;p&gt;Disabling the column layout does not disable profiles. Saved profiles can still be launched, their commands can still be replayed, and active profile sessions can still be restored when a project reopens.&lt;/p&gt;

&lt;p&gt;Layout preferences are also remembered separately for each workspace. A project in which the layout has been disabled will remain that way across restarts, while another workspace can continue using the column arrangement.&lt;/p&gt;

&lt;p&gt;There is deliberately no master switch inside the extension that disables every feature at once. The column controls manage the layout, while the session settings manage profile restoration. The extension itself can still be disabled through VS Code’s Extensions view.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keyboard and workspace controls
&lt;/h2&gt;

&lt;p&gt;The extension includes commands for managing profiles, restoring sessions, navigating the column layout, and resetting the workspace.&lt;/p&gt;

&lt;p&gt;Default shortcuts include:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Toggle Explorer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+Alt+1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toggle editor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+Alt+2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toggle terminal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+Alt+3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toggle chat&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+Alt+4&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open a new terminal in the terminal column&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+Shift+`&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grow the focused column&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+Alt+Right&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shrink the focused column&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+Alt+Left&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Additional commands are available through the Command Palette and status-bar controls for creating profiles, editing profiles, restoring the last session, enabling or disabling the layout, and resetting the workspace arrangement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Search for &lt;strong&gt;Terminal Session Profiles&lt;/strong&gt; in the VS Code Extensions view.&lt;/p&gt;

&lt;p&gt;You can also install it through Quick Open with &lt;code&gt;Ctrl+P&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ext install GBTI.gbti-terminal-sessions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terminal Session Profiles is published through the Visual Studio Marketplace as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GBTI.gbti-terminal-sessions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is also available through Open VSX for VSCodium and compatible editors.&lt;/p&gt;

&lt;p&gt;Terminal Session Profiles is free, open source, and licensed under MIT.&lt;/p&gt;

&lt;p&gt;The resource shared in this post is a new product published by GBTI Network member Hudson Atwell. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Are you a writer, musician, or product developer? We would love to support your work on the GBTI Network. For more information about how to join our community visit &lt;a href="https://gbti.network" rel="noopener noreferrer"&gt;https://gbti.network&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To follow Hudson Atwell's work more closely, consider joining our network and subscribing to them directly: &lt;a href="https://gbti.network/members/atwellpub/" rel="noopener noreferrer"&gt;https://gbti.network/members/atwellpub/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>vscode</category>
      <category>terminal</category>
      <category>sessions</category>
      <category>profiles</category>
    </item>
    <item>
      <title>Resolve Open Questions: a /qa Skill for Claude Code</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Fri, 31 Jul 2026 17:22:00 +0000</pubDate>
      <link>https://dev.to/gbti-network/resolve-open-questions-a-qa-skill-for-claude-code-1jp2</link>
      <guid>https://dev.to/gbti-network/resolve-open-questions-a-qa-skill-for-claude-code-1jp2</guid>
      <description>&lt;p&gt;&lt;strong&gt;By &lt;a class="mentioned-user" href="https://dev.to/atwellpub"&gt;@atwellpub&lt;/a&gt;, &lt;a href="https://gbti.network/members/atwellpub/" rel="noopener noreferrer"&gt;GBTI Network Member&lt;/a&gt;.&lt;/strong&gt; Originally published on &lt;a href="https://gbti.network/prompts/qa-skill-for-claude-code-and-codex/" rel="noopener noreferrer"&gt;gbti.network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Claude Code loads any markdown file at &lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt; as a reusable slash command (a "skill"). This one gives your agent a &lt;code&gt;/qa&lt;/code&gt; command that stops before it builds, pulls every unresolved decision into a single batch of questions, and refuses to write code until you have answered them.&lt;/p&gt;

&lt;p&gt;It exists because open questions have a habit of surfacing at the wrong end of the work. A sprint finishes, and only then does the agent raise the decisions it should have raised at the start, at exactly the point where acting on them means redoing something.&lt;/p&gt;

&lt;p&gt;The mechanism is plan mode, invoked deliberately. The agent puts ITSELF into a read-only state, does its research there, asks everything it found in one batch, and only then acts. That ordering is the whole feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create &lt;code&gt;.claude/skills/qa/&lt;/code&gt; in your repo, or &lt;code&gt;~/.claude/skills/qa/&lt;/code&gt; to have it in every project.&lt;/li&gt;
&lt;li&gt;Save the file below as &lt;code&gt;SKILL.md&lt;/code&gt; inside it.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;/qa&lt;/code&gt; in Claude Code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nothing to configure. The skill reads your project, not a config file.&lt;/p&gt;

&lt;h2&gt;
  
  
  The skill file
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;qa&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;"&lt;/span&gt;
  &lt;span class="s"&gt;Resolve the open questions before the work proceeds. Invoke for "/qa", "/qa continue", "/qa proceed",&lt;/span&gt;
  &lt;span class="s"&gt;"/qa deep", "/qa &amp;lt;topic&amp;gt;", or when the user asks you to ask your questions first, clarify before&lt;/span&gt;
  &lt;span class="s"&gt;building, or answer the things you just raised. By default it interrogates only YOUR OWN LAST REPLY&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;the questions, options and flagged decisions already sitting in it. "/qa deep" runs the full&lt;/span&gt;
  &lt;span class="s"&gt;six-category sweep instead. Every mode enters plan mode; "continue" and "proceed" skip the plan&lt;/span&gt;
  &lt;span class="s"&gt;approval and build straight from the answers.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# /qa: resolve the open questions before building&lt;/span&gt;

The point of this command is to move every decision that is the user's call OUT of your head and
into one batch of questions, answered before any code is written. No silent defaults, no drip of
ad-hoc questions later.

The common case is small and cheap: a reply just ended with open questions in it, and the user wants
those answered properly instead of letting them evaporate. That is the default. The exhaustive sweep
is a separate, deliberate mode, because it costs real tokens and most invocations do not need it.

&lt;span class="gu"&gt;## Read the argument first, it selects the mode&lt;/span&gt;

&lt;span class="sb"&gt;`continue`&lt;/span&gt;, &lt;span class="sb"&gt;`proceed`&lt;/span&gt; and &lt;span class="sb"&gt;`deep`&lt;/span&gt; are reserved words. Anything else is a topic.

| Invocation | Mode |
|---|---|
| &lt;span class="sb"&gt;`/qa`&lt;/span&gt; | &lt;span class="gs"&gt;**Ask and hold, last reply.**&lt;/span&gt; Enter plan mode (&lt;span class="sb"&gt;`EnterPlanMode`&lt;/span&gt;), interrogate your own last reply, ask what it left open, then present a plan for approval (&lt;span class="sb"&gt;`ExitPlanMode`&lt;/span&gt;). Write nothing until approved. |
| &lt;span class="sb"&gt;`/qa continue`&lt;/span&gt; or &lt;span class="sb"&gt;`/qa proceed`&lt;/span&gt; | &lt;span class="gs"&gt;**Ask and go.**&lt;/span&gt; Identical, minus the confirmation before acting: once the answers land you build straight from them, with no plan written for review. |
| &lt;span class="sb"&gt;`/qa deep`&lt;/span&gt; | &lt;span class="gs"&gt;**Full sweep.**&lt;/span&gt; Step 2's six categories instead of the last-reply scope. Use when starting real work, not when closing out a reply. |
| &lt;span class="sb"&gt;`/qa deep continue`&lt;/span&gt; or &lt;span class="sb"&gt;`/qa deep proceed`&lt;/span&gt; | Full sweep, no approval round. Scope and approval are independent. |
| &lt;span class="sb"&gt;`/qa &amp;lt;anything else&amp;gt;`&lt;/span&gt; | &lt;span class="gs"&gt;**Scoped.**&lt;/span&gt; The trailing text names the subject to interrogate. Add &lt;span class="sb"&gt;`continue`&lt;/span&gt; or &lt;span class="sb"&gt;`proceed`&lt;/span&gt; to drop the approval round for it. |

Every mode enters plan mode and holds its read-only discipline until the questions are answered. The
question-asking discipline in step 3 is identical in all of them; only the SCOPE and the approval
round change.

&lt;span class="gu"&gt;## Step 1: verify before you ask&lt;/span&gt;

Never ask what the repository can answer. Check the claims your questions rest on before putting them
to the user, so every question is one that genuinely cannot be resolved without them. A question the
code already answers is noise, and it teaches the user that /qa wastes their time.

In the default mode this is targeted, not a survey: confirm the specific facts behind the items your
last reply raised. A flagged failure may already have its reason recorded somewhere; an offered option
may turn out to be impossible or already done. Verifying first routinely dissolves a question or
changes what it should have been.

&lt;span class="gu"&gt;## Step 2: what to interrogate&lt;/span&gt;

&lt;span class="gs"&gt;**Default: your own last reply.**&lt;/span&gt; Re-read the reply you just gave and pull out everything you left
open: questions you asked, options you offered, decisions you named as the user's, caveats you
attached, and anything you said you COULD do next. That set is the batch. Do not sweep the codebase.

If the last reply left nothing open, say so plainly and stop. Do not go hunting for work to justify
the invocation.

&lt;span class="gs"&gt;**Deep (`/qa deep`): the full sweep.**&lt;/span&gt; Cover all of these, not just the obvious one:
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**The request itself.**&lt;/span&gt; Scope boundaries, what is deliberately excluded, naming, placement.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**The governing doc.**&lt;/span&gt; If the work traces to a planning document (a scope of work, a ticket, a
   spec), its open-questions section is the primary source. Pull those forward verbatim.
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**What the audit surfaced.**&lt;/span&gt; Which existing pattern to reuse, where a shared helper lives,
   whether to extend a surface or add one.
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Anything you were about to default silently.**&lt;/span&gt; If you caught yourself picking, it is a
   question. This is the highest-yield category.
&lt;span class="p"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**The user's call by nature.**&lt;/span&gt; Product and UX behavior, copy, data-shape changes, anything
   irreversible or outward-facing, and anything that costs money or needs provisioning.
&lt;span class="p"&gt;6.&lt;/span&gt; &lt;span class="gs"&gt;**Conflicts.**&lt;/span&gt; Where the request contradicts an existing convention, the code, or an earlier
   decision, surface the conflict rather than quietly picking a side.

&lt;span class="gu"&gt;## Step 3: how to ask&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**One batch, numbered, in prose.**&lt;/span&gt; Free-form conversational questions, not multiple-choice
  pickers, unless a question is a genuine either/or.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Give each question a recommendation.**&lt;/span&gt; State the option you would take and why, so the user can
  answer "your call" on any of them and you are still unblocked.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Give each question its stakes in one line.**&lt;/span&gt; What changes depending on the answer. A question
  whose answer changes nothing should not be asked.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Order by consequence**&lt;/span&gt;, most structural first.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Say so when there are none.**&lt;/span&gt; If verification resolved everything, report that plainly and state
  the assumptions you are proceeding under. Do not manufacture questions to justify the command.

&lt;span class="gu"&gt;## Step 4: after the answers&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**Do not re-ask.**&lt;/span&gt; Answered means settled; carry it forward without relitigating.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Record the resolutions where they belong.**&lt;/span&gt; If a planning doc raised the question, write the
  answer back into it so it reads as resolved, not still open.
&lt;span class="p"&gt;-&lt;/span&gt; In ask-and-hold mode, present the plan for approval. In continue/proceed mode, leave plan mode as
  soon as the answers land and build, without composing a plan for review. The harness still
  surfaces a single prompt on the way out of plan mode; that is a formality, not a review round, so
  keep what you write there to a line or two.
&lt;span class="p"&gt;-&lt;/span&gt; If something genuinely new surfaces mid-build, finish everything that does not depend on it, then
  raise the one question at the right moment.

&lt;span class="gu"&gt;## Reminders&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Follow the project's own plan-mode and writing conventions throughout.
&lt;span class="p"&gt;-&lt;/span&gt; The command is about decisions, not permission. Do not turn it into a request to confirm work the
  user already asked for.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The modes
&lt;/h2&gt;

&lt;p&gt;The argument controls two independent things: how wide the agent looks, and whether a plan gets approved before it acts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/qa&lt;/code&gt;&lt;/strong&gt; is the default, and it is deliberately narrow: the agent interrogates its own last reply. Whatever it just left open becomes the batch. This is the everyday case, and it costs almost nothing because there is no sweep.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/qa continue&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;/qa proceed&lt;/code&gt;&lt;/strong&gt; is the same, minus the approval round. You answer, it builds. Still plan mode, so nothing gets written while the questions are open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/qa deep&lt;/code&gt;&lt;/strong&gt; widens the scope to the full six-category sweep in the skill file: the request, the governing doc, the audit findings, silent defaults, the decisions that are inherently yours, and conflicts with existing conventions. Use it when you are starting real work, not when you are closing out a reply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/qa &amp;lt;anything else&amp;gt;&lt;/code&gt;&lt;/strong&gt; scopes to a subject. &lt;code&gt;"/qa the rate limiter"&lt;/code&gt; asks everything unresolved about the rate limiter specifically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scope and approval compose, so &lt;code&gt;/qa deep continue&lt;/code&gt; runs the wide sweep and then builds from your answers without a plan to approve.&lt;/p&gt;

&lt;p&gt;The narrow default is the important design choice. An exhaustive sweep on every invocation is expensive and mostly wasted, because the usual reason you type &lt;code&gt;/qa&lt;/code&gt; is that the agent just handed you a list of open questions and you want them asked properly rather than left to evaporate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making it yours
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tune the deep sweep.&lt;/strong&gt; Step 2 lists six places to look under &lt;code&gt;/qa deep&lt;/code&gt;. The list is deliberately generic, so add the categories your projects actually produce. A team with a design system adds "which token or component does this reuse". A team with a data model adds "does this change a stored shape, and what happens to existing rows". A regulated project adds an approvals category. The sweep is only as good as its list, and it only runs when you ask for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Point it at your planning docs.&lt;/strong&gt; The highest-yield item in the sweep is a governing document with an open-questions section, since those questions are already written and already yours to answer. If your project keeps scopes of work, tickets or design docs, name that location explicitly in step 2 so the agent reads it every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decide how hard the hold is.&lt;/strong&gt; As written, bare &lt;code&gt;/qa&lt;/code&gt; will not touch a file until you approve a plan. If that is heavier than you want for routine work, make &lt;code&gt;continue&lt;/code&gt; the implied default in your copy and reserve the plan-approval round for large changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decide what "last reply" means to you.&lt;/strong&gt; The default reads the agent's most recent message and treats everything it left open as the batch. If your sessions tend to sprawl across several exchanges before you reach for &lt;code&gt;/qa&lt;/code&gt;, widen that to the current thread of work, or just type &lt;code&gt;/qa deep&lt;/code&gt; when the narrow read would miss something.&lt;/p&gt;

&lt;p&gt;The resource shared in this post is a new prompt published by GBTI Network member &lt;a href="https://dev.to/realatwellpub"&gt;Hudson Atwell&lt;/a&gt;. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Are you a writer, musician, or product developer? We would love to support your work on the GBTI Network. For more information about how to join our community visit &lt;a href="https://gbti.network" rel="noopener noreferrer"&gt;https://gbti.network&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To follow Hudson Atwell's work more closely, consider joining our network and subscribing to them directly: &lt;a href="https://gbti.network/members/atwellpub/" rel="noopener noreferrer"&gt;https://gbti.network/members/atwellpub/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>claudecode</category>
      <category>agentskills</category>
      <category>planning</category>
      <category>workflow</category>
    </item>
    <item>
      <title>Manage Scopes of Work: a /sow Skill for Claude Code</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Tue, 28 Jul 2026 13:10:49 +0000</pubDate>
      <link>https://dev.to/gbti-network/manage-scopes-of-work-a-sow-skill-for-claude-code-33ke</link>
      <guid>https://dev.to/gbti-network/manage-scopes-of-work-a-sow-skill-for-claude-code-33ke</guid>
      <description>&lt;p&gt;&lt;strong&gt;By Hudson Atwell, &lt;a href="https://gbti.network/members/atwellpub/" rel="noopener noreferrer"&gt;GBTI Network Member&lt;/a&gt;.&lt;/strong&gt; Originally published on &lt;a href="https://gbti.network/prompts/scope-of-work-manager-claude-code-skill/" rel="noopener noreferrer"&gt;gbti.network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Claude Code loads any markdown file at &lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt; as a reusable slash command (a "skill"). This one gives your agent a &lt;code&gt;/sow&lt;/code&gt; command for managing Scopes of Work: local, lane-based planning documents that move kanban-style from queue to completed, living beside your code but outside version control.&lt;/p&gt;

&lt;p&gt;It exists because agent-driven projects accumulate work items faster than anyone can track them in their head. A SOW gives every work item one canonical markdown file with a status banner, phases, and open questions; the lanes give the whole project a glanceable board; and the authoring rules keep the agent from duplicating items or writing plans detached from the real code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create &lt;code&gt;.claude/skills/sow/&lt;/code&gt; in your repo.&lt;/li&gt;
&lt;li&gt;Save the file below as &lt;code&gt;.claude/skills/sow/SKILL.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Adjust the lane subfolders and conventions to your project (see Making it yours).&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;/sow init&lt;/code&gt; once to scaffold the framework, then &lt;code&gt;/sow &amp;lt;request&amp;gt;&lt;/code&gt; to author.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The skill file
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sow&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;"&lt;/span&gt;
  &lt;span class="s"&gt;Author or improve a Scope of Work (SOW) in .data/sow/. Invoke for "/sow", "/sow init",&lt;/span&gt;
  &lt;span class="s"&gt;"create a sow", "write a sow", or when the user asks to capture work as a SOW. "/sow init"&lt;/span&gt;
  &lt;span class="s"&gt;scaffolds the lane framework (idempotent). Otherwise enforce the pre-checks&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;improve an existing&lt;/span&gt;
  &lt;span class="s"&gt;SOW before creating a new one, ground it in a code audit, reference related completed SOWs,&lt;/span&gt;
  &lt;span class="s"&gt;default the lane to queue, and follow the project's plan-mode and writing conventions.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Managing Scopes of Work&lt;/span&gt;

SOWs are local planning documents in &lt;span class="sb"&gt;`.data/sow/`&lt;/span&gt; (kept OUT of version control), organized into
lanes a work item moves through: &lt;span class="sb"&gt;`0_queue`&lt;/span&gt; -&amp;gt; &lt;span class="sb"&gt;`1_progressing`&lt;/span&gt; -&amp;gt; &lt;span class="sb"&gt;`2_waiting_review`&lt;/span&gt; -&amp;gt;
&lt;span class="sb"&gt;`3_completed`&lt;/span&gt;, plus a &lt;span class="sb"&gt;`_staging`&lt;/span&gt; side-lane for items parked on an external blocker. One canonical
markdown file per SOW; move the same file between lanes as the work advances.

&lt;span class="gu"&gt;## Initialize (/sow init)&lt;/span&gt;

When invoked as /sow init (or when the lane folders do not exist yet), scaffold idempotently, then
stop (this command only builds folders, it never authors a SOW):

&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;bash
&lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .data/sow/&lt;span class="o"&gt;{&lt;/span&gt;_staging,0_queue,1_progressing,2_waiting_review,3_completed&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; .data/sow/todo.md &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'# SOW todo\n'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .data/sow/todo.md
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qxF&lt;/span&gt; &lt;span class="s1"&gt;'.data/'&lt;/span&gt; .gitignore 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'.data/'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .gitignore
&lt;span class="p"&gt;```&lt;/span&gt;

It creates only what is missing and never overwrites an existing todo.md.

&lt;span class="gu"&gt;## Authoring a SOW: do these steps IN ORDER&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Improve an existing SOW first (never duplicate).**&lt;/span&gt; Search the open lanes for a SOW this work
   belongs in and extend it (a decision, a phase, an open-question resolution). An item in
   2_waiting_review is code-complete, so additions there are dated review-feedback notes. Only
   create a new SOW when no open SOW is a reasonable home, and say that you checked.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Ground it in a code audit (no guessing).**&lt;/span&gt; Read the real code so the SOW cites file and line
   and the true root cause, not assumptions. For a bug, name the root cause; for a feature, name
   the surfaces and the pattern to reuse. Prefer reusing existing infrastructure.
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Reference related completed SOWs.**&lt;/span&gt; Search the completed lane and cite the relevant items:
   dependencies, the origin of a regression, or the pattern to reuse, each by id and path.
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Number and place it.**&lt;/span&gt; Find the next free sow-NNN. Default the lane to 0_queue unless told to
   start in 1_progressing. Group SOWs into subfolders matching your project's areas.
&lt;span class="p"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**Plan mode and conventions.**&lt;/span&gt; Every SOW is BUILT in plan mode: add a banner note saying its
   build begins there, and leave genuine decisions as open questions rather than pinning what is
   the owner's call. Follow your project's writing conventions throughout.
&lt;span class="p"&gt;6.&lt;/span&gt; &lt;span class="gs"&gt;**Structure.**&lt;/span&gt; Frontmatter: id, title, status (matching the lane), priority, phase, created (an
   absolute date), depends_on, related, owner. Then the title, a status banner (what and why,
   grounded in the audit), design decisions, phases, constraints and guardrails, open questions,
   and cross-references.
&lt;span class="p"&gt;7.&lt;/span&gt; &lt;span class="gs"&gt;**Design-first SOWs.**&lt;/span&gt; A SOW that redesigns a visual surface is never built from prose: request
   a mockup, store the assets under &lt;span class="sb"&gt;`sow-NNN-assets/`&lt;/span&gt; with a source note, and reference them.

&lt;span class="gu"&gt;## Reminders&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; The planning docs are local only and never committed.
&lt;span class="p"&gt;-&lt;/span&gt; A SOW is a living document: keep its status field and lane in sync as work moves.
&lt;span class="p"&gt;-&lt;/span&gt; When a build completes, write an as-built note into the banner before moving lanes, so the doc
  reads true months later.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Making it yours
&lt;/h2&gt;

&lt;p&gt;Three dials worth adjusting:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lane subfolders&lt;/strong&gt;: group SOWs by your project's real areas (a frontend/backend split, per-service folders, whatever matches how work divides). The skill file's step 4 is where that rule lives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conventions&lt;/strong&gt;: point step 5 at your project's actual writing and review conventions so authored SOWs match the docs around them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The planning root&lt;/strong&gt;: &lt;code&gt;.data/sow/&lt;/code&gt; is a convention, not a requirement; any gitignored folder works. Keep it out of version control either way; plans churn too fast for useful history and the lanes ARE the state.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why the rules are in there
&lt;/h2&gt;

&lt;p&gt;Each authoring rule closes a failure mode agents repeat: creating a duplicate SOW instead of extending the open one (rule 1); writing plans from memory that cite code that does not exist (rule 2); losing the thread between related work items (rule 3); and building straight from a prose wish without surfacing the decisions that belong to a human (rule 5). The lane system does the rest: at any moment, the queue is the backlog, progressing is the work in flight, waiting-review is what needs a human eye, and completed is the record.&lt;/p&gt;

&lt;p&gt;The resource shared in this post is a new prompt published by GBTI Network member Hudson Atwell. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Are you a writer, musician, or product developer? We would love to support your work on the GBTI Network. For more information about how to join our community visit &lt;a href="https://gbti.network" rel="noopener noreferrer"&gt;https://gbti.network&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To follow Hudson Atwell's work more closely, consider joining our network and subscribing to them directly: &lt;a href="https://gbti.network/members/atwellpub/" rel="noopener noreferrer"&gt;https://gbti.network/members/atwellpub/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>sow</category>
      <category>workflow</category>
      <category>planning</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Pre-Skill Prompt: Responsive Design Audit with MCP Playwright</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Tue, 21 Jul 2026 22:29:12 +0000</pubDate>
      <link>https://dev.to/gbti-network/pre-skill-prompt-responsive-design-audit-with-mcp-playwright-1icb</link>
      <guid>https://dev.to/gbti-network/pre-skill-prompt-responsive-design-audit-with-mcp-playwright-1icb</guid>
      <description>&lt;p&gt;&lt;strong&gt;By &lt;a class="mentioned-user" href="https://dev.to/atwellpub"&gt;@atwellpub&lt;/a&gt;, GBTI Network Member.&lt;/strong&gt; Originally published on &lt;a href="https://gbti.network/prompts/responsive-design-audit-with-playwright/" rel="noopener noreferrer"&gt;gbti.network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;"This prompt can be converted into a skill"&lt;/p&gt;

&lt;p&gt;Use MCP Playwright to visually inspect the site across desktop browser widths, tablet widths, and real mobile device viewports. Improve the layout so every major section feels polished, intentional, readable, and usable across each context.&lt;/p&gt;

&lt;p&gt;The goal is not to apply one responsive rule to every narrow viewport. Treat desktop browser narrowing and confirmed mobile devices differently.&lt;/p&gt;

&lt;p&gt;Core responsive strategy:&lt;/p&gt;

&lt;p&gt;Desktop browser resizing should preserve the desktop design shape for as long as it remains usable. As desktop viewport width narrows, compress the existing layout first by reducing font sizes, gaps, padding, margins, icon sizes, avatar sizes, card spacing, media sizes, and line heights. Avoid jumping to a mobile layout just because the width is smaller.&lt;/p&gt;

&lt;p&gt;Confirmed mobile device viewports should be treated as mobile experiences. On mobile, solve layout issues through mobile-native restructuring when appropriate: two columns may become one, sidebars may move above or below content, secondary metadata may be hidden or condensed, button groups may stack, dense card grids may simplify, and complex sections may become accordions, carousels, horizontal scroll regions, or reordered content.&lt;/p&gt;

&lt;p&gt;Viewport test matrix:&lt;/p&gt;

&lt;p&gt;Mobile device viewports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;320 x 568, small mobile&lt;/li&gt;
&lt;li&gt;360 x 740, Galaxy S8+&lt;/li&gt;
&lt;li&gt;375 x 667, iPhone SE&lt;/li&gt;
&lt;li&gt;390 x 844, iPhone 12/13/14&lt;/li&gt;
&lt;li&gt;393 x 852, iPhone 14/15 Pro&lt;/li&gt;
&lt;li&gt;412 x 915, Pixel 7&lt;/li&gt;
&lt;li&gt;430 x 932, iPhone 14/15 Pro Max&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tablet viewports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;600 x 960, small tablet portrait&lt;/li&gt;
&lt;li&gt;768 x 1024, iPad Mini portrait&lt;/li&gt;
&lt;li&gt;810 x 1080, iPad portrait&lt;/li&gt;
&lt;li&gt;1024 x 768, tablet landscape&lt;/li&gt;
&lt;li&gt;1024 x 1366, iPad Pro portrait&lt;/li&gt;
&lt;li&gt;1366 x 1024, iPad Pro landscape&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desktop browser widths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;600 x 900, narrow desktop browser&lt;/li&gt;
&lt;li&gt;650 x 900, desktop compression threshold&lt;/li&gt;
&lt;li&gt;768 x 900, narrow desktop/tablet boundary&lt;/li&gt;
&lt;li&gt;1024 x 768, small desktop&lt;/li&gt;
&lt;li&gt;1280 x 720, desktop 720p&lt;/li&gt;
&lt;li&gt;1366 x 768, common laptop&lt;/li&gt;
&lt;li&gt;1440 x 900, laptop/desktop&lt;/li&gt;
&lt;li&gt;1536 x 864, large laptop&lt;/li&gt;
&lt;li&gt;1920 x 1080, desktop 1080p&lt;/li&gt;
&lt;li&gt;2560 x 1440, desktop 1440p&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each viewport:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the page with MCP Playwright.&lt;/li&gt;
&lt;li&gt;Capture a full-page screenshot.&lt;/li&gt;
&lt;li&gt;Inspect each major section individually.&lt;/li&gt;
&lt;li&gt;Compare mobile, tablet, narrow desktop, and full desktop presentation.&lt;/li&gt;
&lt;li&gt;Identify text overflow, cramped spacing, broken grids, awkward wrapping, clipped content, deformed cards, misaligned buttons, uneven card heights, weak hierarchy, poor touch targets, and sections that no longer feel visually balanced.&lt;/li&gt;
&lt;li&gt;Note whether the issue should be solved by compression, restructuring, simplification, or hiding expendable content.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Desktop browser compression rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For desktop browser widths down to approximately 600px, preserve the desktop structure wherever possible.&lt;/li&gt;
&lt;li&gt;Do not automatically stack multi-column rows, sidebar layouts, media/text pairs, pricing cards, feature rows, or inline cards above 600px.&lt;/li&gt;
&lt;li&gt;First shrink competing elements: headings, supporting text, avatar sizes, icons, gaps, card padding, media dimensions, CTA spacing, and metadata.&lt;/li&gt;
&lt;li&gt;Use proportional scaling with &lt;code&gt;clamp()&lt;/code&gt;, &lt;code&gt;min()&lt;/code&gt;, &lt;code&gt;max()&lt;/code&gt;, fluid spacing variables, CSS grid, and flexible sizing.&lt;/li&gt;
&lt;li&gt;A desktop section should feel like the same section at smaller scale, not a different design.&lt;/li&gt;
&lt;li&gt;If a title wraps one word per line, a row overflows, a card becomes crushed, or buttons collide, reduce surrounding pressure before changing structure.&lt;/li&gt;
&lt;li&gt;Only restructure desktop-browser layouts when compression creates unreadable text, unusable controls, or obviously broken visual hierarchy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mobile device adaptation rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Treat confirmed mobile viewports as mobile-native experiences, not miniature desktop layouts.&lt;/li&gt;
&lt;li&gt;Prioritize readability, thumb-friendly interaction, clear hierarchy, and strong vertical rhythm.&lt;/li&gt;
&lt;li&gt;Convert two-column and multi-column layouts to single-column when that produces a better mobile experience.&lt;/li&gt;
&lt;li&gt;Stack CTAs when inline buttons become cramped.&lt;/li&gt;
&lt;li&gt;Move sidebars above or below primary content when needed.&lt;/li&gt;
&lt;li&gt;Hide, shorten, or collapse expendable metadata when it competes with the main content.&lt;/li&gt;
&lt;li&gt;Preserve important content, but remove visual clutter where it harms the mobile experience.&lt;/li&gt;
&lt;li&gt;Consider accordions, compact cards, horizontal scrolling groups, reduced media, simplified grids, reordered content, and mobile-specific section treatments.&lt;/li&gt;
&lt;li&gt;Do not shrink body text below readable mobile sizes.&lt;/li&gt;
&lt;li&gt;Do not preserve desktop shape on mobile when doing so creates awkward wrapping, tiny text, crowded controls, or weak hierarchy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tablet rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Treat tablets as an intermediate design context, not automatically desktop and not automatically mobile.&lt;/li&gt;
&lt;li&gt;Preserve desktop structure on larger tablets when it remains balanced.&lt;/li&gt;
&lt;li&gt;Use hybrid layouts where appropriate: two-column grids, compressed sidebars, reduced card density, smaller media, and tighter spacing.&lt;/li&gt;
&lt;li&gt;On portrait tablets, avoid overly wide single-column sections unless the design benefits from it.&lt;/li&gt;
&lt;li&gt;On landscape tablets, preserve more desktop-like structure where possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implementation expectations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make targeted CSS and layout changes.&lt;/li&gt;
&lt;li&gt;Prefer responsive CSS using &lt;code&gt;clamp()&lt;/code&gt;, &lt;code&gt;min()&lt;/code&gt;, &lt;code&gt;max()&lt;/code&gt;, CSS grid, flexbox, container queries where useful, and breakpoint-specific rules.&lt;/li&gt;
&lt;li&gt;Keep existing design tokens and naming conventions where they exist.&lt;/li&gt;
&lt;li&gt;Avoid broad rewrites unless a section is structurally unsalvageable.&lt;/li&gt;
&lt;li&gt;Use separate logic where needed for viewport width, pointer type, hover capability, and device-like mobile contexts.&lt;/li&gt;
&lt;li&gt;Do not rely only on screen width when deciding mobile behavior.&lt;/li&gt;
&lt;li&gt;Preserve the desktop design language while allowing mobile to have its own practical layout.&lt;/li&gt;
&lt;li&gt;After edits, rerun MCP Playwright screenshots at the same viewport sizes.&lt;/li&gt;
&lt;li&gt;Confirm that each major section looks intentional, balanced, readable, and usable across mobile, tablet, narrow desktop, and full desktop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Decision framework:&lt;/p&gt;

&lt;p&gt;For every responsive issue, decide which fix category applies:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compression fix:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use when the desktop structure still works but needs smaller spacing, typography, icons, cards, or media.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Layout preservation fix:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use when the section should remain in its desktop shape across narrow desktop widths.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mobile restructuring fix:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use when the viewport is a real mobile device and the section would be more usable as a stacked, simplified, reordered, or collapsed layout.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Content priority fix:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use when secondary metadata, decorative elements, repeated labels, dates, avatars, or supporting copy are crowding the core experience.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Structural redesign fix:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use only when CSS scaling and responsive reflow cannot make the section work cleanly.&lt;/p&gt;

&lt;p&gt;Final deliverable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summarize the responsive issues found.&lt;/li&gt;
&lt;li&gt;Group issues by mobile, tablet, narrow desktop, and full desktop.&lt;/li&gt;
&lt;li&gt;List the CSS/layout changes made.&lt;/li&gt;
&lt;li&gt;Explain where compression was used to preserve desktop structure.&lt;/li&gt;
&lt;li&gt;Explain where mobile-specific restructuring was used.&lt;/li&gt;
&lt;li&gt;Note any content that was hidden, shortened, collapsed, or deprioritized.&lt;/li&gt;
&lt;li&gt;Note any sections that still need design input.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Include before/after observations for:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Smallest mobile viewport&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One larger mobile viewport&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One tablet portrait viewport&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One narrow desktop viewport near 600px&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One standard desktop viewport&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm that screenshots were rerun after implementation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The resource shared in this post is a new prompt published by GBTI Network member Hudson Atwell. &lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Are you a writer, musician, or product developer? We would love to support your work on the GBTI Network. For more information about how to join our community visit &lt;a href="https://gbti.network" rel="noopener noreferrer"&gt;https://gbti.network&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To follow Hudson Atwell's work more closely, consider joining our network and subscribing to them directly: &lt;a href="https://gbti.network/members/atwellpub/" rel="noopener noreferrer"&gt;https://gbti.network/members/atwellpub/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>mcp</category>
      <category>playwright</category>
      <category>responsive</category>
      <category>css</category>
    </item>
    <item>
      <title>CI Health Check: a /ci Skill for Claude Code</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Sat, 11 Jul 2026 23:44:04 +0000</pubDate>
      <link>https://dev.to/gbti-network/ci-health-check-a-ci-skill-for-claude-code-2njg</link>
      <guid>https://dev.to/gbti-network/ci-health-check-a-ci-skill-for-claude-code-2njg</guid>
      <description>&lt;p&gt;&lt;strong&gt;By &lt;a href="https://gbti.network/members/atwellpub/" rel="noopener noreferrer"&gt;Hudson Atwell&lt;/a&gt;, GBTI Network Member.&lt;/strong&gt; Originally published on &lt;a href="https://gbti.network/prompts/ci-health-check-skill-for-claude-code/" rel="noopener noreferrer"&gt;gbti.network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Claude Code loads any markdown file at &lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt; as a reusable slash command (a "skill"). This one gives your agent a &lt;code&gt;/ci&lt;/code&gt; command that audits your GitHub Actions: a red/green health board, real failure triage, a post-push watcher, and a living inventory of what every workflow does.&lt;/p&gt;

&lt;p&gt;It exists because agents (and humans) keep re-deriving the same motions every time CI goes red: which runs failed, how to actually get the logs, whether the failure is your commit or something that was already broken. The skill encodes those motions once, including a few non-obvious &lt;code&gt;gh&lt;/code&gt; behaviors that cost me real debugging time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create &lt;code&gt;.claude/skills/ci/&lt;/code&gt; in your repo.&lt;/li&gt;
&lt;li&gt;Save the file below as &lt;code&gt;.claude/skills/ci/SKILL.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If your repo commits build artifacts, fill in the drift action; either way, seed the workflow inventory table.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;/ci&lt;/code&gt; (or &lt;code&gt;/ci health check&lt;/code&gt;) in Claude Code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Requires the &lt;code&gt;gh&lt;/code&gt; CLI authenticated against your repo. The skill runs from the project folder, so the repo is already known: &lt;code&gt;gh&lt;/code&gt; resolves it from the working directory, and the &lt;code&gt;{owner}/{repo}&lt;/code&gt; tokens in API paths are native &lt;code&gt;gh api&lt;/code&gt; placeholders it fills in for you. Nothing to configure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The skill file
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ci&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;"&lt;/span&gt;
  &lt;span class="s"&gt;Inspect and diagnose this repo's GitHub Actions CI. Invoke for "/ci", "/ci health", "/ci health check",&lt;/span&gt;
  &lt;span class="s"&gt;"/ci watch", "/ci schedule", "/ci diagnose &amp;lt;run-id&amp;gt;", "/ci list", or when the user asks whether CI is&lt;/span&gt;
  &lt;span class="s"&gt;green, why a workflow failed, or what a workflow does. Pulls recent runs with gh, downloads failed job&lt;/span&gt;
  &lt;span class="s"&gt;logs the reliable way, and triages failures to their real root cause.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# CI operations&lt;/span&gt;

All commands run from the repo root with the &lt;span class="sb"&gt;`gh`&lt;/span&gt; CLI (it resolves the repo from the working directory;
&lt;span class="sb"&gt;`{owner}/{repo}`&lt;/span&gt; in API paths is a native gh placeholder). Default action when none is named: &lt;span class="sb"&gt;`health`&lt;/span&gt;.

&lt;span class="gu"&gt;## Tooling lore (read first)&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**Fetching logs:**&lt;/span&gt; &lt;span class="sb"&gt;`gh run view &amp;lt;id&amp;gt; --log-failed`&lt;/span&gt; often returns NOTHING. The reliable recipe:
  &lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;bash
&lt;/span&gt;  &lt;span class="nv"&gt;JOB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;gh run view &amp;lt;run-id&amp;gt; &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nb"&gt;jobs&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s1"&gt;'.jobs[0].databaseId'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  gh api repos/&lt;span class="o"&gt;{&lt;/span&gt;owner&lt;span class="o"&gt;}&lt;/span&gt;/&lt;span class="o"&gt;{&lt;/span&gt;repo&lt;span class="o"&gt;}&lt;/span&gt;/actions/jobs/&lt;span class="nv"&gt;$JOB&lt;/span&gt;/logs &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/job.log
  &lt;span class="p"&gt;```&lt;/span&gt;
  Then grep the file; strip the timestamp column with &lt;span class="sb"&gt;`cut -c30-`&lt;/span&gt; when quoting. Multi-job runs: iterate
  &lt;span class="sb"&gt;`.jobs[]`&lt;/span&gt; and pick by &lt;span class="sb"&gt;`.conclusion == "failure"`&lt;/span&gt;. Step-level status without logs:
  &lt;span class="sb"&gt;`gh api repos/{owner}/{repo}/actions/runs/&amp;lt;id&amp;gt;/jobs -q '.jobs[0].steps[] | .name + " " + .conclusion'`&lt;/span&gt;.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Scheduled-failure attribution:**&lt;/span&gt; the failure email for a SCHEDULED workflow cites the LATEST main sha,
  which is often NOT the commit that broke it. Always check
  &lt;span class="sb"&gt;`gh run list --workflow &amp;lt;file&amp;gt; --limit 5 --json conclusion,createdAt,event`&lt;/span&gt; first; if the failures predate
  the cited commit, it is a standing provisioning or external problem, not a regression.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Secrets vs variables:**&lt;/span&gt; repo secrets via &lt;span class="sb"&gt;`gh secret list`&lt;/span&gt;, plain variables via &lt;span class="sb"&gt;`gh variable list`&lt;/span&gt;. A
  workflow reading &lt;span class="sb"&gt;`secrets.X`&lt;/span&gt; where X was never created gets an EMPTY string, not an error, so the symptom
  is a downstream "not set" message, a 401, or an empty env var in the step header.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Setting secrets may be gated:**&lt;/span&gt; an agent session may be blocked from &lt;span class="sb"&gt;`gh secret set`&lt;/span&gt; by permission
  policy. Prepare the value in a local untracked file and hand the human the one command.

&lt;span class="gu"&gt;## Failure triage (a starting taxonomy — extend it to fit the project)&lt;/span&gt;

Classify every red into a named bucket, because the bucket decides the response. These three cover most
repos; add project-specific buckets as you meet them (examples: environment/toolchain drift, a dependency
or upstream API regression, resource exhaustion such as OOM or disk or rate limits, data- or state-dependent
failures, expired credentials). When a failure fits no bucket, name a new one in the report rather than
forcing it into a wrong response.
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Broken by commit:**&lt;/span&gt; the failure starts at a specific sha and the log implicates changed files. Fix the
   root cause (see Fix discipline below); verify with a rerun on the fix commit.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Provisioning gap:**&lt;/span&gt; missing or empty secret, unset variable, an external account not configured. Route
   to the human with the exact command; do not retry.
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Flaky / external:**&lt;/span&gt; network hiccup, provider outage, rate limit; the same job passed before and after
   without a related change. &lt;span class="sb"&gt;`gh run rerun &amp;lt;id&amp;gt; --failed`&lt;/span&gt; once, then re-check.

&lt;span class="gu"&gt;## Fix discipline (failing tests especially)&lt;/span&gt;

When a test fails, evaluate the REAL defect the test is exposing and propose a fix for that root cause.
Never patch the symptom, and never modify a test so it passes while the underlying failure remains — if you
find yourself weakening an assertion, deleting a case, or special-casing the test input, stop and re-derive
what the test was protecting. Changing a test is only correct when the test itself is wrong about the
intended behavior, and the report must say that explicitly and justify it. The same rule generalizes beyond
tests: a fix that makes the red go away without explaining WHY it was red is a symptom patch, not a fix.

&lt;span class="gu"&gt;## Actions&lt;/span&gt;

&lt;span class="gu"&gt;### /ci health [N]   (also: /ci health check; the default)&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="sb"&gt;`gh run list --limit ${N:-30} --json databaseId,workflowName,conclusion,headSha,event,createdAt`&lt;/span&gt; and
   group by workflow. Report a red/green board: latest conclusion per workflow, streak (consecutive fails),
   and the event (push vs schedule).
&lt;span class="p"&gt;2.&lt;/span&gt; For each currently-red workflow: pull its recent history (&lt;span class="sb"&gt;`--workflow &amp;lt;file&amp;gt; --limit 5`&lt;/span&gt;) to date the
   breakage, download the failed job log (recipe above), and triage it (the taxonomy above) with a
   one-line root cause and the proposed fix.
&lt;span class="p"&gt;3.&lt;/span&gt; End with the board, the diagnoses, and what to do next. Offer to make low-risk code-side fixes (root
   cause, per Fix discipline); provisioning gaps go to the human.

&lt;span class="gu"&gt;### /ci watch&lt;/span&gt;

The post-push ritual. Find the runs for the current HEAD and watch until all conclude:
&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;bash
&lt;/span&gt;&lt;span class="nv"&gt;SHA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git rev-parse HEAD&lt;span class="si"&gt;)&lt;/span&gt;
gh run list &lt;span class="nt"&gt;--limit&lt;/span&gt; 15 &lt;span class="nt"&gt;--json&lt;/span&gt; databaseId,workflowName,conclusion,headSha &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;".[] | select(.headSha==&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$SHA&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
gh run watch &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;--exit-status&lt;/span&gt;   &lt;span class="c"&gt;# per unfinished run&lt;/span&gt;
&lt;span class="p"&gt;```&lt;/span&gt;
Report each result; diagnose any red as in health.

&lt;span class="gu"&gt;### /ci drift   (only if your repo commits build artifacts)&lt;/span&gt;

The LOCAL pre-push check that committed artifacts match their source:
&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;bash
&lt;/span&gt;&amp;lt;your full artifact build &lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&amp;gt;&lt;/span&gt;
git diff &lt;span class="nt"&gt;--name-only&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &amp;lt;artifact-dir-1&amp;gt; &amp;lt;artifact-dir-2&amp;gt;
&lt;span class="p"&gt;```&lt;/span&gt;
Empty diff = safe to push. Non-empty = stage those files with the commit that changed the source. Fill in
EVERY build command: partial rebuilds that skip one artifact are the classic way this check reds your main
branch anyway.

&lt;span class="gu"&gt;### /ci schedule&lt;/span&gt;

Staleness audit of the scheduled workflows. For each one (list yours here with cadences): pull the last 5
runs and report the last SUCCESS date. Alarm on any workflow whose last success is older than 2x its
cadence. A scheduled job can be silently red for days; nobody rereads yesterday's failure email. Note which
scheduled jobs are load-bearing (a backup, a data sync something else depends on) so staleness there is
escalated, not just listed.

&lt;span class="gu"&gt;### /ci diagnose &amp;lt;run-id | workflow-name&amp;gt;&lt;/span&gt;

Deep-dive one run (or the latest run of a named workflow): step table, failed job log to disk,
triage bucket, root cause, fix proposal.

&lt;span class="gu"&gt;### /ci rerun &amp;lt;run-id&amp;gt;&lt;/span&gt;

&lt;span class="sb"&gt;`gh run rerun &amp;lt;run-id&amp;gt; --failed`&lt;/span&gt; then watch it. Only for the flaky/external bucket; never rerun a
provisioning gap (it cannot pass) or a broken-by-commit red (fix the root cause first).

&lt;span class="gu"&gt;### /ci list&lt;/span&gt;

Print this workflow inventory (keep it current when workflows are added or changed):

| Workflow (file) | Trigger | What it does | Needs |
|---|---|---|---|
| &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt; (&lt;span class="nt"&gt;&amp;lt;file&amp;gt;&lt;/span&gt;.yml) | push / PR / cron | &lt;span class="nt"&gt;&amp;lt;one&lt;/span&gt; &lt;span class="na"&gt;line&lt;/span&gt; &lt;span class="na"&gt;on&lt;/span&gt; &lt;span class="na"&gt;what&lt;/span&gt; &lt;span class="na"&gt;it&lt;/span&gt; &lt;span class="na"&gt;validates&lt;/span&gt; &lt;span class="na"&gt;or&lt;/span&gt; &lt;span class="na"&gt;does&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; | &lt;span class="nt"&gt;&amp;lt;secrets&lt;/span&gt; &lt;span class="na"&gt;or&lt;/span&gt; &lt;span class="na"&gt;nothing&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; |

To seed it, read every file in &lt;span class="sb"&gt;`.github/workflows/`&lt;/span&gt; and summarize: name, trigger, the job's purpose (the
header comment usually says), and which secrets it reads.

&lt;span class="gu"&gt;## Reporting conventions&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Lead with the board (workflow, latest state, streak), then diagnoses, then actions taken or proposed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Making it yours
&lt;/h2&gt;

&lt;p&gt;There is nothing to configure for the repo itself: &lt;code&gt;gh&lt;/code&gt; infers it from the working directory, so the skill works the moment you drop it in. Only two parts are inherently repo-specific:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The drift action&lt;/strong&gt;: keep it only if your repo commits build artifacts (bundled JS, generated schemas, packaged extensions). List every build command and every artifact directory. If you do not commit artifacts, delete the action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The inventory table&lt;/strong&gt;: have your agent seed it once from &lt;code&gt;.github/workflows/&lt;/code&gt; and then treat it as living documentation. This is the part future sessions (and new contributors) thank you for.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And treat the failure taxonomy as a starting point, not a fixed set: projects fail in project-shaped ways, so add the buckets yours actually produces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the odd details are in there
&lt;/h2&gt;

&lt;p&gt;Each lore item is a real failure mode: &lt;code&gt;--log-failed&lt;/code&gt; silently returning nothing while the jobs API works; a scheduled backup that failed for four days while its failure emails blamed whatever commit happened to be newest on main; a workflow reading a secret nobody ever created and reporting it as a vague downstream error instead of failing fast; a drift check that stayed red because the rebuild command regenerated only one of two committed bundles. The Fix discipline section is there because agents notoriously "fix" a failing test by editing the test — the classification buckets plus that rule keep the agent from the three classic wastes: rerunning a job that can never pass, "fixing" code that was never broken, and silencing a test that was telling the truth.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Are you a writer, musician, or product developer? We would love to support your work on the GBTI Network. For more information about how to join our community visit &lt;a href="https://gbti.network" rel="noopener noreferrer"&gt;https://gbti.network&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To follow Hudson Atwell's work more closely, consider joining our network and subscribing to them directly: &lt;a href="https://gbti.network/members/atwellpub/" rel="noopener noreferrer"&gt;https://gbti.network/members/atwellpub/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>claudecode</category>
      <category>githubactions</category>
      <category>ci</category>
      <category>devopsautomation</category>
    </item>
    <item>
      <title>How to Generate Professional LinkedIn Headshots Using Nano Banana</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Thu, 09 Oct 2025 20:13:08 +0000</pubDate>
      <link>https://dev.to/gbti-network/how-to-generate-professional-linkedin-headshots-using-nano-banana-16n4</link>
      <guid>https://dev.to/gbti-network/how-to-generate-professional-linkedin-headshots-using-nano-banana-16n4</guid>
      <description>&lt;p&gt;&lt;strong&gt;By &lt;a href="https://gbti.network/author/nareshdevineni/" rel="noopener noreferrer"&gt;Naresh Devineni&lt;/a&gt;, GBTI Network Member&lt;/strong&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%2Ftb3vs14xam3pi4zqd4pz.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.amazonaws.com%2Fuploads%2Farticles%2Ftb3vs14xam3pi4zqd4pz.jpg" alt=" " width="645" height="806"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Creating a professional LinkedIn headshot doesn’t need to be difficult or expensive.&lt;/p&gt;

&lt;p&gt;In this guide, I will share a simple method for producing AI-generated headshots that look authentic, clean, and career-ready using &lt;strong&gt;Nano Banana&lt;/strong&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%2Flsbc12bc1wxxc8k8koqw.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%2Flsbc12bc1wxxc8k8koqw.png" alt=" " width="645" height="806"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Find Your Reference Image
&lt;/h2&gt;

&lt;p&gt;Look for a professional headshot you like (make sure you’re using it ethically and legally).&lt;/p&gt;

&lt;p&gt;This image will serve as your &lt;strong&gt;style reference&lt;/strong&gt; — the goal is to recreate its lighting, framing, and background style with your own photo later.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Let AI Describe It
&lt;/h2&gt;

&lt;p&gt;Upload your chosen reference image to an AI chatbot (like ChatGPT, Gemini, or Claude) and ask it to describe the photo.&lt;br&gt;
This helps generate a consistent, professional &lt;strong&gt;image prompt&lt;/strong&gt; that Nano Banana can follow.&lt;/p&gt;

&lt;p&gt;Here is an example prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For the uploaded reference image:

### ✅ Be Minimal

Only describe what is clearly visible.

### Never Include

* Racial, ethnic, or skin tone descriptors
* Facial features, hair details, body type
* Accessories, age, or gender indicators

### Only Include What’s Visible

**Expression:** Simple description only (e.g., “warm smile” or “neutral expression”)
**Clothing:** Describe exactly what’s worn – color, garment type, style
**Clothing shadows:** Note visible shadows under lapels, collars, or folds
**Lighting:** Direction and quality (e.g., “soft frontal lighting” or “three-point lighting”)
**Facial shadows:** Shadows under chin, on neck, or one side of face — or state “evenly lit”
**Background:** Exact color, brightness level, and subtlety of gradient (if any)
**Background shadows:** Only if visible — otherwise, state “no background shadow”
**Framing:** What’s visible (e.g., “head and shoulders” or “upper chest to top of head”)
**Position:** Head/body angle relative to camera

### Rules

1. Describe only what you actually see — don’t infer or imagine details
2. Keep descriptions factual and minimal
3. Any gradients should be described as **VERY SUBTLE** with minimal tonal variation

### Critical Restrictions

CRITICAL RESTRICTIONS:
1. NO multiple backgrounds or layered backgrounds
2. NO rounded corners or circular crops
3. NO additional background colors or borders
4. NO dramatic background gradients – background should be evenly lit or have only minimal, natural variation
5. Standard rectangular crop only
6. DO NOT add shadows if none exist in the reference image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3: Generate Your Headshot
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Upload &lt;strong&gt;your own photo&lt;/strong&gt; to Nano Banana.&lt;/li&gt;
&lt;li&gt;Paste the &lt;strong&gt;AI-generated description&lt;/strong&gt; as your image prompt.&lt;/li&gt;
&lt;li&gt;Generate your professional headshot.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nano Banana will produce an image that matches the &lt;strong&gt;lighting, framing, and background style&lt;/strong&gt; of your reference photo — but featuring &lt;strong&gt;your own face&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is an example headshot and prompt:&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%2Fewlz2r9xzaqtnan31ddw.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.amazonaws.com%2Fuploads%2Farticles%2Fewlz2r9xzaqtnan31ddw.jpg" alt=" " width="645" height="806"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For the uploaded picture, generate an image of:

Expression: Warm, genuine smile

Clothing: Dark gray textured suit with light blue dress shirt and navy blue tie with small dot pattern

Clothing shadows: Visible shadows under suit lapels, along tie, and in jacket fabric folds

Lighting: Soft, natural outdoor lighting from front

Facial shadows: Face evenly lit with minimal shadows

Background: Blurred outdoor corporate/office building environment (bokeh effect) with modern glass windows and architectural elements visible, blue-gray and white tones

Background shadows: Background is out of focus, no distinct shadows visible

Framing: Head and upper torso to mid-chest level

Position: Body angled slightly to left, face turned toward camera at slight angle

CRITICAL RESTRICTIONS:

NO multiple backgrounds or layered backgrounds
NO rounded corners or circular crops
NO additional background colors or borders
NO dramatic background gradients – background should be evenly lit or have only minimal, natural lighting variation
Standard rectangular crop only
DO NOT add shadows if none exist in the reference image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;You’ll get a &lt;strong&gt;professional, consistent, and natural-looking headshot&lt;/strong&gt; that reflects your desired style, without the guesswork or endless prompt tweaking.&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%2Fi55objpyvo67b7pxjdva.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.amazonaws.com%2Fuploads%2Farticles%2Fi55objpyvo67b7pxjdva.jpg" alt=" " width="645" height="806"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Sounds easy?&lt;/strong&gt;&lt;br&gt;
It is! &lt;/p&gt;

&lt;p&gt;Thanks for reading this article. &lt;/p&gt;

&lt;p&gt;Visit my article &lt;a href="https://gbti.network/ai/15-nano-banana-prompts-for-generating-linkedin-headshots/" rel="noopener noreferrer"&gt;"15 Ready-to-Use Nano Banana Prompts for Realistic LinkedIn Headshots"&lt;/a&gt; to see how I put this method to use! &lt;/p&gt;

&lt;p&gt;Also consider joining me on the &lt;a href="https://gbti.network" rel="noopener noreferrer"&gt;GBTI Network&lt;/a&gt; where we share tips like this regularly inside our own private discord network. &lt;/p&gt;

</description>
      <category>promptengineering</category>
      <category>nanobanana</category>
      <category>ai</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>15 Free React Landing Page Templates to help Launch your SaaS</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Mon, 18 Aug 2025 13:42:28 +0000</pubDate>
      <link>https://dev.to/gbti-network/15-free-react-landing-page-templates-to-help-launch-your-saas-22o8</link>
      <guid>https://dev.to/gbti-network/15-free-react-landing-page-templates-to-help-launch-your-saas-22o8</guid>
      <description>&lt;p&gt;This past month we worked hard to make the Fall Y-Combinator 2025 submission window with one of our projects, and to do this we wanted to have a very basic landing page ready for our product demo site. &lt;/p&gt;

&lt;p&gt;This sprint lead us to investigate the best free React + Tailwind CSS templates we could find. We performed our search using tools like ChatGPT, Google, Dev.to, Daily.dev, and Github to find the highest quality free templates available. &lt;/p&gt;

&lt;p&gt;Through our research, we compiled the best 15 completely free React landing page templates we were able to find and have showcased them in our lasted article:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gbti.network/devops/frameworks/react/15-free-react-landing-page-templates-to-launch-your-saas/" rel="noopener noreferrer"&gt;"15+ Free REACT Landing Page Templates to Launch your SaaS"&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We hope you enjoy our efforts and if you are working on a free React landing page template and would like us to add it to our list above, leave a comment below and we'll consider adding it! &lt;/p&gt;

&lt;p&gt;Thanks for paying attention!&lt;/p&gt;

</description>
      <category>react</category>
      <category>tailwindcss</category>
      <category>node</category>
      <category>design</category>
    </item>
    <item>
      <title>Using Hue to create colorful animations 🌈</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Sun, 27 Jul 2025 21:41:08 +0000</pubDate>
      <link>https://dev.to/gbti-network/now-make-it-psychedelic-using-hue-to-create-colorful-animations-4d60</link>
      <guid>https://dev.to/gbti-network/now-make-it-psychedelic-using-hue-to-create-colorful-animations-4d60</guid>
      <description>&lt;p&gt;Hi fellow devs! 👋&lt;/p&gt;

&lt;p&gt;We're excited to share our latest coding experiment and what turned out to be a surprisingly fun tool: a browser-based hue animation generator.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gbti.network/products/js-animate-hue/" rel="noopener noreferrer"&gt;https://gbti.network/products/js-animate-hue/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You know that moment when you're adjusting the hue slider in your favorite image editor and watching your image cycle through the entire color spectrum - from electric blues, vibrant magentas, and sunset oranges? Haven't you thought at some point, "This transition would make an incredible animation"? &lt;/p&gt;

&lt;p&gt;We decided to scratch that itch and build exactly that: a JavaScript tool that transforms any image into a mesmerizing color-shifting animation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;The tool takes any image you upload and creates smooth animations by cycling through hue transformations. But it goes beyond just basic hue shifts - you can also animate brightness and contrast changes to create some truly psychedelic effects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Controls:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive SVG color wheel&lt;/strong&gt; - Drag handles on a half-circle hue selector to define exactly which colors your animation cycles through (-180° to +180°)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brightness animation&lt;/strong&gt; - Ranges from -100 (completely dark) to +100 (super bright) with presets like "Sunrise Effect" and "Fade to Black"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contrast animation&lt;/strong&gt; - Adjust from -100 (flat/washed out) to +100 (ultra-sharp) with options like "Dramatic Reveal" and "Vintage Film"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animation timing&lt;/strong&gt; - Control frame count (1-360 frames), speed (1-60 FPS), and seamless looping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolution scaling&lt;/strong&gt; - Output from 50% to 150% of original size for file size optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Smart Presets:
&lt;/h3&gt;

&lt;p&gt;The tool includes thoughtfully designed presets for each effect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hue&lt;/strong&gt;: Full spectrum rainbow, warm sunset tones, cool ocean shifts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brightness&lt;/strong&gt;: Sunrise/Dawn Effect, Fade to Black, Flash/Glow, Breathing Light, Reveal Effect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contrast&lt;/strong&gt;: Dramatic Reveal, Dreamy to Vivid, Pop Effect, Sharp to Soft, Vintage Film&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The technical bits &amp;amp; export formats
&lt;/h2&gt;

&lt;p&gt;What started as a simple hue-shifting experiment evolved into a pretty robust image processing tool. Under the hood, it uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API" rel="noopener noreferrer"&gt;Canvas API&lt;/a&gt;&lt;/strong&gt; for real-time image manipulation and frame generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Workers&lt;/strong&gt; with &lt;a href="https://github.com/jnordberg/gif.js" rel="noopener noreferrer"&gt;gif.js&lt;/a&gt; and &lt;a href="https://github.com/skyra-project/gifenc" rel="noopener noreferrer"&gt;gifenc&lt;/a&gt; libraries for smooth GIF encoding without freezing the browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder" rel="noopener noreferrer"&gt;MediaRecorder API&lt;/a&gt;&lt;/strong&gt; for high-quality WebM and MP4 video output with configurable bitrates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SVG-based controls&lt;/strong&gt; for that smooth, interactive color wheel&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Export Options:
&lt;/h3&gt;

&lt;p&gt;The tool supports three major formats, each optimized for different use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GIF Animation&lt;/strong&gt; - Universal compatibility, perfect for web embedding and social sharing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebM Video&lt;/strong&gt; - Modern codec with excellent compression, ideal for web platforms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MP4 Video (H.264)&lt;/strong&gt; - Industry standard with multiple quality settings:

&lt;ul&gt;
&lt;li&gt;Low (5 Mbps) - Smaller files for quick sharing&lt;/li&gt;
&lt;li&gt;Medium (10 Mbps) - Balanced quality and size&lt;/li&gt;
&lt;li&gt;High (20 Mbps) - Professional quality&lt;/li&gt;
&lt;li&gt;Lossless (50+ Mbps) - Maximum quality for final output&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Social Media Ready:
&lt;/h3&gt;

&lt;p&gt;The output formats work perfectly across all major platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;X (Twitter)&lt;/strong&gt; - MP4 with H.264 codec (up to 512MB, 140 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn&lt;/strong&gt; - MP4 with H.264 and AAC audio (up to 5GB, 10 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instagram&lt;/strong&gt; - MP4 with H.264 for Feed, Reels, and Stories (up to 4GB)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The codec implementations include built-in brightness and contrast adjustments that work at the pixel level, giving you smooth transitions that would be difficult to achieve in traditional video editing software.&lt;/p&gt;

&lt;p&gt;The whole thing runs entirely in your browser - no servers, no uploads, no tracking. Your images never leave your device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;Check out the project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gbti.network/products/js-animate-hue/" rel="noopener noreferrer"&gt;Access the Generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gbti.network/devops/frameworks/javascript/now-make-it-psychedelic-using-hue-to-create-colorful-animations/" rel="noopener noreferrer"&gt;View our Blog Post with Examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Give it a try and let us know what you create! We'd love to see what kind of psychedelic masterpieces people come up with. &lt;a href="http://giphy.com/upload/" rel="noopener noreferrer"&gt;Upload your creations to giphy&lt;/a&gt; and share them in the comments or tag us on social media &lt;a href="https://x.com/gbti_network" rel="noopener noreferrer"&gt;@gbti_network&lt;/a&gt;! &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>design</category>
      <category>novelty</category>
    </item>
    <item>
      <title>Introducing Perplexity AI Lookups for WordPress</title>
      <dc:creator>GBTI Network</dc:creator>
      <pubDate>Mon, 30 Jun 2025 13:59:44 +0000</pubDate>
      <link>https://dev.to/gbti-network/introducing-perplexity-ai-lookups-for-wordpress-3g7d</link>
      <guid>https://dev.to/gbti-network/introducing-perplexity-ai-lookups-for-wordpress-3g7d</guid>
      <description>&lt;p&gt;At the &lt;a href="https://gbti.network" rel="noopener noreferrer"&gt;GBTI Network&lt;/a&gt;, we’re committed to developing novel tools that empower publishers and readers alike. Today, we’re announcing the release of our &lt;strong&gt;WordPress Perplexity AI Plugin&lt;/strong&gt;, which enables AI-powered lookups on highlighted text within your WordPress content.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does this plugin do?
&lt;/h2&gt;

&lt;p&gt;This plugin allows site visitors to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Highlight any text&lt;/strong&gt; on a post or page.&lt;/li&gt;
&lt;li&gt;Optionally click a Perplexity icon to open a Perplexity instance with the selected query attached. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a novel way for readers to engage with your content without interrupting their reading flow and &lt;strong&gt;Receive AI-generated lookups&lt;/strong&gt; instantly, offering definitions, explanations, or contextual expansions for the highlighted text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why did we build it?
&lt;/h2&gt;

&lt;p&gt;Writers often struggle to balance brevity with sufficient explanation. Excessive footnotes, hyperlinks, or side notes can disrupt readability and clutter pages. This simple implementation assists these challenges by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Providing readers with on-demand context and deeper understanding.&lt;/li&gt;
&lt;li&gt;Allowing writers to maintain concise content without sacrificing detail.&lt;/li&gt;
&lt;li&gt;Enhancing engagement and time on page by encouraging interactive exploration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a very simple and effective implementation!&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Educational sites:&lt;/strong&gt; Students can quickly look up terms and definitions while reading course material.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blogs:&lt;/strong&gt; Readers can gain clarity on concepts without breaking their reading rhythm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical documentation:&lt;/strong&gt; Developers and technical readers can explore deeper context for terms and functions on-demand.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;To install the plugin please visit our full release announcement for download and setup instructions:&lt;br&gt;
   &lt;a href="https://gbti.network/ai/introducing-our-new-wordpress-perplexity-ai-plugin/" rel="noopener noreferrer"&gt;Introducing Our New WordPress Perplexity AI Plugin&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Future plans
&lt;/h2&gt;

&lt;p&gt;We are exploring additional features, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom prompt templates for specialized sites and terminology.&lt;/li&gt;
&lt;li&gt;Admin-side analytics for usage tracking and content strategy insights.&lt;/li&gt;
&lt;li&gt;Expanded AI provider support for diversified lookup outputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;We welcome community contributions to extend and refine this plugin. If you’re interested, please visit our &lt;a href="https://github.com/gbti-network" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; for issue tracking and PR guidelines.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Final thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI-enhanced reading experiences are becoming increasingly common. Our Perplexity AI Plugin is a small step towards creating more interactive and intelligent web content in novel ways.&lt;/p&gt;

&lt;p&gt;We look forward to your feedback and suggestions as we continue improving this tool for the WordPress community.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>perplexity</category>
      <category>writing</category>
    </item>
  </channel>
</rss>
