{"id":50126005,"url":"https://github.com/radeksvarz/evm-rpc-picker","last_synced_at":"2026-05-23T20:01:03.136Z","repository":{"id":353691239,"uuid":"1220524931","full_name":"radeksvarz/evm-rpc-picker","owner":"radeksvarz","description":"A TUI tool to search for EVM chains, manage favorites securely, and select RPC URLs.","archived":false,"fork":false,"pushed_at":"2026-05-23T16:23:45.000Z","size":674,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-23T16:26:50.430Z","etag":null,"topics":["cli","evm","rpc","scripts","tui","web3"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/radeksvarz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-25T02:03:21.000Z","updated_at":"2026-05-23T16:23:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/radeksvarz/evm-rpc-picker","commit_stats":null,"previous_names":["radeksvarz/evm-erc-picker","radeksvarz/evm-rpc-picker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/radeksvarz/evm-rpc-picker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radeksvarz%2Fevm-rpc-picker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radeksvarz%2Fevm-rpc-picker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radeksvarz%2Fevm-rpc-picker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radeksvarz%2Fevm-rpc-picker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/radeksvarz","download_url":"https://codeload.github.com/radeksvarz/evm-rpc-picker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radeksvarz%2Fevm-rpc-picker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33410345,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T18:09:33.147Z","status":"ssl_error","status_checked_at":"2026-05-23T18:09:31.380Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","evm","rpc","scripts","tui","web3"],"created_at":"2026-05-23T20:00:34.471Z","updated_at":"2026-05-23T20:01:03.123Z","avatar_url":"https://github.com/radeksvarz.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# EVM RPC Picker\n\n![EVM RPC Picker Screenshot](https://raw.githubusercontent.com/radeksvarz/evm-rpc-picker/main/assets/screenshot.svg)\n\nA powerful TUI (Terminal User Interface) tool to search for EVM chains and manage your RPC URLs securely. It helps you quickly select and set the `ETH_RPC_URL` environment variable with the fastest available RPC, whether it's public, private, or project-specific.\n\n## Features\n\n-   **Instant Search**: Filter over 1000+ chains by name or Chain ID.\n-   **Latency Checks**: Real-time ping (using `eth_blockNumber`) to find the most responsive RPC.\n-   **Custom RPC Management**: Add, edit, and manage your own RPC endpoints for any chain.\n-   **Secure Storage**: Encrypt sensitive RPC URLs and store API keys securely in your system's **Keyring**.\n-   **Smart Context Detection**: Automatically detects networks and URLs defined in your `foundry.toml` or `hardhat.config.js`.\n-   **Favorites System**:\n    *   **Project Level**: Store favorites in `.rpc-picker.toml` within your repository.\n    *   **Global Level**: Store favorites in your global user config.\n    *   **Favorite RPCs**: Bookmark both public chains and your own custom RPCs to easily access and test them from a dedicated unified dashboard.\n-   **Filtering**: \n    *   Toggle between **Mainnet**, **Testnet**, or **All**.\n    *   Quickly filter to show only your **Favorite** chains.\n-   **Notes**: Attach notes to your custom RPCs — stored as plain text (public) or AES-encrypted and portable inside the config file (private, when password-protected).\n-   **Sensitive Mode**: Toggle `Ctrl + S` to instantly mask all sensitive URLs and notes for screen sharing or streaming. Also available via `--privacy` / `-p` CLI flag.\n\n## Installation\n\nEnsure you have [uv](https://github.com/astral-sh/uv) installed.\n\n```bash\n# Run directly without installation\nuvx evm-rpc-picker\n```\n\n## One-Off Command Execution\n\nIf you only want to select an RPC for a single command without modifying your current shell's `ETH_RPC_URL` environment variable, you can pass the output of `evm-rpc-picker` directly as a subshell argument:\n\n```bash\n# Run cast block-number with a freshly selected RPC\ncast block-number --rpc-url $(uvx evm-rpc-picker)\n```\n\n## Shell Integration\n\nAdd the following function to your `.bashrc` or `.zshrc` to easily export the selected RPC:\n\n```bash\npick-rpc() {\n    local rpc=$(uvx evm-rpc-picker)\n    [ -n \"$rpc\" ] \u0026\u0026 export ETH_RPC_URL=\"$rpc\"\n}\n```\n\nAfter restarting your shell, simply run `pick-rpc` to pick and export the RPC.\n\nSince `ETH_RPC_URL` is now exported to your environment, all Foundry commands (`cast`, `forge`) will automatically pick it up without requiring manual `--rpc-url` parameters:\n\n```bash\n# Query the current block number using cast\ncast block-number\n```\n\n## Python Usage\n\nYou can also use `evm-rpc-picker` as a module in your own Python scripts:\n\n```python\nfrom evm_rpc_picker import pick_rpc\n\n# This will open the TUI\nrpc_url = pick_rpc()\n\nif rpc_url:\n    print(f\"Selected RPC: {rpc_url}\")\n```\n\n## Keyboard Shortcuts\n\n### Main Screen\n| Key | Action |\n|-----|--------|\n| `Tab` | **Switch Focus** (Table ↔ Personal RPCs ↔ Env Status) |\n| `Enter` | **Select** highlighted chain to see RPCs |\n| `Ctrl + F` | **Filter Favorites** toggle |\n| `Ctrl + T` | **Filter Network Type** (All ↔ Mainnet ↔ Testnet) |\n| `Ctrl + L` | **Toggle Local Favorite** (Project level) |\n| `Ctrl + G` | **Toggle Global Favorite** (Global level) |\n| `Ctrl + R` | **Refresh** chain data from network |\n| `Ctrl + E` | **Use Current ETH_RPC_URL** (select current ENV and exit) |\n| `Ctrl + U` | **Personal RPC URLs** (manage and select custom endpoints) |\n| `Ctrl + B` | **Favorite RPCs** (view all bookmarked public and custom endpoints) |\n| `Ctrl + S` | **Toggle Sensitive Mode** (mask all URLs and notes for screen sharing) |\n\n### Chainlist.org chain's RPC Selection Screen\n| Key | Action |\n|-----|--------|\n| `Enter` | **Select** RPC and exit |\n| `Esc` | **Back** to main screen |\n| `Ctrl + R` | **Refresh** latencies |\n| `Ctrl + L` | **Toggle Local Favorite** (Project level) |\n| `Ctrl + G` | **Toggle Global Favorite** (Global level) |\n\n### Personal RPC URLs Screen\n| Key | Action |\n|-----|--------|\n| `Enter` | **Select** RPC and exit |\n| `Esc` | **Back** to main screen |\n| `a` | **Add** custom RPC |\n| `e` | **Edit** highlighted RPC |\n| `Delete` | **Delete** highlighted RPC |\n| `Ctrl + V` | **Paste \u0026 Add** (paste URL from clipboard into Add RPC modal) |\n| `Ctrl + B` | **Toggle Favorite** (bookmark/unbookmark the selected custom RPC) |\n\n### Favorite RPCs Screen\n| Key | Action |\n|-----|--------|\n| `Enter` | **Select** RPC and exit |\n| `Esc` | **Back** to main screen |\n| `Ctrl + R` | **Refresh** latencies |\n| `Ctrl + L` | **Toggle Local Favorite** (Project level) |\n| `Ctrl + G` | **Toggle Global Favorite** (Global level) |\n\n### Add/Edit Custom RPC Modal\n| Key | Action |\n|-----|--------|\n| `Ctrl + S` | **Save** changes (when editing) |\n| `Ctrl + G` | **Add Globally** (when adding) |\n| `Ctrl + L` | **Add Locally** (when adding) |\n| `Esc` | **Cancel** |\n\n## Sensitive Mode (Streamer / Over-Shoulder Protection)\n\nSensitive Mode lets you instantly hide all sensitive RPC URLs and notes without closing the application — useful when sharing your screen, streaming, or recording.\n\n### Activation\n\n| Method | Command |\n|--------|---------|\n| **Runtime toggle** | `Ctrl + S` on the main screen |\n| **CLI flag** | `evm-rpc-picker --privacy` or `evm-rpc-picker -p` |\n\n### What gets masked\n\n| Element | Normal display | Sensitive Mode |\n|---------|---------------|----------------|\n| URL with API key | `https://mainnet.infura.io/v3/mykey` | `https://mainnet.infura.io/••••••••` |\n| URL with credentials | `https://user:pass@rpc.example.com/key` | `https://••••••••@rpc.example.com/••••••••` |\n| RPC note | `my personal note` | `••••••••` |\n\nThe **host/domain** remains visible so you can still identify the provider. When Sensitive Mode is active, the header subtitle changes to **`[🙈] Sensitive Mode`** (displayed in red).\n\n\u003e **Note**: Sensitive Mode is display-only. Selecting an RPC still returns the real URL to the shell.\n\n## Configuration\n\n-   **Global Config**: `~/.config/evm-rpc-picker/config.toml`\n-   **Project Config**: `.rpc-picker.toml` in your project root.\n-   **Cache**: Data from `chainlist.org` is cached for 24 hours in `~/.cache/evm-rpc-picker/chains.json`.\n\n## Secure Storage \u0026 Encryption\n\n### Zero-Prompt AES-GCM Hybrid Encryption\n\nThe application features a secure, industrial-grade hybrid encryption system designed to protect your private RPC endpoints and personal notes without ruining the developer experience:\n\n- **Unencrypted Custom RPCs**: Standard custom RPCs store their URLs and notes in plain-text inside the `config.toml` or `.rpc-picker.toml` configuration files.\n- **Password-Protected (Encrypted) Custom RPCs**:\n  - If password protection is enabled, the **entire URL** and the **note** are individually encrypted using **AES-256-GCM** (via `cryptography`).\n  - The encrypted payloads are saved directly inside the TOML configuration file as inline tables (`url_encrypted` and `note_encrypted`). This makes your configuration fully portable across different machines.\n  - To prevent having to type your password repeatedly, the password is automatically registered in your system's secure credential vault (macOS Keychain, Windows Credential Manager, or Linux Secret Service via `keyring`).\n  - **Zero-Prompt UX**: When selecting, editing, or performing background latency checks on an encrypted RPC, the app silently queries the keyring. If the credentials are present, it unlocks the endpoint **instantly without prompting the user**. If the credentials are missing, a secure password prompt modal will ask you for it and automatically persist it back to the keyring.\n\n### Security Visual Indicators\n\n- **Lock Icon `[🔒]`**: Displayed in front of password-protected RPCs in both the **Personal RPCs** and **Favorite RPCs** dashboards.\n- **Privacy Masking (`Ctrl + S`)**: When Sensitive/Privacy Mode is active:\n  - For **unlocked** encrypted RPCs, the decrypted URL and note are masked display-only (e.g., displaying `[🔒] https://mainnet.infura.io/••••••••` and `••••••••`).\n  - For **locked** encrypted RPCs, both values remain completely hidden behind the secure `[🔒] Locked` placeholder.\n\n## Development\n\n```bash\ngit clone https://github.com/radeksvarz/evm-rpc-picker.git\ncd evm-rpc-picker\nuv sync\n\n# Run normally\nuv run evm-rpc-picker\n```\n\n### Hot Reloading (TUI Development)\n\nFor TUI development with hot reloading, open two terminals.\n\nTerminal 1 (Console output):\n```bash\nuv run textual console\n```\n\nTerminal 2 (App with hot reload):\n```bash\nuv run textual run --dev evm_rpc_picker.tui:ChainRPCPicker\n```\n\n---\n\nCreated with 🍻 by **BeerFi Prague** web3 builders community | [Source and updates](https://github.com/radeksvarz/evm-rpc-picker)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradeksvarz%2Fevm-rpc-picker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fradeksvarz%2Fevm-rpc-picker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradeksvarz%2Fevm-rpc-picker/lists"}