Agent skill

Graz

by graz-sh in graz-sh/graz

React hooks for Cosmos blockchain interactions — connect wallets, query balances, send tokens, sign messages.

MITAuto-check passedFrontend & Design

Install Graz

skills CLI
$ npx skills add graz-sh/graz --skill graz -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install graz-sh/graz graz --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/graz-sh/graz.git skills-src && mkdir -p .claude/skills && cp -r skills-src/docs/static .claude/skills/graz && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
graz
GitHub stars
123
Token cost
~4.2k tokens
SKILL.md length
282 words
Files
12
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

React hooks for Cosmos blockchain interactions — connect wallets, query balances, send tokens, sign messages.

  • Building Cosmos dApps with graz hooks
  • SKILL.md covers Quick start, Provider Setup, Configure Options and Chain Info, plus 10 more sections
  • Calls pnpm
  • Setting up GrazProvider

What it does

Graz is an agent skill from graz-sh/graz. React hooks for Cosmos blockchain interactions — connect wallets, query balances, send tokens, sign messages. Use when building Cosmos dApps with graz hooks, setting up GrazProvider, connecting wallets, or performing transactions.

Its SKILL.md is about 4.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 12 other files.

It sits in Frontend & Design, covering React components and Smart contracts. It works with React. The repository describes itself as: React hooks for Cosmos 🪐. The licence is MIT.

When your agent uses it

  • Building Cosmos dApps with graz hooks
  • Setting up GrazProvider
  • Connecting wallets
  • Performing transactions

Example prompts

  • “/graz”

What it can do on your machine

Read from SKILL.md and the folder at commit 48d3372. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • pnpm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Graz loads about 4.2k tokens when it runs. Until then it costs about 59 tokens; SKILL.md has 282 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~59
When it runs · the whole SKILL.md, loaded when a task matches
~4.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from graz-sh/graz at commit 48d3372, republished under its MIT licence (© graz-sh). 282 words, ~4,202 tokens.

Download SKILL.mdSave it as .claude/skills/graz/SKILL.md (or your agent's skills folder). This skill also uses 11 other files; get the full folder from GitHub.
name
graz
description
React hooks for Cosmos blockchain interactions — connect wallets, query balances, send tokens, sign messages. Use when building Cosmos dApps with graz hooks, setting up GrazProvider, connecting wallets, or performing transactions.

Using the graz Library

React hooks for Cosmos blockchain interactions.

Quick start

tsx
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { GrazProvider, useConnect, useAccount, useSendTokens, useStargateSigningClient } from "graz";
import { cosmoshub } from "graz/chains";

const queryClient = new QueryClient();
export function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <GrazProvider grazOptions={{ chains: [cosmoshub] }}>
        <Wallet />
      </GrazProvider>
    </QueryClientProvider>
  );
}

function Wallet() {
  const { connect } = useConnect();
  const { data: accounts, isConnected } = useAccount({ chainId: ["cosmoshub-4"] as const });
  const { data: signingClients } = useStargateSigningClient({ chainId: ["cosmoshub-4"] as const, enabled: isConnected });
  const { sendTokens } = useSendTokens();
  const addr = accounts?.["cosmoshub-4"]?.bech32Address;
  return (
    <button onClick={async () => {
      if (!addr) return connect();
      await sendTokens({ signingClient: signingClients?.["cosmoshub-4"], senderAddress: addr, recipientAddress: "cosmos1...", amount: [{ denom: "uatom", amount: "1000" }], fee: { amount: [{ denom: "uatom", amount: "500" }], gas: "200000" } });
    }}>{addr || "Connect"}</button>
  );
}

Provider Setup

tsx
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { GrazProvider } from "graz";
import { cosmoshub } from "graz/chains";

const queryClient = new QueryClient();

function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <GrazProvider grazOptions={{ chains: [cosmoshub] }}>
        <YourApp />
      </GrazProvider>
    </QueryClientProvider>
  );
}

GrazProvider must be inside QueryClientProvider. The chains prop is required — pass ChainInfo[] (from graz/chains, defineChainInfo(), or manually).

Configure Options

ts
interface ConfigureGrazArgs {
  chains: ChainInfo[];
  defaultWallet?: WalletType;           // Default: Keplr
  chainsConfig?: Record<string, ChainConfig>;  // Per-chain: { rpcHeaders, gas: { price, denom } }
  autoReconnect?: boolean;              // Default: true
  walletConnect?: {                     // WalletConnect config
    options: { projectId: string };
    modalOptions?: ModalConfig;
  };
  walletDefaultOptions?: Keplr["defaultOptions"];
  multiChainFetchConcurrency?: number;  // Default: 3
  onNotFound?: () => void;
  onReconnectFailed?: () => void;
  iframeOptions?: IframeOptions;        // Cosmiframe config
  pingInteval?: number;                 // MS between pings, default: 1hr
  logger?: { enabled?: boolean; level?: LogLevel; categories?: (keyof typeof LogCategory)[] };
  paraConfig?: ParaGrazConfig;          // Para wallet config
}

Chain Info

ts
import { defineChainInfo, defineChains } from "graz";

// Type-safe helpers (identity functions)
const myChain = defineChainInfo({
  chainId: "mychain-1",
  currencies: [{ coinDenom: "TOKEN", coinMinimalDenom: "utoken", coinDecimals: 6 }],
  rpc: "https://rpc.example.com",
  rest: "https://rest.example.com",
  bech32Config: {
    bech32PrefixAccAddr: "mychain",
    bech32PrefixAccPub: "mychainpub",
    bech32PrefixValAddr: "mychainvaloper",
    bech32PrefixValPub: "mychainvaloperpub",
    bech32PrefixConsAddr: "mychainvalcons",
    bech32PrefixConsPub: "mychainvalconspub",
  },
  chainName: "My Chain",
  feeCurrencies: [{ coinDenom: "TOKEN", coinMinimalDenom: "utoken", coinDecimals: 6 }],
  stakeCurrency: { coinDenom: "TOKEN", coinMinimalDenom: "utoken", coinDecimals: 6 },
  bip44: { coinType: 118 },
});

defineChains({ cosmoshub, osmosis }); // Wraps Record<string, ChainInfo> for type safety
CLI Generate
bash
pnpm graz cli --generate                  # Generate all chains
pnpm graz cli --generate --mainnet cosmoshub,osmosis --testnet osmosistestnet
pnpm graz cli --generate --endpoint <url> # Custom registry endpoint
pnpm graz cli --generate --best           # Use lowest-latency endpoints
pnpm graz cli --generate --authz          # Authz-compatible chains only

Output goes to packages/graz/chains/index.{js,mjs,ts} (gitignored).

ts
import { cosmoshub, osmosis, mainnetChains, testnetChains } from "graz/chains";

Wallet Connection

Connect
ts
import { useConnect, useAccount, useDisconnect, useActiveWalletType, useCheckWallet } from "graz";
import { WalletType } from "graz";

// Mutation hook
const { connect, connectAsync, isLoading, isSuccess, isSupported, error } = useConnect();

connect();                                                  // Default wallet
connect({ walletType: WalletType.KEPLR });                  // Specific wallet
connect({ chainId: ["cosmoshub-4", "osmosis-1"] });        // Specific chains
connect({ walletType: WalletType.LEAP, chainId: ["cosmoshub-4"] });
connect({ autoReconnect: false });

// Actions (no hook)
import { connect, disconnect, getAvailableWallets, checkWallet, clearSession } from "graz";
await connect({ walletType: WalletType.KEPLR });
Reactive Account State
ts
// Single chain (generic Record)
const { data: accounts, isConnected, isConnecting, isDisconnected, status, reconnect } = useAccount();
const address = Object.values(accounts || {})[0]?.bech32Address;

// Multi-chain with typed chain IDs (use `as const`)
const { data: accounts } = useAccount({ chainId: ["cosmoshub-4", "osmosis-1"] as const });
// accounts?.["cosmoshub-4"] is Key | undefined — fully typed
// accounts?.["osmosis-1"] is Key | undefined
const atomAddress = accounts?.["cosmoshub-4"]?.bech32Address;
Check Wallet Availability
ts
// Reactive hook
const { data: isKeplrAvailable } = useCheckWallet(WalletType.KEPLR);
const { data: isCosmostationAvailable } = useCheckWallet(WalletType.COSMOSTATION);

// Imperative
const available = getAvailableWallets();  // Record<WalletType, boolean>
const supported = checkWallet();          // Default wallet
const cosmostationSupported = checkWallet(WalletType.COSMOSTATION);

// Active wallet info
const { walletType, isKeplr, isCosmostation, isWalletConnect } = useActiveWalletType();
Disconnect
ts
const { disconnect, disconnectAsync, isLoading } = useDisconnect();

disconnect();                              // All chains
disconnect({ chainId: ["cosmoshub-4"] });  // Specific chain only

// Actions
import { clearSession } from "graz";
clearSession();                            // Reset session + clear storage
Wallet Events

Use useWalletEvents to react to committed wallet state changes. The hook owns its subscription and automatically cleans it up when the component unmounts.

tsx
import { useWalletEvents } from "graz";

function WalletEventObserver() {
  useWalletEvents({
    onAccountChange: ({ accounts, previousAccounts, changedChainIds, walletType }) => {
      console.log({ accounts, previousAccounts, changedChainIds, walletType });
    },
    onActiveChainsChange: ({ activeChainIds, previousActiveChainIds, walletType }) => {
      console.log({ activeChainIds, previousActiveChainIds, walletType });
    },
    onDisconnect: ({ chainIds, reason, walletType }) => {
      console.log({ chainIds, reason, walletType });
    },
  });

  return null;
}

onActiveChainsChange reports the complete set of connected activeChainIds. It does not represent an EVM-style switch to one active chain. Initial connection does not emit account or active-chain events.

For non-React consumers, subscribe imperatively and retain the cleanup function:

ts
import { subscribeWalletEvents } from "graz";

const unsubscribe = subscribeWalletEvents({
  onDisconnect: ({ reason }) => console.log(reason),
});

unsubscribe();

Balance changes are not wallet events. Use useBalance or useBalances and an explicit refetch strategy when balance monitoring is required.

Offline Signers

ts
const { data: signers } = useOfflineSigners();
const { data: signers } = useOfflineSigners({ chainId: ["cosmoshub-4"] as const });

// signers?.["cosmoshub-4"] is OfflineSigners
const { offlineSigner, offlineSignerAmino, offlineSignerAuto } = signers?.["cosmoshub-4"] || {};

// Imperative
import { getOfflineSigners } from "graz";
const signers = await getOfflineSigners({ chainId: "cosmoshub-4", walletType: WalletType.KEPLR });

Balance Queries

ts
// All balances
const { data: balances } = useBalances({
  chainId: "cosmoshub-4",
  bech32Address: "cosmos1...",
  enabled: Boolean(address),
});
// balances is Coin[] | undefined

// Single denom
const { data: atomBalance } = useBalance({
  chainId: "cosmoshub-4",
  bech32Address: "cosmos1...",
  denom: "uatom",
  enabled: Boolean(address),
});
// atomBalance is Coin | undefined

// Staked balance
const { data: staked } = useBalanceStaked({
  chainId: "cosmoshub-4",
  bech32Address: "cosmos1...",
  enabled: Boolean(address),
});

Clients

Read Clients
ts
const { data: stargateClients } = useStargateClient({
  chainId: ["cosmoshub-4"] as const,
  enabled: Boolean(connected),
});
// stargateClients?.["cosmoshub-4"] is StargateClient | undefined

const { data: cosmwasmClients } = useCosmWasmClient({
  chainId: ["neutron-1"] as const,
  enabled: Boolean(connected),
});
Signing Clients (requires wallet connected)
ts
const { data: signingClients, isLoading } = useStargateSigningClient({
  chainId: ["cosmoshub-4"] as const,
  enabled: isConnected,
  offlineSigner: "offlineSignerAuto",  // "offlineSigner" | "offlineSignerAuto" | "offlineSignerOnlyAmino"
});

const { data: cosmwasmSigningClients } = useCosmWasmSigningClient({
  chainId: ["neutron-1"] as const,
  enabled: isConnected,
});

// Use client
await signingClients?.["cosmoshub-4"]?.sendTokens(
  senderAddress,
  recipientAddress,
  [{ denom: "uatom", amount: "1000" }],
  { amount: [{ denom: "uatom", amount: "500" }], gas: "200000" }
);

Transaction Hooks

ts
// Send tokens
const { sendTokens, sendTokensAsync, isPending, isSuccess, isError, data, reset } = useSendTokens();

sendTokens({
  signingClient: signingClients?.["cosmoshub-4"],
  senderAddress: account?.bech32Address,
  recipientAddress: "cosmos1...",
  amount: [{ denom: "uatom", amount: "1000" }],
  fee: { amount: [{ denom: "uatom", amount: "500" }], gas: "200000" },
  memo: "optional memo",
});

// IBC transfer
const { sendIbcTokens } = useSendIbcTokens();

sendIbcTokens({
  signingClient,
  senderAddress,
  recipientAddress: "osmo1...",
  transferAmount: { denom: "uatom", amount: "1000" },
  sourcePort: "transfer",
  sourceChannel: "channel-0",
  timeoutTimestamp: (Date.now() + 600_000) * 1_000_000, // 10 min in nanos
  fee: { amount: [{ denom: "uatom", amount: "500" }], gas: "200000" },
});

// Execute smart contract
const { executeContract } = useExecuteContract();

executeContract({
  signingClient,
  senderAddress: account?.bech32Address,
  contractAddress: "cosmos1contract...",
  msg: { transfer: { recipient: "cosmos1...", amount: "100" } },
  fee: { amount: [{ denom: "uatom", amount: "500" }], gas: "300000" },
  funds: [{ denom: "uatom", amount: "100" }],
});

// Instantiate contract
const { instantiateContract } = useInstantiateContract();

instantiateContract({
  codeId: 1,
  signingClient,
  senderAddress: account?.bech32Address,
  msg: { name: "My Contract", symbol: "MYC" },
  label: "my-contract",
  fee: { amount: [{ denom: "uatom", amount: "5000" }], gas: "500000" },
});

// Query smart contract
const { data: queryResult } = useQuerySmart({
  address: "cosmos1contract...",
  queryMsg: { get_info: {} },
});

Chain Management

ts
// Suggest chain to wallet (no auto-connect)
const { suggest } = useSuggestChain();
await suggest({ chainInfo: cosmoshub, walletType: WalletType.KEPLR });

// Suggest + auto-connect
const { suggestAndConnect } = useSuggestChainAndConnect();
await suggestAndConnect({ chainInfo: osmosistestnet });

// Add chain (add to GrazProvider config at runtime)
const { addChain } = useAddChain();
await addChain({ chainInfo: myNewChain });

// Chain info hooks
const { data: chainInfo } = useChainInfo({ chainId: "cosmoshub-4" }); // Single
const { data: chainInfos } = useChainInfos({ chainId: ["cosmoshub-4", "osmosis-1"] }); // Filtered
const { data: activeChains } = useActiveChains(); // Currently connected
const { data: activeChainIds } = useActiveChainIds(); // Connected chain IDs

// Recent chains
const { data: recentChainIds, clear: clearRecentIds } = useRecentChainIds();
const { data: recentChains, clear: clearRecentChains } = useRecentChains();

// Actions
import { addChain, suggestChain, suggestChainAndConnect, getChainInfo, getChainInfos } from "graz";

Multi-Chain API Pattern

All hooks that accept chainId support three overloads:

ts
// 1. No chainId — returns generic Record<string, T>
useAccount();                              // Record<string, Key | undefined>

// 2. Single element tuple — typed Record with one key
useAccount({ chainId: ["cosmoshub-4"] as const });  // ChainIdToRecord<["cosmoshub-4"], Key | undefined>

// 3. Multi-element tuple — typed Record with multiple keys
useAccount({ chainId: ["cosmoshub-4", "osmosis-1"] as const });  // ChainIdToRecord<["cosmoshub-4", "osmosis-1"], Key | undefined>

This applies to: useAccount, useOfflineSigners, useStargateClient, useCosmWasmClient, useStargateSigningClient, useCosmWasmSigningClient.

The UseMultiChainQueryResult<TChainIds, TData> return type gives you:

ts
TypeUseMultiChainQueryResult<TChainIds, TData> = UseQueryResult<
  TChainIds extends readonly string[] ? ChainIdToRecord<TChainIds, TData> : Record<string, TData>
>;

Logger

ts
import { LOG_CATEGORIES, LOG_FUNCTIONS, LOG_HOOKS, LogLevel, LogCategory } from "graz";

// In GrazProvider
<GrazProvider grazOptions={{
  chains: [...],
  logger: {
    enabled: true,
    level: LogLevel.DEBUG,
    categories: ["WALLET", "TRANSACTION"],
  },
}}/>;

Key Types

ts
import { WalletType, Key, Wallet, OfflineSigners, ConnectResult, UseMultiChainQueryResult, ChainConfig } from "graz";

// WalletType — enum for all supported wallets
WalletType.KEPLR, WalletType.COSMOSTATION,
WalletType.VECTIS, WalletType.WALLETCONNECT, WalletType.OKX,
WalletType.PARA, WalletType.INITIA, WalletType.CACTUSCOSMOS,
WalletType.COMPASS, WalletType.STATION, WalletType.XDEFI,
WalletType.COSMIFRAME, WalletType.METAMASK_SNAP_COSMOS,
WalletType.WC_KEPLR_MOBILE,
WalletType.WC_COSMOSTATION_MOBILE, WalletType.WC_CLOT_MOBILE

// Key — wallet account key
interface Key {
  name: string;
  algo: string;
  pubKey: Uint8Array;
  address: Uint8Array;
  bech32Address: string;
  isNanoLedger: boolean;
}

// OfflineSigners
interface OfflineSigners {
  offlineSigner: OfflineSigner;
  offlineSignerAmino: OfflineSignerAmino;
  offlineSignerAuto: OfflineSigner;
}

// Query config
interface QueryConfig { enabled?: boolean; }
interface MutationEventArgs<T = unknown, S = T> {
  onError?: (error: unknown, data: T) => unknown;
  onLoading?: (data: T) => unknown;
  onSuccess?: (data: S) => unknown;
}

Quick Reference

TaskHook/Action
Connect walletuseConnect() → connect()
DisconnectuseDisconnect() → disconnect()
Account stateuseAccount({ chainId })
Wallet eventsuseWalletEvents(handlers), subscribeWalletEvents(handlers)
Check wallet availabilityuseCheckWallet(type), getAvailableWallets()
Active wallet infouseActiveWalletType()
Offline signersuseOfflineSigners({ chainId })
Read clientuseStargateClient({ chainId }), useCosmWasmClient({ chainId })
Signing clientuseStargateSigningClient({ chainId }), useCosmWasmSigningClient({ chainId })
BalancesuseBalances({ chainId, bech32Address })
Single balanceuseBalance({ chainId, bech32Address, denom })
Staked balanceuseBalanceStaked({ chainId, bech32Address })
Send tokensuseSendTokens()
IBC transferuseSendIbcTokens()
Execute contractuseExecuteContract()
Instantiate contractuseInstantiateContract()
Query contractuseQuerySmart({ address, queryMsg })
Query rawuseQueryRaw({ address, key })
Suggest chainuseSuggestChain(), useSuggestChainAndConnect()
Add chainuseAddChain()
Chain infouseChainInfo({ chainId }), useChainInfos({ chainId })
Active chainsuseActiveChains(), useActiveChainIds()
ValidatorsuseQueryClientValidators({ queryClient })

© graz-sh, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 11 other files in docs/static of graz-sh/graz.

  • SKILL.md
  • .nojekyll
  • CNAME
  • img/background.jpg
  • img/banner.jpg
  • img/favicon.ico
  • img/graz-cli.gif
  • img/graz.png
  • img/graz.svg
  • img/grid.png
  • img/logo.png
  • img/social.png

Open the folder on GitHubat commit 48d3372

Compare with similar skills

Graz next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Graz compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Graz this skillgraz-sh/graz123—~4.2kAutomated safety check: PassMIT
South Admin CRUD Generatorsouthliu/south-admin-react580—~1.7kAutomated safety check: PassMIT
Clerk React Patternsgeekskai/blog1031 repos~1kAutomated safety check: NotesMIT
NEAR dApp Builderinternet-court/internet-court-skill6.5k1 repos~684Automated safety check: PassCustom licence
Vechain Kitvechain/x-app-template450—~1.4kAutomated safety check: PassMIT
React Emailaiskillstore/marketplace4301 repos~3.6kAutomated safety check: PassMIT

Similar skills

  • South Admin CRUD Generator

    southliu/south-admin-react

    Generates a full CRUD page - page component, data model and API client - from the south-admin-react project's own VS Code snippet templates.

    580 GitHub stars~1.7k tokensUpdated 19 days ago
    Frontend & DesignAuto-check passed
  • React SPA auth patterns with @clerk/react for Vite/CRA - ClerkProvider setup, useAuth/useUser/useClerk hooks, React Router protected routes, custom sign-in flows.

    103 GitHub starsUsed in 1 repo~1k tokens
    Frontend & DesignAuto-check: notes
  • NEAR dApp Builder

    internet-court/internet-court-skill

    Scaffolds new NEAR dApps with create-near-app or adds NEAR wallet sign-in, contract calls and transaction signing to an existing React or plain JavaScript app.

    6.5k GitHub starsUsed in 1 repo~684 tokens
    Frontend & DesignAuto-check passed
  • Vechain Kit

    vechain/x-app-template

    VeChain Kit and dapp-kit packages — installation, hooks, components, wallet connection, social login, smart accounts, theming, and Privy setup.

    450 GitHub stars~1.4k tokensUpdated 2 mo ago
    Frontend & DesignAuto-check passed
  • React Email

    aiskillstore/marketplace

    A skill your agent uses when building HTML email templates with React components, adding a visual email editor to an application using the React Email visual editor, rendering emails to HTML, or…

    430 GitHub starsUsed in 1 repo~3.6k tokens
    Frontend & DesignAuto-check passed
  • React Useeffect

    viclafouch/meme-studio

    Audit React components for unnecessary useEffect hooks. An agent skill from viclafouch/meme-studio.

    110 GitHub stars~375 tokensUpdated 6 mo ago
    Frontend & DesignAuto-check passed

Works with

Questions about Graz

What does Graz do?

React hooks for Cosmos blockchain interactions — connect wallets, query balances, send tokens, sign messages. Graz is an agent skill from graz-sh/graz. React hooks for Cosmos blockchain interactions — connect wallets, query balances, send tokens, sign messages.

When should I use Graz?

Graz fits situations like: building Cosmos dApps with graz hooks; setting up GrazProvider; connecting wallets; performing transactions.

How do I install Graz in Claude Code?

Run `npx skills add graz-sh/graz --skill graz -a claude-code`. Or copy the skill folder (docs/static in graz-sh/graz) into .claude/skills/graz in your project. Claude Code loads it when a task matches its description.

How do I install Graz in Codex?

Run `npx skills add graz-sh/graz --skill graz -a codex`. Or copy the skill folder (docs/static in graz-sh/graz) into .agents/skills/graz in your project. Codex loads it when a task matches its description.

Can I use Graz in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add graz-sh/graz --skill graz -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/graz, .gemini/skills/graz, .github/skills/graz and .opencode/skills/graz in your project.

What does Graz need to run?

Going by SKILL.md and its folder, Graz needs the command-line tools its instructions call (pnpm).

Does Graz access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Graz safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Graz use?

Graz is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Graz use?

About 4.2k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Graz?

Skills that share tags, products or a category with Graz: South Admin CRUD Generator (southliu/south-admin-react, 580 stars), Clerk React Patterns (geekskai/blog, 103 stars), NEAR dApp Builder (internet-court/internet-court-skill, 6.5k stars) and Vechain Kit (vechain/x-app-template, 450 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Graz?

graz-sh (a GitHub organization) maintains it in graz-sh/graz, which has 123 GitHub stars. The repository was last updated on September 17, 2026.

Source: graz-sh/graz on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.