<?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: Suraj lama</title>
    <description>The latest articles on DEV Community by Suraj lama (@suraj16thjan).</description>
    <link>https://dev.to/suraj16thjan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4102311%2Fc67f0e45-aa89-4dec-b1ef-4a22bc048a78.jpg</url>
      <title>DEV Community: Suraj lama</title>
      <link>https://dev.to/suraj16thjan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suraj16thjan"/>
    <language>en</language>
    <item>
      <title>DevDocs Navigator: An AI Agent That Traces API Breaking Change Dependencies</title>
      <dc:creator>Suraj lama</dc:creator>
      <pubDate>Tue, 29 Sep 2026 17:19:02 +0000</pubDate>
      <link>https://dev.to/suraj16thjan/devdocs-navigator-an-ai-agent-that-traces-api-breaking-change-dependencies-2chj</link>
      <guid>https://dev.to/suraj16thjan/devdocs-navigator-an-ai-agent-that-traces-api-breaking-change-dependencies-2chj</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DevDocs Navigator&lt;/strong&gt; is a CLI agent that helps developers navigate multi-version API documentation. It connects to a Sanity Context MCP knowledge base of structured API docs and answers questions that keyword search simply can't — like generating ordered migration plans that respect breaking change dependencies, or explaining why a 409 error in v2 becomes a 422 in v3.&lt;/p&gt;

&lt;p&gt;The agent is built with the Claude SDK (TypeScript) and connects to Sanity Context via MCP. It queries a knowledge base of structured PayFlow API documentation spanning 3 major versions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/suraj16thjan/devdocs-navigator" rel="noopener noreferrer"&gt;github.com/suraj16thjan/devdocs-navigator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity Project ID:&lt;/strong&gt; &lt;code&gt;oqa25u7d&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Structure Matters Here
&lt;/h2&gt;

&lt;p&gt;Developer documentation is one of the best examples of content where &lt;strong&gt;structure is the entire point&lt;/strong&gt;. Consider this question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'm on PayFlow API v1 and need to get to v3. What do I do?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A keyword search finds pages mentioning "v1", "v3", and "migration" — maybe even the right pages. But it can't tell you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;JWT auth must be implemented first&lt;/strong&gt; — every v3 endpoint requires it, so nothing else works until this is done&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-currency amounts depend on JWT auth&lt;/strong&gt; — you can't test the new amount format without v3 access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook signature changes depend on JWT auth too&lt;/strong&gt; — re-registering webhooks requires v3 API calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscription event renames depend on the webhook signature change&lt;/strong&gt; — the new event names only fire on v3 webhook registrations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The webhook envelope format change (from v1→v2) must happen AFTER renaming charges to payments&lt;/strong&gt; — the new event types reference "payment" objects&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That ordering isn't in any single document. It emerges from the &lt;strong&gt;relationships between documents&lt;/strong&gt;: breaking changes reference which other breaking changes they depend on, migration paths link to the breaking changes they address in a specific order, and endpoints track which version introduced and deprecated them.&lt;/p&gt;

&lt;p&gt;This is exactly what Sanity Context enables — structured content where the relationships are first-class data, not implicit context a reader has to reconstruct.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Content Model
&lt;/h2&gt;

&lt;p&gt;The knowledge base contains &lt;strong&gt;32 structured documents&lt;/strong&gt; across 5 schema types:&lt;/p&gt;

&lt;h3&gt;
  
  
  API Versions (3 documents)
&lt;/h3&gt;

&lt;p&gt;Each version tracks its status (stable/deprecated/sunset), release date, sunset date, and key highlights.&lt;/p&gt;

&lt;h3&gt;
  
  
  Endpoints (12 documents)
&lt;/h3&gt;

&lt;p&gt;Each endpoint records its HTTP method, path, which version introduced it, which version deprecated it, what replaced it (a reference to another endpoint document), auth requirements, rate limits, parameters (with version-specific additions/removals), and version-specific behavior notes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Breaking Changes (9 documents)
&lt;/h3&gt;

&lt;p&gt;This is where the structure shines. Each breaking change records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Severity&lt;/strong&gt; (critical/major/minor)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Affected endpoints&lt;/strong&gt; (references to endpoint documents)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Affected categories&lt;/strong&gt; (payments, webhooks, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration steps&lt;/strong&gt; (ordered)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt; — references to other breaking changes that must be applied first&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Before/after code examples&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dependency chain between breaking changes is what makes the agent's migration plans correct and ordered. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bc-v3-jwt-auth (no dependencies)
  ↳ bc-v3-multi-currency (depends on JWT auth)
  ↳ bc-v3-webhook-signatures (depends on JWT auth)
    ↳ bc-v3-subscription-events (depends on webhook signatures)
  ↳ bc-v3-idempotency-uuid (depends on JWT auth)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Migration Paths (3 documents)
&lt;/h3&gt;

&lt;p&gt;Pre-computed migration guides (v1→v2, v2→v3, v1→v3) with ordered steps, each referencing the relevant breaking change. The v1→v3 path is particularly interesting — it combines and reorders steps from both incremental paths, noting where changes can be collapsed (e.g., skip the v2 amount format and go straight to multi-currency).&lt;/p&gt;

&lt;h3&gt;
  
  
  Error Codes (5 documents)
&lt;/h3&gt;

&lt;p&gt;Each error code has &lt;strong&gt;version-specific behavior&lt;/strong&gt; — the same error code can return different HTTP status codes, different response body structures, and have different root causes depending on the API version. For example:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;v1&lt;/th&gt;
&lt;th&gt;v2&lt;/th&gt;
&lt;th&gt;v3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;IDEMPOTENCY_CONFLICT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;HTTP 409, any string key&lt;/td&gt;
&lt;td&gt;HTTP &lt;strong&gt;422&lt;/strong&gt; (changed!), UUID v4 required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AUTH_INVALID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API key only&lt;/td&gt;
&lt;td&gt;API key or OAuth, detailed error&lt;/td&gt;
&lt;td&gt;JWT only, specific sub-codes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CURRENCY_MISMATCH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Doesn't exist&lt;/td&gt;
&lt;td&gt;Doesn't exist&lt;/td&gt;
&lt;td&gt;HTTP 422, shows expected vs received&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How the Agent Works
&lt;/h2&gt;

&lt;p&gt;The agent uses a standard MCP client-server architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Question
     ↓
Claude (with MCP tools)
     ↓
Sanity Context MCP Server
     ↓
Knowledge Base (structured PayFlow docs)
     ↓
Grounded Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;On startup, the agent connects to the Sanity Context MCP endpoint and discovers available tools&lt;/li&gt;
&lt;li&gt;User asks a question&lt;/li&gt;
&lt;li&gt;Claude receives the question along with the MCP tools from the knowledge base&lt;/li&gt;
&lt;li&gt;Claude calls the appropriate tools to query the structured content&lt;/li&gt;
&lt;li&gt;Tool results come back with the structured data — including references, dependencies, and version-specific fields&lt;/li&gt;
&lt;li&gt;Claude synthesizes the answer, respecting the structure (dependency ordering, version applicability, etc.)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example Interactions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"What changed between v2 and v3?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent queries breaking changes introduced in v3, finds 5 of them, and presents them in dependency order — not alphabetical, not by severity, but by the order you'd need to apply them. It notes that JWT auth is the critical first step since everything else depends on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I'm getting a 429 after upgrading to v2, what's different?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent queries the &lt;code&gt;RATE_LIMIT_EXCEEDED&lt;/code&gt; error code and surfaces the version-specific behavior: v1 had a hard cap at 100/min with &lt;code&gt;X-RateLimit-*&lt;/code&gt; headers, while v2 uses 60/min sustained with burst to 120 and IETF &lt;code&gt;RateLimit-*&lt;/code&gt; headers. It also notes the &lt;code&gt;Retry-After&lt;/code&gt; header is now available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"How do I migrate webhooks from v1 to v3?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where dependency chains matter. The agent traces:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First apply &lt;code&gt;bc-v2-charges-renamed&lt;/code&gt; (charges → payments)&lt;/li&gt;
&lt;li&gt;Then &lt;code&gt;bc-v2-webhook-format&lt;/code&gt; (flat → envelope, depends on step 1)&lt;/li&gt;
&lt;li&gt;Then &lt;code&gt;bc-v3-jwt-auth&lt;/code&gt; (needed for v3 webhook registration)&lt;/li&gt;
&lt;li&gt;Then &lt;code&gt;bc-v3-webhook-signatures&lt;/code&gt; (SHA-1 → SHA-256, depends on step 3)&lt;/li&gt;
&lt;li&gt;Then &lt;code&gt;bc-v3-subscription-events&lt;/code&gt; (event renames, depends on step 4)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No keyword search could produce this ordered sequence. It requires traversing the dependency graph in the structured content.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Content:&lt;/strong&gt; Sanity Studio v3 with TypeScript schemas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Base:&lt;/strong&gt; Sanity Context with GROQ dataset binding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent:&lt;/strong&gt; Node.js + Claude SDK (&lt;code&gt;@anthropic-ai/sdk&lt;/code&gt;) + MCP SDK (&lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport:&lt;/strong&gt; Streamable HTTP / SSE to Sanity Context MCP endpoint&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;If I had more time, I'd:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a web UI with interactive migration checklists&lt;/li&gt;
&lt;li&gt;Support real API documentation (Stripe, Twilio) instead of a fictional API&lt;/li&gt;
&lt;li&gt;Add a "diff my code" feature where you paste your integration code and the agent identifies which breaking changes affect it&lt;/li&gt;
&lt;li&gt;Enable auto-refresh so the knowledge base stays in sync as docs change&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Structured Content Advantage
&lt;/h2&gt;

&lt;p&gt;The core insight: &lt;strong&gt;developer documentation is inherently relational&lt;/strong&gt;. An endpoint exists in some versions but not others. A breaking change affects specific endpoints and depends on other breaking changes being applied first. An error code behaves differently across versions. Migration is an ordered graph traversal, not a text search.&lt;/p&gt;

&lt;p&gt;Sanity Context makes these relationships queryable through MCP, which means an AI agent can reason about them — generating correct migration plans, version-aware error explanations, and dependency-ordered change lists that no amount of keyword searching could produce.&lt;/p&gt;

</description>
      <category>sanitychallenge</category>
      <category>ai</category>
      <category>mcp</category>
      <category>typescript</category>
    </item>
    <item>
      <title>gitsmith: A Terminal UI for Both GitLab and GitHub</title>
      <dc:creator>Suraj lama</dc:creator>
      <pubDate>Mon, 31 Aug 2026 08:30:48 +0000</pubDate>
      <link>https://dev.to/suraj16thjan/gitsmith-a-terminal-ui-for-both-gitlab-and-github-3c4h</link>
      <guid>https://dev.to/suraj16thjan/gitsmith-a-terminal-ui-for-both-gitlab-and-github-3c4h</guid>
      <description>&lt;p&gt;I keep one foot in GitLab and the other in GitHub. Both have solid CLIs — &lt;strong&gt;glab&lt;/strong&gt; and &lt;strong&gt;gh&lt;/strong&gt; — but when I need to scan a list of merge requests, check a failing pipeline, read a diff, and approve something, that's four commands, four walls of JSON, four context switches. The web UI works, but it's slow, and I lose my terminal flow every time I reach for it.&lt;/p&gt;

&lt;p&gt;I wanted one screen where I could do all of it with a keyboard. So I built &lt;strong&gt;gitsmith&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;gitsmith is a terminal UI that wraps &lt;code&gt;glab&lt;/code&gt; and &lt;code&gt;gh&lt;/code&gt;. Run it inside any git repo and it auto-detects the host from your remote. Run it outside a repo and it asks which forge to use, lists your projects, and drops you in.&lt;/p&gt;

&lt;p&gt;There are &lt;strong&gt;11 tabs&lt;/strong&gt; — Issues, MRs/PRs, Pipelines, Runners, Releases, Tags, Branches, Commits, Todos, Milestones, Members — and every state is listed. Closed issues show up below open ones, so you can reopen something without opening a browser. Protected branches sit above the rest. The tab bar is reorderable, and you can hide tabs you don't use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side diffs
&lt;/h2&gt;

&lt;p&gt;This is where I spent the most time. gitsmith renders syntax-highlighted side-by-side diffs using &lt;a href="https://github.com/trishume/syntect" rel="noopener noreferrer"&gt;syntect&lt;/a&gt;, with line numbers, a sticky file header, and a file list that follows your scroll. Press &lt;code&gt;v&lt;/code&gt; on any MR or &lt;code&gt;Enter&lt;/code&gt; on a commit.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[&lt;/code&gt; and &lt;code&gt;]&lt;/code&gt; jump between files. The whole thing runs in the terminal — no browser, no latency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pipeline drill-down
&lt;/h2&gt;

&lt;p&gt;Enter a pipeline to see its jobs. Enter a job to get its &lt;strong&gt;live-tailing ANSI log&lt;/strong&gt; with severity coloring — ERROR lines in red, WARN in yellow, timestamps dimmed, and the CI's own ANSI colors passed through untouched. It follows the latest output like GitLab's trace view.&lt;/p&gt;

&lt;p&gt;Bridge jobs drill into downstream pipelines automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Actions, not just views
&lt;/h2&gt;

&lt;p&gt;gitsmith isn't read-only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Approve, merge, and close&lt;/strong&gt; MRs/PRs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Close, reopen, and comment&lt;/strong&gt; on issues (opens &lt;code&gt;$EDITOR&lt;/code&gt; for the comment body)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry or cancel&lt;/strong&gt; pipelines and individual jobs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create&lt;/strong&gt; new MRs/PRs, issues, pipelines, and tags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add members&lt;/strong&gt; with a role picker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All destructive actions are behind a &lt;code&gt;[y/n]&lt;/code&gt; confirm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zero auth setup
&lt;/h2&gt;

&lt;p&gt;gitsmith shells out to &lt;code&gt;glab&lt;/code&gt; and &lt;code&gt;gh&lt;/code&gt;, so it uses your existing authentication. No tokens to configure, no OAuth flows. If you've already run &lt;code&gt;glab auth login&lt;/code&gt; or &lt;code&gt;gh auth login&lt;/code&gt;, you're set.&lt;/p&gt;

&lt;p&gt;It reads the config files of both CLIs directly — &lt;code&gt;glab&lt;/code&gt;'s &lt;code&gt;config.yml&lt;/code&gt; and &lt;code&gt;gh&lt;/code&gt;'s &lt;code&gt;hosts.yml&lt;/code&gt; — checking &lt;code&gt;$GLAB_CONFIG_DIR&lt;/code&gt;, &lt;code&gt;$XDG_CONFIG_HOME&lt;/code&gt;, &lt;code&gt;~/.config&lt;/code&gt;, and platform-specific paths. Only host names are read; tokens in those files are never touched.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-host, multi-instance
&lt;/h2&gt;

&lt;p&gt;Press &lt;code&gt;S&lt;/code&gt; to switch between GitLab and GitHub (or between self-hosted instances) without restarting. Press &lt;code&gt;P&lt;/code&gt; to fuzzy-search your repos on the current host.&lt;/p&gt;

&lt;p&gt;Every configured instance from both CLIs is offered instantly.&lt;/p&gt;

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

&lt;p&gt;gitsmith is written in &lt;strong&gt;Rust&lt;/strong&gt;, about 10,500 lines across a handful of focused modules. The UI is built with &lt;a href="https://github.com/ratatui/ratatui" rel="noopener noreferrer"&gt;ratatui&lt;/a&gt;, and syntax highlighting uses &lt;a href="https://github.com/trishume/syntect" rel="noopener noreferrer"&gt;syntect&lt;/a&gt; with the pure-Rust regex backend so &lt;code&gt;cargo install&lt;/code&gt; needs no C toolchain.&lt;/p&gt;

&lt;p&gt;Lists pull 100 rows per page and keep fetching in the background (up to 500) while you read, so you don't hit the API's default 20-30 row ceiling.&lt;/p&gt;

&lt;p&gt;Nine built-in themes — Neon, Tokyo Night, Gruvbox, Rose Pine, Catppuccin, Nord, Dracula, Solarized, Everforest — press &lt;code&gt;t&lt;/code&gt; to pick one with a live preview.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;Quick install on macOS or Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/suraj16thjan/gitsmith/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or via Cargo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;gitsmith &lt;span class="nt"&gt;--locked&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Requirements: &lt;a href="https://gitlab.com/gitlab-org/cli" rel="noopener noreferrer"&gt;glab&lt;/a&gt; authenticated for GitLab repos, and/or &lt;a href="https://cli.github.com" rel="noopener noreferrer"&gt;gh&lt;/a&gt; authenticated for GitHub repos.&lt;/p&gt;



&lt;p&gt;gitsmith is MIT-licensed and open source. Contributions, bug reports, and feature ideas are welcome.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/suraj16thjan" rel="noopener noreferrer"&gt;
        suraj16thjan
      &lt;/a&gt; / &lt;a href="https://github.com/suraj16thjan/gitsmith" rel="noopener noreferrer"&gt;
        gitsmith
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Terminal UI for GitLab &amp;amp; GitHub: issues, MRs/PRs, pipelines, live job logs, diffs, and a fuzzy repo switcher — one keyboard-driven interface over glab &amp;amp; gh.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;gitsmith&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/suraj16thjan/gitsmith/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://www.rust-lang.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f249a7ed4b2db85ac94434de350ef411484db62e08204ac748f5665e08f72332/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d616465253230776974682d527573742d6f72616e67652e737667" alt="Made with Rust"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A fast terminal UI for &lt;strong&gt;GitLab and GitHub&lt;/strong&gt;, built with &lt;a href="https://github.com/ratatui/ratatui" rel="noopener noreferrer"&gt;&lt;code&gt;ratatui&lt;/code&gt;&lt;/a&gt;. &lt;code&gt;gitsmith&lt;/code&gt; wraps the official &lt;code&gt;glab&lt;/code&gt; and &lt;code&gt;gh&lt;/code&gt; CLIs and auto-detects which one to use from your git remote — one keyboard-driven interface for issues, merge/pull requests, pipelines, jobs, logs, diffs, and more.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Quick install (macOS / Linux)&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;curl -fsSL https://raw.githubusercontent.com/suraj16thjan/gitsmith/main/install.sh &lt;span class="pl-k"&gt;|&lt;/span&gt; bash&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Downloads the prebuilt binary for your platform from the latest GitHub release
and installs it to &lt;code&gt;~/.local/bin&lt;/code&gt; (or &lt;code&gt;/usr/local/bin&lt;/code&gt; when writable). Pin a
version with &lt;code&gt;GITSMITH_VERSION=v0.2.2&lt;/code&gt; or change the target with
&lt;code&gt;GITSMITH_BIN_DIR=~/bin&lt;/code&gt;. No Rust toolchain required.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;From crates.io&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;cargo install gitsmith --locked&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;From source&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/suraj16thjan/gitsmith
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; gitsmith
cargo install --path &lt;span class="pl-c1"&gt;.&lt;/span&gt; --locked   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; installs the `gitsmith` binary to ~/.cargo/bin&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Or just run it in place without installing:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;cargo run --release&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Requirements&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Rust (stable)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gitlab.com/gitlab-org/cli" rel="nofollow noopener noreferrer"&gt;&lt;code&gt;glab&lt;/code&gt;&lt;/a&gt; authenticated for GitLab repos, and/or &lt;a href="https://cli.github.com" rel="noopener noreferrer"&gt;&lt;code&gt;gh&lt;/code&gt;&lt;/a&gt; authenticated for GitHub repos&lt;/li&gt;
&lt;li&gt;Run it anywhere — inside a…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/suraj16thjan/gitsmith" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>rust</category>
      <category>gitlab</category>
      <category>github</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
