<?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: GridPort</title>
    <description>The latest articles on DEV Community by GridPort (@gridport).</description>
    <link>https://dev.to/gridport</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%2F4043634%2F015dc2f1-d2ac-4099-8df4-98ab9ca37fc2.png</url>
      <title>DEV Community: GridPort</title>
      <link>https://dev.to/gridport</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gridport"/>
    <language>en</language>
    <item>
      <title>Your LLM Runs Locally. Your Data Might Not.</title>
      <dc:creator>GridPort</dc:creator>
      <pubDate>Tue, 18 Aug 2026 02:48:36 +0000</pubDate>
      <link>https://dev.to/gridport/your-llm-runs-locally-your-data-might-not-5p4</link>
      <guid>https://dev.to/gridport/your-llm-runs-locally-your-data-might-not-5p4</guid>
      <description>&lt;p&gt;When sensitive or regulated data enters an LLM workflow, teams often make a quick decision: if it cannot go to a public cloud API, run the model locally.&lt;/p&gt;

&lt;p&gt;That may be right. But a local GPU or selected region does not determine the full data path. Prompts may stay local while RAG components, embeddings, logs, backups, or administrative access cross a different boundary.&lt;/p&gt;

&lt;p&gt;This field guide helps engineers, security teams, and technical leaders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand why a local model is not necessarily a local data path&lt;/li&gt;
&lt;li&gt;Trace data from input through processing, storage, and deletion&lt;/li&gt;
&lt;li&gt;Ask for the owners and evidence needed before choosing self-hosting, isolated infrastructure, or a managed service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This article does not recommend a specific vendor and is not legal advice. Requirements vary by jurisdiction, data type, contract, and professional obligation.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why “local” is not the end of the decision
&lt;/h2&gt;

&lt;p&gt;It often starts with a clear rule. A criminal defense lawyer may decide not to enter client files into a general-purpose cloud AI service before reviewing confidentiality safeguards, contracts, retention, training use, and consent. The American Bar Association’s &lt;a href="https://www.americanbar.org/content/dam/aba/administrative/professional_responsibility/ethics-opinions/aba-formal-opinion-512.pdf" rel="noopener noreferrer"&gt;Formal Opinion 512&lt;/a&gt; does not impose a blanket ban; it requires lawyers to evaluate the tool and protect client information.&lt;/p&gt;

&lt;p&gt;An EU-based company may similarly restrict personal data from a US region. But the rule is not simply “US cloud prohibited”: the GDPR allows some transfers under a valid mechanism. The &lt;a href="https://www.edpb.europa.eu/sme/be-compliant/international-data-transfers_en" rel="noopener noreferrer"&gt;European Data Protection Board’s guidance&lt;/a&gt; explains the available routes.&lt;/p&gt;

&lt;p&gt;“Regulated data” is not one universal category. Personal data, health information, payment data, privileged communications, export-controlled information, and trade secrets can produce different obligations.&lt;/p&gt;

&lt;p&gt;Still, once a team decides that a public API is not acceptable, the next question arrives immediately: &lt;strong&gt;what hardware, exactly?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answers are predictable — a $6K Mac Studio, a pair of used 3090s for $4K, a $16K rack. A legal or contractual constraint gets converted, in a single conversation, into a hardware purchase decision. That conversion happens so quickly that almost nobody stops to ask whether the box actually satisfies the requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  It is not just where the GPU sits
&lt;/h2&gt;

&lt;p&gt;Data residency often gets treated as a map problem: pick the region, pick the provider, done. Region is important, but it is only one part of the data flow.&lt;/p&gt;

&lt;p&gt;An AI service can have separate locations and policies for model execution, request storage, application logs, traces, abuse monitoring, customer support, backups, and administrative access. This does not mean that every EU inference endpoint sends prompt content elsewhere, or that every form of cross-border access is automatically unlawful. It means that a region selector is not a complete architecture diagram.&lt;/p&gt;

&lt;p&gt;The honest version of “where does this run?” has at least seven layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where the model executes&lt;/li&gt;
&lt;li&gt;Where prompts, files, and outputs are stored — and for how long&lt;/li&gt;
&lt;li&gt;Where embeddings, vector data, and retrieved documents are processed&lt;/li&gt;
&lt;li&gt;Where logs, traces, telemetry, and error reports go&lt;/li&gt;
&lt;li&gt;Where caches, queues, temporary files, backups, and snapshots live&lt;/li&gt;
&lt;li&gt;Which subprocessors receive or can access the data&lt;/li&gt;
&lt;li&gt;Who has administrative or support access to any of the above&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The places to check are the service-specific data-residency documentation, data processing agreement, subprocessor list, logging configuration, retention policy, and support-access model — not only the marketing page.&lt;/p&gt;

&lt;p&gt;The same inspection applies to a self-hosted system. A model can run on a local GPU while an observability SDK exports traces, an embedding call goes to an external API, a vector database is managed in another region, or a crash reporter captures part of a prompt.&lt;/p&gt;

&lt;p&gt;“Local model” does not necessarily mean “local data path.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The description reaches review before the architecture does
&lt;/h2&gt;

&lt;p&gt;Another risk rarely appears in the infrastructure budget: the system may be described to legal, insurance, or procurement reviewers before its operating boundaries are clear.&lt;/p&gt;

&lt;p&gt;Consider the phrase “autonomous decision engine.” A reviewer may reasonably hear that as a system making consequential decisions without human approval. The engineering team may only mean a tool that drafts recommendations for a person to review. Those are materially different control models, but a vague description can make them sound identical.&lt;/p&gt;

&lt;p&gt;The lesson is not to market around compliance review. It is to describe the system accurately enough that reviewers do not have to infer what it does.&lt;/p&gt;

&lt;p&gt;Before the build starts, write one paragraph covering what data enters, what the model produces or decides, what actions it can take, where human approval is required, where data is retained, and what happens when the system is wrong or unavailable.&lt;/p&gt;

&lt;p&gt;Have the people who will actually approve the system review it early. Vocabulary is not merely a marketing afterthought here; it is part of the governance surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  A blanket ban can create a shadow-AI problem
&lt;/h2&gt;

&lt;p&gt;An air-gapped environment can be appropriate for some threat models. But “no cloud APIs” is a policy statement, not by itself a complete security architecture.&lt;/p&gt;

&lt;p&gt;If a policy prohibits the available tools without providing a usable alternative, some people may look for another route: a personal account, a browser extension, an unreviewed open-source UI, or a script that bypasses the normal controls.&lt;/p&gt;

&lt;p&gt;That does not make the policy unnecessary. It means the control has to include an approved way to complete the work.&lt;/p&gt;

&lt;p&gt;The useful framing is not simply “cloud versus local.” It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can people complete the intended task inside the approved boundary, with controls that are visible and supportable?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Open weights do not remove every dependency
&lt;/h2&gt;

&lt;p&gt;It is tempting to assume that open weights settle the dependency question. A provider cannot revoke access to a copy of the weights you already possess, so the system must be independent.&lt;/p&gt;

&lt;p&gt;The first sentence may be technically true. The conclusion does not always follow.&lt;/p&gt;

&lt;p&gt;MiniMax H3 provides a concrete 2026 example. H3 is a video-generation model rather than a text LLM, but its license illustrates a dependency question that applies to downloadable models across an AI stack. Its community license defines an “Applicable Territory” that excludes the United States, the European Union, the United Kingdom, and the Republic of Korea. The relevant rights are granted only within that territory. The exact terms are in the official &lt;a href="https://huggingface.co/MiniMaxAI/MiniMax-H3/blob/main/LICENSE" rel="noopener noreferrer"&gt;MiniMax H3 Community License Agreement&lt;/a&gt;, and users in excluded territories can apply for &lt;a href="https://platform.minimax.io/h3-license" rel="noopener noreferrer"&gt;separate authorization&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The important distinction is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Possessing model weights is not the same as having the legal, technical, and operational ability to deploy them for your use case.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The license is only one dependency. A self-hosted system may still rely on a model repository, tokenizer, container registry, proprietary runtime, update channel, or a small group of staff who know how to operate it. Test whether the deployment can actually be rebuilt without the original provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat availability as a design input
&lt;/h2&gt;

&lt;p&gt;Managed APIs can become unavailable because of capacity constraints, provider incidents, account problems, policy changes, or regional restrictions. Self-hosted infrastructure has its own failure modes: hardware faults, broken model artifacts, unavailable operators, and delayed security patches.&lt;/p&gt;

&lt;p&gt;The relevant question is not “Which option never fails?” It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happens to this workflow when the selected option fails tomorrow?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An acceptable answer may be automatic failover, a second approved provider, a smaller local model, a manual queue, or a documented decision to pause the workflow. The important part is that the answer exists before the outage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eight questions to answer before deployment
&lt;/h2&gt;

&lt;p&gt;This is a minimum-viable design review, not a universal statement of legal requirements. Not every team needs every control on day one. The goal is to decide explicitly which controls your data, industry, contracts, and risk level require. The lifecycle approach is consistent with the &lt;a href="https://www.nist.gov/itl/ai-risk-management-framework" rel="noopener noreferrer"&gt;NIST Generative AI Profile&lt;/a&gt; and the UK National Cyber Security Centre’s &lt;a href="https://www.ncsc.gov.uk/collection/guidelines-secure-ai-system-development" rel="noopener noreferrer"&gt;Guidelines for Secure AI System Development&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What data enters the system?&lt;/strong&gt; Classify prompts, files, RAG sources, and tool inputs. Define prohibited data and remove unnecessary identifiers where practical.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What leaves the application boundary?&lt;/strong&gt; Trace inference, embeddings, reranking, moderation, tool calls, observability, and crash reporting — not just the primary model request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Where does the data persist?&lt;/strong&gt; Check prompts, outputs, logs, vector stores, caches, queues, temporary files, snapshots, and backups. Set retention deliberately, including whether data can be used for provider training or service improvement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Who can access or redirect it?&lt;/strong&gt; Include end users, application operators, provider support, subprocessors, and anyone able to change logging, region, retention, or outbound connections. Use least privilege and managed secrets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;How will you detect and contain a failure?&lt;/strong&gt; Decide what must be logged, where audit records are exported, who responds to an incident, and how you will detect abnormal access, prompt injection, bulk extraction, or unexpected outbound traffic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;How does deletion actually work?&lt;/strong&gt; Define retention by data type and verify whether deletion reaches replicas, indexes, backups, snapshots, and derived datasets. Keep production data out of development and evaluation unless explicitly approved.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What evidence proves the design is operating as intended?&lt;/strong&gt; Keep a current data-flow diagram, configuration records, relevant contracts and license terms, and test results. For important controls, record an owner, evidence, last review date, and accepted residual risk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What happens if a dependency disappears tomorrow?&lt;/strong&gt; Plan for provider, region, account, model, operator, or license unavailability. Confirm that essential data and configurations can be exported and that the deployment can be rebuilt or replaced.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Higher-risk environments may need deeper controls for isolation, encryption, supply-chain integrity, patching, recovery testing, and jurisdiction-specific evidence. The eight questions above tell you where that deeper work is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not settle
&lt;/h2&gt;

&lt;p&gt;These questions do not decide whether you should self-host, rent isolated infrastructure, use a private cloud, or choose a compliant managed endpoint. A well-operated managed service can be safer than a poorly maintained local server; an isolated deployment can meet requirements that a shared API cannot. The answer depends on the data, threat model, workload, internal capability, cost, and tolerance for operational responsibility.&lt;/p&gt;

&lt;p&gt;The narrower point is this: regulated data is not merely a hardware-buying trigger. Before choosing the box or endpoint, trace the data path, define the operating boundary, identify who can change it, and decide what happens when a dependency fails. That is the design work that prevents an expensive surprise during a review, incident, or outage.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was edited with AI assistance, and the cover image was AI-generated. The final content and cited sources were reviewed before publication.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you have been through a security, privacy, insurance, procurement, or legal review for an AI system, what evidence actually mattered — and what turned out to be noise?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>security</category>
      <category>architecture</category>
      <category>ai</category>
    </item>
    <item>
      <title>Using PixelRAG with Claude Code (August 2026) — Visual RAG for Documents with Tables and Diagrams</title>
      <dc:creator>GridPort</dc:creator>
      <pubDate>Mon, 17 Aug 2026 05:01:56 +0000</pubDate>
      <link>https://dev.to/gridport/using-pixelrag-with-claude-code-august-2026-visual-rag-for-documents-with-tables-and-diagrams-82c</link>
      <guid>https://dev.to/gridport/using-pixelrag-with-claude-code-august-2026-visual-rag-for-documents-with-tables-and-diagrams-82c</guid>
      <description>&lt;p&gt;PixelRAG is a visual RAG tool that treats web pages, PDFs, and images as &lt;em&gt;screenshots&lt;/em&gt; rather than text — preserving the layout of tables and charts so you can search and reference them as-is.&lt;/p&gt;

&lt;p&gt;This post covers installing it as a plugin, actual usage, how it differs from traditional text-based RAG, and the gotchas you're likely to hit — all from a Claude Code user's perspective.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you'll get out of this post&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're an intermediate engineer already using Claude Code for real work&lt;/li&gt;
&lt;li&gt;You need to search or understand documents where tables, diagrams, and layout matter&lt;/li&gt;
&lt;li&gt;You want to know how this differs from traditional text RAG (embeddings + a vector DB)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;PixelRAG renders documents — web pages, PDFs, images — as screenshots and feeds those images directly to the model. The visual structure that HTML parsing normally destroys — tables, charts, layout, infographics — stays intact, so the model can actually answer questions about them.&lt;/p&gt;

&lt;p&gt;PixelRAG is an open-source project built around "Visual Retrieval-Augmented Generation," made up of 5 components:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pixelrag-render&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Converts documents (web pages, PDFs) into image tiles (via Playwright/CDP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pixelrag-embed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vectorizes tile images and builds a FAISS index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pixelrag-index&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs the full source → ingest → embed → index pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pixelrag-serve&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Serves a FAISS search API (CPU/GPU)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pixelrag-train&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fine-tunes Qwen3-VL-Embedding via LoRA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are all now bundled into a single &lt;code&gt;pixelrag&lt;/code&gt; package, installable with one &lt;code&gt;pip install pixelrag&lt;/code&gt;. As a Claude Code user, the first thing you'll actually touch is the &lt;code&gt;pixelshot&lt;/code&gt; command (shipped by &lt;code&gt;pixelrag-render&lt;/code&gt;) and the "pixelbrowse" plugin that wires it into Claude Code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
    A[URL / PDF] --&amp;gt; B["pixelshot&amp;lt;br/&amp;gt;(generates image tiles)"]
    B --&amp;gt; C["tile_0000.jpg ..."]
    C --&amp;gt; D["Claude Code's Read tool"]
    D --&amp;gt; E["Claude understands it visually"]
    C -.-&amp;gt;|optional| F[pixelrag-embed / index]
    F --&amp;gt; G[FAISS index]
    G --&amp;gt; H[pixelrag-serve search API]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How this differs from traditional text RAG&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Row/column relationships in tables (these tend to break down under text extraction)&lt;/li&gt;
&lt;li&gt;The actual content of charts, diagrams, and infographics&lt;/li&gt;
&lt;li&gt;Meaning carried by layout itself (emphasis, the position of annotations, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting up PixelRAG
&lt;/h2&gt;

&lt;p&gt;Setup is straightforward: either clone the repo and run it locally, or add the plugin via the marketplace.&lt;/p&gt;

&lt;h3&gt;
  
  
  Before you start
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.12+ (per &lt;code&gt;requires-python&lt;/code&gt; in &lt;code&gt;pyproject.toml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Claude Code CLI already installed&lt;/li&gt;
&lt;li&gt;License: Apache-2.0 (commercial use allowed)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Note&lt;/strong&gt;: the repo's &lt;code&gt;pyproject.toml&lt;/code&gt; includes &lt;code&gt;environments = ["sys_platform == 'linux'"]&lt;/code&gt;, meaning the GPU-dependent parts (&lt;code&gt;embed&lt;/code&gt;/&lt;code&gt;serve&lt;/code&gt;/&lt;code&gt;train&lt;/code&gt;) assume Linux. This shouldn't matter much if you're only using the screenshot feature (&lt;code&gt;pixelshot&lt;/code&gt;), but on Mac/Windows you're safer running it through WSL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost note&lt;/strong&gt;: the &lt;code&gt;pixelshot&lt;/code&gt; screenshot feature just runs Playwright/Chromium locally, so there's no extra cost beyond your normal Claude Code token usage. Building your own index with &lt;code&gt;embed&lt;/code&gt;/&lt;code&gt;serve&lt;/code&gt;/&lt;code&gt;train&lt;/code&gt;, however, needs a GPU, and if you use a cloud GPU for that, you'll pay for that usage separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;The official &lt;code&gt;plugin/setup.sh&lt;/code&gt; looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# One-liner that installs pixelrag and registers it as a Claude Code plugin&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="c"&gt;# Install pixelrag into an isolated environment via uv&lt;/span&gt;
uv tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--from&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; pixelrag 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    uv tool upgrade &lt;span class="nt"&gt;--from&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; pixelrag

&lt;span class="c"&gt;# Install Chromium for screenshots&lt;/span&gt;
uvx playwright &lt;span class="nb"&gt;install &lt;/span&gt;chromium 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option 1: Clone the repo and run it locally&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/StarTrail-org/PixelRAG.git
&lt;span class="nb"&gt;cd &lt;/span&gt;PixelRAG
./plugin/setup.sh
claude &lt;span class="nt"&gt;--plugin-dir&lt;/span&gt; ./plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option 2: Install via the marketplace&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;pixelrag                                &lt;span class="c"&gt;# installs the pixelshot command&lt;/span&gt;
claude plugin marketplace add StarTrail-org/PixelRAG
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;pixelbrowse@pixelrag-plugins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the plugin installed, Claude is set up to call &lt;code&gt;pixelshot&lt;/code&gt; via Bash and then read the generated images with the Read tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using PixelRAG with Claude Code
&lt;/h2&gt;

&lt;p&gt;Once installed, you just pass a URL in regular conversation and it works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Look at https://news.ycombinator.com and summarize the top stories"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In an interactive session, you can also use the slash command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--plugin-dir&lt;/span&gt; ./plugin
&lt;span class="c"&gt;# inside the session&lt;/span&gt;
/screenshot https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under the hood, Claude runs something like the following &lt;code&gt;pixelshot&lt;/code&gt; command via Bash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Screenshot a URL (tile height optimized to 1568px for Claude's vision model)&lt;/span&gt;
pixelshot https://example.com &lt;span class="nt"&gt;--output&lt;/span&gt; /tmp/pixelbrowse &lt;span class="nt"&gt;--tile-height&lt;/span&gt; 1568 &lt;span class="nt"&gt;--wait-network-idle&lt;/span&gt;

&lt;span class="c"&gt;# Process multiple URLs in parallel&lt;/span&gt;
pixelshot url1 url2 &lt;span class="nt"&gt;--output&lt;/span&gt; /tmp/pixelbrowse &lt;span class="nt"&gt;--tile-height&lt;/span&gt; 1568 &lt;span class="nt"&gt;--wait-network-idle&lt;/span&gt; &lt;span class="nt"&gt;--workers&lt;/span&gt; 4

&lt;span class="c"&gt;# Render a PDF&lt;/span&gt;
pixelshot document.pdf &lt;span class="nt"&gt;--output&lt;/span&gt; /tmp/pixelbrowse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output is saved with a naming pattern like &lt;code&gt;/tmp/pixelbrowse/&amp;lt;domain&amp;gt;.png.tiles/tile_0000.jpg&lt;/code&gt;, and Claude reads it in as an image to understand the content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas, troubleshooting, and where this is useful
&lt;/h2&gt;

&lt;p&gt;The following notes come straight from the official SKILL.md and matter in practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forgetting &lt;code&gt;--wait-network-idle&lt;/code&gt; gives you a blank page&lt;/strong&gt;&lt;br&gt;
Sites that render via JavaScript will get captured before they've finished loading if you skip this flag, leaving you with an empty screenshot. Always include it when targeting a URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stick with the default &lt;code&gt;--tile-height&lt;/code&gt; of 1568px&lt;/strong&gt;&lt;br&gt;
Claude's vision models downscale images whose long edge exceeds 1568px (Sonnet/Haiku) or 2576px (Opus) before processing them. Leave the default at 8192px and the text becomes too compressed to read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If text is too small to read, crop and re-read it&lt;/strong&gt;&lt;br&gt;
The official workflow is to crop the relevant region with Pillow and feed it back through the Read tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where PixelRAG is useful&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Searching specs, IR documents, and anything else with tables and charts that text extraction tends to mangle&lt;/li&gt;
&lt;li&gt;Checking your own site's UI for visual bugs (e.g. "screenshot &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; and tell me if anything looks broken")&lt;/li&gt;
&lt;li&gt;Understanding papers or scanned PDFs where layout carries meaning&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;PixelRAG specializes in exactly what traditional text RAG struggles with: searching documents while preserving tables, diagrams, and layout.&lt;/p&gt;

&lt;p&gt;Wiring it into Claude Code doesn't require an MCP server at all — it's a skill-only setup that comes down to a single &lt;code&gt;pixelshot&lt;/code&gt; command. Before using it in production, check the official repo for the latest status.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official repo: &lt;a href="https://github.com/StarTrail-org/PixelRAG" rel="noopener noreferrer"&gt;https://github.com/StarTrail-org/PixelRAG&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Official site: &lt;a href="https://pixelrag.ai" rel="noopener noreferrer"&gt;https://pixelrag.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Plugin-only README: &lt;a href="https://github.com/StarTrail-org/PixelRAG/blob/main/plugin/README.md" rel="noopener noreferrer"&gt;https://github.com/StarTrail-org/PixelRAG/blob/main/plugin/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 This post reflects information as of August 2026. Since Claude Code updates frequently, check the official docs for the latest specifics.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was edited with AI assistance.&lt;br&gt;
*Originally published in Japanese on &lt;a href="https://highreso.jp/edgehub/machinelearning/pixelrag.html?utm_source=devto" rel="noopener noreferrer"&gt;EdgeHUB&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>rag</category>
      <category>python</category>
      <category>ai</category>
    </item>
    <item>
      <title>Building a Custom MCP Server for Claude Code — A Fortune-Telling Tool with FastMCP</title>
      <dc:creator>GridPort</dc:creator>
      <pubDate>Thu, 13 Aug 2026 15:04:18 +0000</pubDate>
      <link>https://dev.to/gridport/building-a-custom-mcp-server-for-claude-code-a-fortune-telling-tool-with-fastmcp-2j0d</link>
      <guid>https://dev.to/gridport/building-a-custom-mcp-server-for-claude-code-a-fortune-telling-tool-with-fastmcp-2j0d</guid>
      <description>&lt;p&gt;"MCP servers sound complicated" — if that's your reaction, FastMCP might change your mind. It handles almost all the plumbing for you. Add one decorator to a plain Python function, and you've got a custom tool Claude Code can call.&lt;/p&gt;

&lt;p&gt;In this post, we'll build a small fortune-telling tool as a learning exercise, and walk through what FastMCP is actually doing for you along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MCP, anyway?
&lt;/h2&gt;

&lt;p&gt;MCP (Model Context Protocol) is a common standard for giving AI models like Claude "external tools" to work with.&lt;/p&gt;

&lt;p&gt;An AI model itself is great at generating text, but on its own it can't do concrete things like "tell today's fortune based on the date" or "query an internal database."&lt;/p&gt;

&lt;p&gt;That's where an MCP server comes in: you register callable tools on it, and Claude Code invokes them whenever it needs to.&lt;/p&gt;

&lt;p&gt;Hand-writing an MCP server from scratch is a fair amount of work, but with FastMCP you can build a working fortune-telling tool that Claude Code can call in just a few dozen lines of code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why FastMCP makes this easy
&lt;/h3&gt;

&lt;p&gt;Normally, an MCP server has to implement a lot of low-level protocol details — what message format to use, how to advertise the list of available tools, and so on. FastMCP takes care of all that "plumbing" for you.&lt;/p&gt;

&lt;p&gt;All you do as a developer is write a normal Python function and mark it with &lt;code&gt;@mcp.tool&lt;/code&gt;. FastMCP inspects the function's argument types and return type to auto-generate the schema (the "instruction manual") that gets handed to the AI. Since none of the transport or protocol details are something you need to think about, anyone who's written a basic web app can have their first tool running in a few minutes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note on decorator syntax&lt;/strong&gt;: the standalone &lt;code&gt;fastmcp&lt;/code&gt; package (what we're using here) accepts a bare &lt;code&gt;@mcp.tool&lt;/code&gt;, no parentheses needed. If you're instead using the &lt;code&gt;MCPServer&lt;/code&gt; bundled with the official &lt;code&gt;mcp&lt;/code&gt; Python SDK, the decorator requires parentheses: &lt;code&gt;@mcp.tool()&lt;/code&gt;. Mixing the two up is a common source of confusing errors, so if you copy code from a different MCP tutorial, double-check which package it's using.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Setting up the Python environment
&lt;/h2&gt;

&lt;p&gt;You'll need Python 3.10 or later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it's not installed, grab it from &lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;python.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then create and activate a virtual environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS / Linux&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate

&lt;span class="c"&gt;# Windows&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
venv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate.bat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once activated, you should see &lt;code&gt;(venv)&lt;/code&gt; at the start of your prompt.&lt;/p&gt;

&lt;p&gt;Install FastMCP:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;That's it — no database, no config files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the fortune-telling tool
&lt;/h2&gt;

&lt;p&gt;Create a project folder and, inside it, a &lt;code&gt;server.py&lt;/code&gt; file with the following:&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;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;

&lt;span class="c1"&gt;# Create the server ("uranai" is Japanese for "fortune-telling" — the name of this tool group)
&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uranai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fortune&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;birthday&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Tells today&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s fortune based on a name (and optionally a birthday).&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Seed the RNG with name + birthday + today's date, so the result
&lt;/span&gt;    &lt;span class="c1"&gt;# stays the same for a given person on a given day, but changes daily.
&lt;/span&gt;    &lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;birthday&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;rng&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;levels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Great luck&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Good luck&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Modest luck&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Luck&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fading luck&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bad luck&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reading a book&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;taking a walk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;coffee&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sleeping early&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a new app&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cleaning&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;red&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;green&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yellow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;white&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;purple&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Today&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s fortune for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fortune: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;levels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Lucky activity: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Lucky color: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Lucky number: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three things matter here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;FastMCP("uranai")&lt;/code&gt; creates the server instance.&lt;/li&gt;
&lt;li&gt;Adding &lt;code&gt;@mcp.tool&lt;/code&gt; to the function is all it takes to turn it into something Claude can call.&lt;/li&gt;
&lt;li&gt;The docstring (the &lt;code&gt;"""..."""&lt;/code&gt; part) is what the AI reads to decide &lt;em&gt;when&lt;/em&gt; to use this tool — write it clearly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The trick worth noting is seeding the random number generator with today's date. That gives you fortune-telling-app behavior for free: the same person gets the same result if asked again on the same day, and a different result the next day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting the server
&lt;/h2&gt;

&lt;p&gt;From the project directory, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python server.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it starts without errors, you're ready to connect it to Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting to Claude Code
&lt;/h2&gt;

&lt;p&gt;If you don't have the Claude Code CLI installed yet, install it first — see the &lt;a href="https://code.claude.com/docs/en/installation" rel="noopener noreferrer"&gt;official installation docs&lt;/a&gt; for your platform (macOS, Linux, or Windows).&lt;/p&gt;

&lt;p&gt;Then register the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add uranai &lt;span class="nt"&gt;--&lt;/span&gt; python /path/to/server.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;/path/to/server.py&lt;/code&gt; with the actual path (if you're using a virtual environment, point to that environment's Python executable to be safe).&lt;/p&gt;

&lt;p&gt;Restart or reload Claude Code, and the &lt;code&gt;uranai&lt;/code&gt; server should be recognized. You can check connection status with the &lt;code&gt;/mcp&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;If you're using the Claude desktop app instead, add this to your config file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS: &lt;code&gt;~/Library/Application Support/Claude/claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Windows: &lt;code&gt;%APPDATA%\Claude\claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"uranai"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/venv/bin/python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/path/to/uranai/server.py"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(On Windows, &lt;code&gt;command&lt;/code&gt; would instead point to something like &lt;code&gt;C:\\Users\\yourname\\uranai\\venv\\Scripts\\python.exe&lt;/code&gt;.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it out
&lt;/h2&gt;

&lt;p&gt;Open Claude Code, ask it for your fortune, and approve the tool call when prompted. You should get back a fortune generated by your own tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ideas for taking it further
&lt;/h2&gt;

&lt;p&gt;Once the basics work, adding more tools is just a matter of writing another function and decorating it with &lt;code&gt;@mcp.tool&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tarot / omikuji mode&lt;/strong&gt;: expand the pool of results and messages for more variety.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zodiac-based fortunes&lt;/strong&gt;: parse the birthday into a zodiac sign and tailor results accordingly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External API integration&lt;/strong&gt;: pull in weather or calendar data to add some real-world flavor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persisting results&lt;/strong&gt;: log fortune history to a file or database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If things get heavier — image generation, larger-scale analysis — you don't have to run this on your laptop. You could offload the compute to a GPU cloud instance and expose the MCP server from there instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;With FastMCP, building an MCP server comes down to "write a Python function, add &lt;code&gt;@mcp.tool&lt;/code&gt;." We walked through the whole loop here — environment setup, writing the tool, connecting it to Claude Code, and confirming it works — using a fortune-telling tool as the example.&lt;/p&gt;

&lt;p&gt;The same pattern scales to far more useful things: wrapping internal tools, automating repetitive tasks, and more. Fortune-telling is just the toy example — try swapping in your own idea next.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 This post reflects Claude Code's behavior as of June 2026. Since Claude Code updates frequently, check the &lt;a href="https://code.claude.com/docs/en/commands" rel="noopener noreferrer"&gt;official docs&lt;/a&gt; for the latest details.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was edited with AI assistance.&lt;br&gt;
*Originally published in Japanese on &lt;a href="https://highreso.jp/edgehub/wordgenerationai/claude-mcp.html?utm_source=devto" rel="noopener noreferrer"&gt;EdgeHUB&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>mcp</category>
      <category>python</category>
      <category>ai</category>
    </item>
    <item>
      <title>6 Claude Code Skills You Should Actually Install (2026 Edition)</title>
      <dc:creator>GridPort</dc:creator>
      <pubDate>Mon, 10 Aug 2026 04:58:48 +0000</pubDate>
      <link>https://dev.to/gridport/6-claude-code-skills-you-should-actually-install-2026-edition-4k24</link>
      <guid>https://dev.to/gridport/6-claude-code-skills-you-should-actually-install-2026-edition-4k24</guid>
      <description>&lt;p&gt;Claude Code now has dozens of skills and plugins available, both official and community-built. Installing them indiscriminately backfires: when several skills cover the same territory, Claude has to guess which one to use, and that guesswork shows up as unpredictable behavior.&lt;/p&gt;

&lt;p&gt;Based on what's available as of July 2026, this post narrows the field down to 6 skills that actually move the needle in day-to-day work, along with the selection criteria behind the picks and the install commands. It also covers what to watch for when rolling these out to a team.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 6 skills at a glance
&lt;/h2&gt;

&lt;p&gt;A typical dev cycle runs design → implementation → review → security → testing, then loops back to design. Each of the 6 skills below maps to one of these phases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
    A[Design&amp;lt;br/&amp;gt;skill-creator] --&amp;gt; B[Implementation UI&amp;lt;br/&amp;gt;frontend-design]
    B --&amp;gt; C[Review&amp;lt;br/&amp;gt;code-review]
    C --&amp;gt; D[Security&amp;lt;br/&amp;gt;security-guidance]
    D --&amp;gt; E[Testing&amp;lt;br/&amp;gt;playwright]
    E --&amp;gt; A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;superpowers&lt;/td&gt;
&lt;td&gt;Development discipline&lt;/td&gt;
&lt;td&gt;Forces steps like "clarify requirements before writing code" and "identify root cause before fixing a bug"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skill-creator&lt;/td&gt;
&lt;td&gt;Design (meta: builds skills)&lt;/td&gt;
&lt;td&gt;Walks you through a Q&amp;amp;A to generate a custom SKILL.md for your own workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;frontend-design&lt;/td&gt;
&lt;td&gt;Implementation (UI)&lt;/td&gt;
&lt;td&gt;Generates frontends with a deliberate aesthetic direction instead of generic "AI-looking" UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;security-guidance&lt;/td&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Detects roughly 25 vulnerability patterns in real time on every edit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;playwright&lt;/td&gt;
&lt;td&gt;Testing&lt;/td&gt;
&lt;td&gt;Drives a browser to run E2E tests and verify behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;discord&lt;/td&gt;
&lt;td&gt;Notifications / remote control&lt;/td&gt;
&lt;td&gt;Sends run notifications and lets you operate Claude Code remotely from your phone&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three criteria guided this selection:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep exactly one skill per phase.&lt;/strong&gt;&lt;br&gt;
Installing multiple skills that cover the same phase makes Claude hesitate over which one to invoke, which leads to unpredictable behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prefer official or well-established plugins.&lt;/strong&gt;&lt;br&gt;
A SKILL.md someone wrote as a side project is riskier to depend on than something maintained by Anthropic or widely used across the ecosystem (high weekly install counts, for example) — the latter is more likely to keep being maintained.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with these 6, add more only when you actually need to.&lt;/strong&gt;&lt;br&gt;
Add anything beyond this baseline only once you hit a task you find yourself repeating almost identically every time. Things like test generation, changelog formatting, or company-specific checklists are worth building yourself with skill-creator — but only after you've used the core 6 enough to know exactly what you need.&lt;/p&gt;
&lt;h2&gt;
  
  
  The 6 skills in detail
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. superpowers (enforces development discipline)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Claude Code tends to jump straight into implementation, skipping requirements clarification and root-cause analysis. Superpowers forces steps like "clarify requirements before adding a feature" and "identify the root cause before fixing a bug." Built by developer Jesse Vincent, it was added to the official plugin marketplace in January 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin &lt;span class="nb"&gt;install &lt;/span&gt;superpowers@claude-plugins-official
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;: No special invocation is needed after install — just ask Claude to implement something as usual, and it will automatically walk through clarify requirements → design → implement → test. If you only want a specific phase, like brainstorming or test-driven development, you can call the relevant sub-skill directly, e.g. &lt;code&gt;/superpowers:brainstorming&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. skill-creator (a skill for building skills)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Walks you through an interactive Q&amp;amp;A to build a SKILL.md tailored to your own team's workflows. This is an official Anthropic plugin, and one of the most widely used skills in the ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin &lt;span class="nb"&gt;install &lt;/span&gt;skill-creator@claude-plugins-official
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;: Typing &lt;code&gt;/skill-creator&lt;/code&gt; starts an interactive Q&amp;amp;A. Answer questions about the goal of the skill you want, expected inputs, and expected outputs, and it generates a SKILL.md template. Save it under &lt;code&gt;.claude/skills/&lt;/code&gt;, then call it with &lt;code&gt;/skill-name&lt;/code&gt; to test and refine it. It's best to build one skill per purpose — e.g., a standardized meeting-notes format or a code review checklist — rather than one catch-all skill.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. frontend-design (frontend UI generation)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Instead of generic "AI-looking" defaults, this generates UI with a deliberate aesthetic — brutalism, glassmorphism, and so on. It's an official Anthropic skill with a large install base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin &lt;span class="nb"&gt;install &lt;/span&gt;frontend-design@claude-plugins-official
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;: When asking for UI, be explicit about both the skill and the style you want — e.g., "Using the frontend-design skill, build an admin dashboard with a brutalist aesthetic." Follow-up nudges like "make it more monochrome" or "give it more whitespace" refine the result while keeping the original direction.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. security-guidance (security scanning)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: On every code edit, it scans for roughly 25 vulnerability patterns — injection, unsafe deserialization, dangerous DOM API usage, and more — using regex-based real-time detection. It also layers in an LLM-based diff review at the end of each turn and a cross-file review at commit time, for a three-tier check. This is a free, official Anthropic plugin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin &lt;span class="nb"&gt;install &lt;/span&gt;security-guidance@claude-plugins-official
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;: No explicit invocation is needed — a background scan runs automatically on every edit. When it flags a vulnerability, it proposes a fix on the spot, which you can review and choose to apply. If you'd rather batch a review before committing, you can also ask it to actively review a specific scope of changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. playwright (browser automation)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Drives a browser to handle navigation, form input, screenshots, and console log inspection. There are two ways to install it: Microsoft's official Playwright MCP, or a CLI+Skill setup (&lt;code&gt;playwright-cli install --skills&lt;/code&gt;) that's more token-efficient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# MCP approach&lt;/span&gt;
claude mcp add playwright

&lt;span class="c"&gt;# CLI+Skill approach&lt;/span&gt;
playwright-cli &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--skills&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;: With the MCP approach, register it with &lt;code&gt;claude mcp add playwright&lt;/code&gt;, then ask Claude to test something like a login form — it will drive the browser and return screenshots and results. With the CLI+Skill approach, call &lt;code&gt;/playwright&lt;/code&gt; after install and specify the test scenario step by step.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Discord (notifications / remote control)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Sends Claude Code's run results to Discord, and lets you pair with a bot via DM to remotely generate code or manipulate files from your phone. It combines an MCP server with Agent Skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin &lt;span class="nb"&gt;install &lt;/span&gt;discord@claude-plugins-official
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;: After installing, DM the bot on Discord and it replies with a pairing code. Enter that code in Claude Code to complete the link. From there, the &lt;code&gt;/discord&lt;/code&gt; command handles run notifications and lets you remotely generate code or manipulate files via Discord.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rolling this out to a team
&lt;/h2&gt;

&lt;p&gt;Commit skills to the project-level &lt;code&gt;.claude/skills/&lt;/code&gt; directory rather than your personal home directory (&lt;code&gt;~/.claude/skills/&lt;/code&gt;), so the whole team shares the same 6 skills.&lt;/p&gt;

&lt;p&gt;For production repos where you want to avoid Claude auto-triggering a skill at an unintended moment, set &lt;code&gt;disable-model-invocation: true&lt;/code&gt; in the SKILL.md frontmatter. This disables Claude's automatic invocation from conversational context, restricting it to explicit &lt;code&gt;/skill-name&lt;/code&gt; calls only.&lt;/p&gt;

&lt;p&gt;security-guidance is designed with the assumption that it will produce some false positives, so it's worth agreeing as a team on how much to trust its findings. Discord involves managing bot tokens and notification channels, so decide in advance who's allowed to notify or operate through which channel. It's also worth restricting which marketplaces are allowed for installs — official (&lt;code&gt;claude-plugins-official&lt;/code&gt;) or internally vetted ones only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Once these 6 skills cover discipline, design, implementation, security, testing, and notifications, the next step is to use skill-creator to turn your own team's repeated workflows into SKILL.md files.&lt;/p&gt;

&lt;p&gt;The generic skills above won't catch your company's specific review standards or release process — and that's exactly where building your own skills pays off the most.&lt;/p&gt;

&lt;p&gt;For more on how skills work under the hood, see the &lt;a href="https://code.claude.com/docs/en/skills" rel="noopener noreferrer"&gt;official Claude Code docs&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📌 This post reflects information as of July 2026. Claude Code updates frequently, so check the official docs for the latest specifics.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was edited with AI assistance.&lt;br&gt;
*Originally published in Japanese on &lt;a href="https://highreso.jp/edgehub/wordgenerationai/claude-code-skill6.html?utm_source=devto" rel="noopener noreferrer"&gt;EdgeHUB&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>claudecode</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Run MiniMax H3 on 16GB VRAM with ComfyUI</title>
      <dc:creator>GridPort</dc:creator>
      <pubDate>Thu, 06 Aug 2026 03:09:48 +0000</pubDate>
      <link>https://dev.to/gridport/how-to-use-minimax-h3-comfyui-setup-for-local-and-cloud-generation-20hh</link>
      <guid>https://dev.to/gridport/how-to-use-minimax-h3-comfyui-setup-for-local-and-cloud-generation-20hh</guid>
      <description>&lt;p&gt;On August 3, 2026, MiniMax H3 was released with open weights, and ComfyUI shipped native support for it on the same day.&lt;/p&gt;

&lt;p&gt;It's a next-generation model that handles text, images, and audio together, generating video with stereo audio — but there are some practical caveats that official blog posts and early reviews haven't covered much: the resolution ceiling for local runs, and regional restrictions in the commercial license.&lt;/p&gt;

&lt;p&gt;This article covers setup on ComfyUI 0.30.0+, model selection by VRAM, how to use the three workflows (T2V/I2V/R2V), and licensing caveats, as of August 2026.&lt;/p&gt;

&lt;p&gt;In my testing, the pruned INT8 diffusion model combined with the NVFP4 AWQ text encoder allowed MiniMax H3 to run on a GPU with 16GB of VRAM. Depending on your environment, you may still need to adjust settings such as resolution and video duration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MiniMax H3?
&lt;/h2&gt;

&lt;p&gt;MiniMax H3 is a video generation model released with open weights by China's MiniMax on August 3, 2026.&lt;/p&gt;

&lt;p&gt;It's the third generation of the Hailuo series, and the first model the company has released weights for. ComfyUI added native support on release day.&lt;/p&gt;

&lt;p&gt;Key specs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model architecture&lt;/strong&gt;: 33.1B-parameter single-stream omni transformer (about 13B of that is in AdaLN-modulation branches, which don't need to be loaded for inference-only use)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text encoder&lt;/strong&gt;: Qwen3-VL-32B&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output&lt;/strong&gt;: up to 15 seconds, 24fps, with stereo audio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported tasks&lt;/strong&gt;: Text-to-Video (T2V), Image-to-Video (I2V, with start/end frame specification), Reference-to-Video (R2V)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supported languages&lt;/strong&gt;: 11 languages, including Japanese&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkpoints&lt;/strong&gt;: two families — FL2VA (handles T2V/I2V) and Ref2VA (handles reference-driven R2V)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started with MiniMax H3 in ComfyUI
&lt;/h2&gt;

&lt;p&gt;Here's how to get MiniMax H3 running locally in ComfyUI, from setup through generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Update ComfyUI to the latest version
&lt;/h3&gt;

&lt;p&gt;Launch ComfyUI and update to the latest version before proceeding. Once the update finishes, move on to installing the model data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Get the model data
&lt;/h3&gt;

&lt;p&gt;Next, download the model data needed for video generation.&lt;/p&gt;

&lt;p&gt;The model is distributed via the &lt;a href="https://huggingface.co/Comfy-Org/MiniMax-H3" rel="noopener noreferrer"&gt;Comfy-Org/MiniMax-H3&lt;/a&gt; repository on Hugging Face. MiniMax's official repo (&lt;code&gt;MiniMaxAI/MiniMax-H3&lt;/code&gt;) contains every precision and format, weighing in at around 498GB — but if you only download the files ComfyUI actually needs, it's more like a few dozen GB.&lt;/p&gt;

&lt;p&gt;You need three pieces of model data for video generation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video model data&lt;/li&gt;
&lt;li&gt;Text encoder&lt;/li&gt;
&lt;li&gt;VAE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you load the workflow, a list of required downloads appears. Download them in order, or use these commands to grab everything at once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Video model data&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;ComfyUI/models/diffusion_models
wget https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/diffusion_models/minimax_h3_fl2va_pruned_int8_convrot.safetensors

&lt;span class="c"&gt;# Text encoder&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;ComfyUI/models/text_encoders
wget https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/text_encoders/qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors

&lt;span class="c"&gt;# VAE&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;ComfyUI/models/vae
wget https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_audio_vae_fp32.safetensors
wget https://huggingface.co/Comfy-Org/MiniMax-H3/resolve/main/vae/minimax_h3_video_vae_fp16.safetensors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Launch ComfyUI and open the workflow
&lt;/h3&gt;

&lt;p&gt;This guide uses the official combined workflow.&lt;/p&gt;

&lt;p&gt;Download the &lt;a href="https://docs.comfy.org/tutorials/video/minimax/minimax-h3" rel="noopener noreferrer"&gt;official workflow&lt;/a&gt; from Comfy's docs.&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%2F6kyszmhymb5phhrwuzk9.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%2F6kyszmhymb5phhrwuzk9.webp" alt="ComfyUI Native Workflows page showing the MiniMax H3 Text-to-Video download button" width="493" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;(Source: &lt;a href="https://docs.comfy.org/tutorials/video/minimax/minimax-h3" rel="noopener noreferrer"&gt;docs.comfy.org&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Drag and drop the downloaded workflow file into the ComfyUI canvas, then confirm the nodes have loaded correctly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Enter a prompt and start generation (T2V)
&lt;/h3&gt;

&lt;p&gt;MiniMax H3's text-to-video mode can produce high-quality video from a fairly simple prompt.&lt;/p&gt;

&lt;p&gt;Write your scene description in natural language in the prompt field, then click the "▷Queue" button to start generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video generated with MiniMax H3 (ComfyUI):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/W_5cgfkfZyU"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt used:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Emotional anime character film. The girl from Picture 1 in her original scene: a warm sunlit wooden hallway indoors, lit by dramatic warm golden backlight and soft ambient fill, deep soft shadow falloff into rich amber tones. Warm monochromatic palette with golden light and soft blue accents from her eyes. Emotional motif: a desperately reaching hand and a single falling tear. The environment is constant throughout.&lt;/p&gt;

&lt;p&gt;SHOT 1: The scene opens exactly on Picture 1, the girl reaching desperately toward the camera; her eyes well with tears as the golden backlight pulses slightly brighter, dust motes drifting past as the camera executes a slow, deliberate push-in on her straining fingers and glistening eyes.&lt;/p&gt;

&lt;p&gt;SHOT 2: Cut to an extreme close-up profile as her tear finally spills down her flushed cheek; the camera glides slowly alongside her face as loose strands of hair sweep across in the warm draft, her collar and necktie trembling faintly.&lt;/p&gt;

&lt;p&gt;SHOT 3: Cut to a low, tilted wide shot: she loses her balance and tips forward, her twin tails sweeping wildly, the retreating figure's footstep fading further out of frame; the warm light flares gently along her damp eyes before the frame settles into a soft freeze as her hand falls just short.&lt;/p&gt;

&lt;p&gt;Audio: soft ambient room tone, a trembling desperate breath, rustling fabric and a faint hair ornament chime, receding footsteps on wood, and a swelling emotional piano-and-strings score that resolves to a hushed, breathless quiet on the final beat.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 5: Generate video from an image (I2V)
&lt;/h3&gt;

&lt;p&gt;MiniMax H3 can also generate video using a single reference image.&lt;/p&gt;

&lt;p&gt;The workflow is available on the same &lt;a href="https://docs.comfy.org/tutorials/video/minimax/minimax-h3" rel="noopener noreferrer"&gt;official workflow&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;Structure your prompt by shot (SHOT 1–3), then click "▷Queue" to start generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video generated with I2V:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/d8H06Pf2o10"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Errors and Fixes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MiniMax H3 nodes don't show up in ComfyUI&lt;/strong&gt;&lt;br&gt;
Your ComfyUI version is older than 0.30.0. Update to the latest version. Note that Desktop and Cloud versions track stable releases, so the update may lag behind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Running out of VRAM / high memory usage&lt;/strong&gt;&lt;br&gt;
Use pruned int8 instead of bf16 for the diffusion model, and nvfp4 AWQ for the text encoder. If it's still tight, lower the megapixel count in the Resolution Selector or shorten the duration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generation fails at low resolutions like 256p&lt;/strong&gt;&lt;br&gt;
MiniMax H3's minimum resolution is 384p. Anything at or below 256p will fail — pick from the resolution presets in the template instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No audio in the output video&lt;/strong&gt;&lt;br&gt;
Check that both &lt;code&gt;minimax_h3_video_vae_fp16.safetensors&lt;/code&gt; (video) and &lt;code&gt;minimax_h3_audio_vae_fp32.safetensors&lt;/code&gt; (audio) are loaded, and that the &lt;code&gt;VAEDecodeAudio&lt;/code&gt; node is connected to the &lt;code&gt;SaveVideo&lt;/code&gt; node.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not sure which checkpoint to use for I2V&lt;/strong&gt;&lt;br&gt;
Use the FL2VA family for T2V and I2V (including start/end frame specification), and the Ref2VA family for reference-driven R2V. These are separate weights — the workflow won't function correctly if you mix them up.&lt;/p&gt;

&lt;h2&gt;
  
  
  MiniMax H3 Licensing and Commercial Use
&lt;/h2&gt;

&lt;p&gt;MiniMax H3 is released under a custom license called the "MiniMax H3 Community License."&lt;/p&gt;

&lt;p&gt;The main terms confirmed at the time of writing are as follows:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Applicable Territory&lt;/td&gt;
&lt;td&gt;Available worldwide, except for "Excluded Territories": the EU, UK, South Korea, and the US&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Japan&lt;/td&gt;
&lt;td&gt;Not listed as an Excluded Territory. Under the current license, both use and commercial use within Japan appear to be within scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commercial use&lt;/td&gt;
&lt;td&gt;Permitted free of charge, but the "MiniMax H3" attribution must be displayed in the commercial product's UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revenue threshold&lt;/td&gt;
&lt;td&gt;If annual revenue exceeds $20 million, separate written permission from MiniMax is required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other&lt;/td&gt;
&lt;td&gt;Using outputs to improve other AI models (e.g. distillation) is prohibited. Redistribution requires marking modified files and including a NOTICE file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governing law&lt;/td&gt;
&lt;td&gt;Hong Kong SAR law&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;(Information as of August 2026.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This regional-restriction clause has been a talking point on overseas technical blogs covering MiniMax H3.&lt;br&gt;
If you're planning to integrate it into a commercial service, check the original license text (the &lt;a href="https://huggingface.co/MiniMaxAI/MiniMax-H3/blob/main/LICENSE" rel="noopener noreferrer"&gt;LICENSE file on Hugging Face&lt;/a&gt;) with your legal team before making a decision.&lt;/p&gt;

&lt;p&gt;Nothing in this article constitutes legal advice.&lt;/p&gt;

&lt;p&gt;MiniMax H3/LICENSE: &lt;a href="https://huggingface.co/MiniMaxAI/MiniMax-H3/blob/main/LICENSE" rel="noopener noreferrer"&gt;https://huggingface.co/MiniMaxAI/MiniMax-H3/blob/main/LICENSE&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;This covered how to use MiniMax H3, the latest release in open video generation models.&lt;/p&gt;

&lt;p&gt;It's one of the most capable open-weight video generation models currently available, and it's well worth exploring while it's still fresh.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was edited with AI assistance.&lt;br&gt;
*Originally published in Japanese on &lt;a href="https://highreso.jp/edgehub/moviegenerationai/minimax-h3.html?utm_source=devto" rel="noopener noreferrer"&gt;EdgeHUB&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>comfyui</category>
      <category>ai</category>
      <category>videogeneration</category>
      <category>minimax</category>
    </item>
    <item>
      <title>I Reviewed 100 Reddit Threads About GPU Clouds. Price Was Only Part of the Story.</title>
      <dc:creator>GridPort</dc:creator>
      <pubDate>Tue, 04 Aug 2026 11:07:58 +0000</pubDate>
      <link>https://dev.to/highreso/i-reviewed-100-reddit-threads-about-gpu-clouds-price-was-only-part-of-the-story-n98</link>
      <guid>https://dev.to/highreso/i-reviewed-100-reddit-threads-about-gpu-clouds-price-was-only-part-of-the-story-n98</guid>
      <description>&lt;p&gt;When engineers compare GPU clouds, the conversation usually starts with three familiar numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPU model&lt;/li&gt;
&lt;li&gt;VRAM&lt;/li&gt;
&lt;li&gt;Hourly price&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those numbers matter.&lt;/p&gt;

&lt;p&gt;But they do not always tell us whether a workload will actually finish efficiently.&lt;/p&gt;

&lt;p&gt;A cheap GPU can become expensive when a failed job has to be repeated. A more powerful GPU can still produce a slower workflow when storage, system RAM, model loading, or data transfer becomes the bottleneck.&lt;/p&gt;

&lt;p&gt;To understand what engineers actually care about, we reviewed 100 unique Reddit threads about GPU infrastructure decisions published between January 2025 and July 2026.&lt;/p&gt;

&lt;p&gt;The discussions covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model training and fine-tuning&lt;/li&gt;
&lt;li&gt;LLM inference&lt;/li&gt;
&lt;li&gt;ComfyUI and image generation&lt;/li&gt;
&lt;li&gt;Private LLM deployments&lt;/li&gt;
&lt;li&gt;Managed APIs&lt;/li&gt;
&lt;li&gt;Rented GPU instances&lt;/li&gt;
&lt;li&gt;Local hardware&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most surprising result was this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Price was the primary pain point in 23 of the 100 threads. However, in 74 threads, cost was not the primary decision criterion.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Price was important, but it was only the beginning of the decision.&lt;/p&gt;

&lt;p&gt;Here are three patterns that stood out.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Cheapest GPU Can Produce an Expensive Workflow
&lt;/h2&gt;

&lt;p&gt;Hourly pricing is easy to compare.&lt;/p&gt;

&lt;p&gt;The cost of completing a workload is much harder.&lt;/p&gt;

&lt;p&gt;The real cost may also include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Failed runs&lt;/li&gt;
&lt;li&gt;Repeated environment setup&lt;/li&gt;
&lt;li&gt;Persistent storage&lt;/li&gt;
&lt;li&gt;Idle instances&lt;/li&gt;
&lt;li&gt;Data transfer&lt;/li&gt;
&lt;li&gt;Engineering time&lt;/li&gt;
&lt;li&gt;Troubleshooting and recovery work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In one discussion, a user tried multiple low-cost marketplace instances for a fine-tuning job.&lt;/p&gt;

&lt;p&gt;Crashes, failed downloads, and unusable environments consumed both time and budget without completing the intended work.&lt;/p&gt;

&lt;p&gt;Other users described the opposite decision. They continued paying more for a managed platform because its templates and simpler setup saved enough time to justify the higher hourly rate.&lt;/p&gt;

&lt;p&gt;The relevant unit is therefore not always the GPU hour.&lt;/p&gt;

&lt;p&gt;It may be the &lt;strong&gt;completed workload&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A Faster GPU Does Not Guarantee a Faster Workflow
&lt;/h2&gt;

&lt;p&gt;A workload does not run on a GPU specification alone.&lt;/p&gt;

&lt;p&gt;It runs on a complete system.&lt;/p&gt;

&lt;p&gt;In one discussion, a cloud RTX 5090 produced a slower end-to-end image-generation workflow than a local RTX 5070 Ti.&lt;/p&gt;

&lt;p&gt;The cloud GPU was more powerful, but several models had to be loaded repeatedly during the workflow.&lt;/p&gt;

&lt;p&gt;Other discussions showed that having enough VRAM did not always mean that a workload would run successfully.&lt;/p&gt;

&lt;p&gt;Performance and compatibility could also depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System RAM&lt;/li&gt;
&lt;li&gt;Storage throughput&lt;/li&gt;
&lt;li&gt;Model-loading behavior&lt;/li&gt;
&lt;li&gt;Network transfer&lt;/li&gt;
&lt;li&gt;CPU performance&lt;/li&gt;
&lt;li&gt;Container restrictions&lt;/li&gt;
&lt;li&gt;Regional host configuration&lt;/li&gt;
&lt;li&gt;Software compatibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best GPU on paper is not necessarily the best environment for the actual job.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Engineers Choose Environments, Not Just GPUs
&lt;/h2&gt;

&lt;p&gt;GPU clouds are also working environments.&lt;/p&gt;

&lt;p&gt;They must be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configured&lt;/li&gt;
&lt;li&gt;Stopped&lt;/li&gt;
&lt;li&gt;Restarted&lt;/li&gt;
&lt;li&gt;Preserved&lt;/li&gt;
&lt;li&gt;Monitored&lt;/li&gt;
&lt;li&gt;Reproduced&lt;/li&gt;
&lt;li&gt;Recovered&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One developer described repeatedly spending around 30 minutes comparing providers, connecting through SSH, and installing tools before testing a model.&lt;/p&gt;

&lt;p&gt;Forgotten instances also created billing risk.&lt;/p&gt;

&lt;p&gt;Another user destroyed instances after every session to avoid ongoing storage charges. However, destroying the instance also removed the configured environment, creating additional work to preserve and restore progress.&lt;/p&gt;

&lt;p&gt;This is why operational questions often become important:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can compute stop without deleting the workspace?&lt;/li&gt;
&lt;li&gt;Are storage charges easy to understand?&lt;/li&gt;
&lt;li&gt;Can checkpoints survive a restart?&lt;/li&gt;
&lt;li&gt;Can the environment be reproduced?&lt;/li&gt;
&lt;li&gt;Can a failed job resume?&lt;/li&gt;
&lt;li&gt;Can instances terminate automatically?&lt;/li&gt;
&lt;li&gt;How much setup is required for each session?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A platform does not need to eliminate all operational work.&lt;/p&gt;

&lt;p&gt;The important question is whether that work matches the team’s skills, time, and operating model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four Types of Fit
&lt;/h2&gt;

&lt;p&gt;The discussions became easier to understand when we grouped GPU infrastructure decisions into four types of fit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Economic Fit
&lt;/h3&gt;

&lt;p&gt;Does the total cost match the usage pattern?&lt;/p&gt;

&lt;p&gt;This includes compute, storage, idle time, failed runs, setup, and recovery work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workload Fit
&lt;/h3&gt;

&lt;p&gt;Can the complete workload run effectively?&lt;/p&gt;

&lt;p&gt;This includes the GPU, VRAM, system RAM, storage, network, interconnects, and software environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operational Fit
&lt;/h3&gt;

&lt;p&gt;Can the user operate and restore the environment?&lt;/p&gt;

&lt;p&gt;This includes setup, billing visibility, stop-and-restart behavior, checkpoints, automation, and reproducibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Risk Fit
&lt;/h3&gt;

&lt;p&gt;Are the remaining risks acceptable?&lt;/p&gt;

&lt;p&gt;This includes reliability, capacity availability, data handling, region, vendor lock-in, support, and runtime control.&lt;/p&gt;

&lt;p&gt;A provider can look attractive on one dimension and still be a poor fit on another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Questions to Ask Before Comparing Providers
&lt;/h2&gt;

&lt;p&gt;Before opening a GPU pricing table, it may help to answer three questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  What must work?
&lt;/h3&gt;

&lt;p&gt;Define the complete workload, not only the GPU.&lt;/p&gt;

&lt;p&gt;Include system memory, storage, software, data transfer, latency, concurrency, and scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  What must survive?
&lt;/h3&gt;

&lt;p&gt;Decide which datasets, checkpoints, models, containers, and configured environments must remain recoverable after compute stops or a host disappears.&lt;/p&gt;

&lt;h3&gt;
  
  
  What must never happen?
&lt;/h3&gt;

&lt;p&gt;Identify the unacceptable outcome.&lt;/p&gt;

&lt;p&gt;That might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runaway cost&lt;/li&gt;
&lt;li&gt;Lost training progress&lt;/li&gt;
&lt;li&gt;Unavailable capacity&lt;/li&gt;
&lt;li&gt;Data exposure&lt;/li&gt;
&lt;li&gt;Vendor lock-in&lt;/li&gt;
&lt;li&gt;Insufficient runtime control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions will not identify one universal winner.&lt;/p&gt;

&lt;p&gt;They will identify the trade-offs that actually matter for the workload.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Main Takeaway
&lt;/h2&gt;

&lt;p&gt;The 100 discussions did not point to one best GPU cloud.&lt;/p&gt;

&lt;p&gt;They showed that AI engineers are not simply selecting a machine.&lt;/p&gt;

&lt;p&gt;They are choosing a combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost&lt;/li&gt;
&lt;li&gt;Workload capability&lt;/li&gt;
&lt;li&gt;Operational burden&lt;/li&gt;
&lt;li&gt;Risk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The better question may therefore be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which environment lets me finish this workload at a cost, operational burden, and level of risk I can accept?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What matters most in your own GPU infrastructure decisions after hourly price?&lt;/p&gt;

&lt;p&gt;Storage, availability, setup time, system RAM, stop-and-restart behavior, privacy—or something else?&lt;/p&gt;




&lt;p&gt;This article is a condensed adaptation of our full research report, which includes the research methodology and representative source discussions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lp-soroban.highreso.jp/compute-cluster/blog/gpu-cloud-research-001.html?utm_source=devto" rel="noopener noreferrer"&gt;https://lp-soroban.highreso.jp/compute-cluster/blog/gpu-cloud-research-001.html?utm_source=devto&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was edited with AI assistance. The research data, analysis, examples, and conclusions were reviewed by the author.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gpu</category>
      <category>cloud</category>
      <category>mlops</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
