<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>pick — Extract, filter, and transform values from anything</title>
<meta name="description" content="A universal CLI tool to extract, filter, and transform values from JSON, YAML, TOML, .env, HTTP headers, logfmt, CSV, and more. Pipes, filters, mutations, output conversion, and JSONL streaming.">
<meta property="og:title" content="pick — Extract, filter, and transform values from anything">
<meta property="og:description" content="One tool to replace jq, yq, grep, awk, and cut. Auto-detects format, pipes, filters, mutations, output conversion, and streaming.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://pick-cli.pages.dev">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>%E2%9E%9C</text></svg>">
<style>
:root {
--bg: #0a0a0a;
--fg: #e4e4e7;
--muted: #71717a;
--accent: #3b82f6;
--green: #22c55e;
--surface: #18181b;
--border: #27272a;
--code-bg: #111113;
--radius: 8px;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
background: var(--bg);
color: var(--fg);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
.container {
max-width: 720px;
margin: 0 auto;
padding: 0 24px;
}
/* Nav */
nav {
padding: 20px 0;
border-bottom: 1px solid var(--border);
}
nav .container {
display: flex;
align-items: center;
justify-content: space-between;
}
nav .logo {
font-size: 18px;
font-weight: 700;
color: var(--fg);
text-decoration: none;
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
}
nav .links {
display: flex;
gap: 24px;
}
nav .links a {
color: var(--muted);
text-decoration: none;
font-size: 14px;
transition: color 0.15s;
}
nav .links a:hover { color: var(--fg); }
nav .links .sponsor-link {
color: #db61a2;
border: 1px solid #db61a2;
border-radius: var(--radius);
padding: 4px 12px;
font-weight: 500;
transition: all 0.15s;
}
nav .links .sponsor-link:hover {
background: #db61a2;
color: #fff;
}
/* Hero */
.hero {
padding: 80px 0 60px;
text-align: center;
}
.hero h1 {
font-size: 48px;
font-weight: 800;
letter-spacing: -1.5px;
line-height: 1.1;
margin-bottom: 16px;
}
.hero h1 span { color: var(--accent); }
.hero p {
color: var(--muted);
font-size: 18px;
max-width: 540px;
margin: 0 auto 32px;
}
/* Install box */
.install {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
margin-bottom: 12px;
}
.install code {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 12px 20px;
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 15px;
color: var(--green);
user-select: all;
}
.install button {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 12px 14px;
cursor: pointer;
color: var(--muted);
transition: all 0.15s;
font-size: 14px;
}
.install button:hover {
color: var(--fg);
border-color: var(--muted);
}
.hero .sub {
color: var(--muted);
font-size: 13px;
}
/* Demo */
.demo {
padding: 40px 0 60px;
}
.terminal {
background: var(--code-bg);
border: 1px solid var(--border);
border-radius: 12px;
overflow: hidden;
}
.terminal-bar {
display: flex;
align-items: center;
gap: 8px;
padding: 12px 16px;
border-bottom: 1px solid var(--border);
}
.terminal-dot {
width: 12px;
height: 12px;
border-radius: 50%;
}
.terminal-dot:nth-child(1) { background: #ff5f57; }
.terminal-dot:nth-child(2) { background: #febc2e; }
.terminal-dot:nth-child(3) { background: #28c840; }
.terminal-bar span {
color: var(--muted);
font-size: 12px;
margin-left: 8px;
}
.terminal-bar .copy-term {
margin-left: auto;
background: none;
border: none;
color: var(--muted);
cursor: pointer;
transition: color 0.15s;
padding: 4px;
display: flex;
align-items: center;
}
.terminal-bar .copy-term:hover { color: var(--fg); }
.terminal-bar .copy-term svg { width: 16px; height: 16px; }
.terminal-bar .copy-term.copied svg.icon-copy { display: none; }
.terminal-bar .copy-term svg.icon-check { display: none; color: var(--green); }
.terminal-bar .copy-term.copied svg.icon-check { display: block; }
.terminal-body {
padding: 20px 24px;
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 14px;
line-height: 1.8;
overflow-x: auto;
}
.terminal-body .line { display: block; }
.terminal-body .line.gap { margin-top: 12px; }
.terminal-body .prompt { color: var(--green); }
.terminal-body .cmd { color: var(--fg); cursor: pointer; border-radius: 3px; transition: background 0.15s; }
.terminal-body .cmd:hover { background: rgba(255,255,255,0.06); }
.terminal-body .comment { color: var(--muted); }
.terminal-body .output { color: #a1a1aa; }
.copied-toast {
position: fixed;
bottom: 24px;
right: 24px;
background: var(--green);
color: #000;
padding: 8px 16px;
border-radius: var(--radius);
font-size: 13px;
font-weight: 600;
opacity: 0;
transform: translateY(8px);
transition: all 0.2s;
pointer-events: none;
z-index: 100;
}
.copied-toast.show {
opacity: 1;
transform: translateY(0);
}
/* Sections */
section {
padding: 60px 0;
border-top: 1px solid var(--border);
}
section h2 {
font-size: 28px;
font-weight: 700;
letter-spacing: -0.5px;
margin-bottom: 32px;
}
section h3.section-sub {
font-size: 18px;
font-weight: 600;
margin-bottom: 16px;
margin-top: 32px;
}
/* Format grid */
.formats {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 12px;
}
.format-card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 16px;
}
.format-card h3 {
font-size: 15px;
font-weight: 600;
margin-bottom: 4px;
}
.format-card p {
color: var(--muted);
font-size: 13px;
}
/* Selectors */
.selector-table {
width: 100%;
border-collapse: collapse;
}
.selector-table td {
padding: 10px 0;
border-bottom: 1px solid var(--border);
font-size: 15px;
}
.selector-table td:first-child {
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
color: var(--accent);
width: 280px;
font-size: 14px;
}
.selector-table td:last-child {
color: var(--muted);
}
/* Operator table */
.op-table {
width: 100%;
border-collapse: collapse;
margin-top: 12px;
}
.op-table td {
padding: 8px 0;
border-bottom: 1px solid var(--border);
font-size: 14px;
}
.op-table td:first-child {
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
color: var(--accent);
width: 200px;
font-size: 13px;
}
.op-table td:last-child {
color: var(--muted);
}
/* Flags */
.flag-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
}
.flag {
padding: 12px 16px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
}
.flag code {
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 13px;
color: var(--accent);
}
.flag p {
color: var(--muted);
font-size: 13px;
margin-top: 4px;
}
/* Example blocks */
.example-block {
background: var(--code-bg);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 16px 20px;
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 13px;
line-height: 1.8;
overflow-x: auto;
margin-top: 12px;
margin-bottom: 16px;
}
.example-block .prompt { color: var(--green); }
.example-block .comment { color: var(--muted); }
.example-block .output { color: #a1a1aa; }
/* Install grid */
.install-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.install-method {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 16px;
}
.install-method h3 {
font-size: 15px;
font-weight: 600;
margin-bottom: 2px;
}
.install-method p {
color: var(--muted);
font-size: 12px;
margin-bottom: 8px;
}
.install-method code {
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 12px;
color: var(--green);
cursor: pointer;
border-radius: 3px;
transition: background 0.15s;
}
.install-method code:hover { background: rgba(255,255,255,0.06); }
/* Footer */
footer {
padding: 40px 0;
border-top: 1px solid var(--border);
text-align: center;
color: var(--muted);
font-size: 13px;
}
footer a {
color: var(--muted);
text-decoration: none;
}
footer a:hover { color: var(--fg); }
/* Responsive */
@media (max-width: 600px) {
.hero h1 { font-size: 32px; }
.hero p { font-size: 16px; }
.flag-grid { grid-template-columns: 1fr; }
.install-grid { grid-template-columns: 1fr; }
.install code { font-size: 13px; padding: 10px 14px; }
.terminal-body { font-size: 12px; padding: 16px; }
.selector-table td:first-child { width: 160px; }
.op-table td:first-child { width: 140px; }
.example-block { font-size: 11px; padding: 12px 14px; }
}
</style>
</head>
<body>
<nav>
<div class="container">
<a href="/" class="logo">pick</a>
<div class="links">
<a href="https://github.com/aryanbhosale/pick">GitHub</a>
<a href="https://crates.io/crates/pick-cli">crates.io</a>
<a href="https://www.npmjs.com/package/@aryanbhosale/pick">npm</a>
<a href="https://github.com/sponsors/aryanbhosale" class="sponsor-link">Sponsor</a>
</div>
</div>
</nav>
<div class="container">
<div class="hero">
<h1>Extract, filter, and transform <span>anything</span></h1>
<p>One tool to replace jq, yq, grep, awk, and cut. Pipes, filters, mutations, output conversion, and JSONL streaming.</p>
<div class="install">
<code id="install-cmd">cargo install pick-cli</code>
<button onclick="copy()" id="copy-btn" title="Copy to clipboard">Copy</button>
</div>
<div class="sub">macOS, Linux, Windows · MIT License · <a href="#install-section" style="color:var(--accent);text-decoration:none">all install methods</a></div>
</div>
<div class="demo">
<div class="terminal">
<div class="terminal-bar">
<div class="terminal-dot"></div>
<div class="terminal-dot"></div>
<div class="terminal-dot"></div>
<span>Terminal</span>
<button class="copy-term" onclick="copyBlock(this)"><svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><svg class="icon-check" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/></svg></button>
</div>
<div class="terminal-body">
<span class="line"><span class="comment"># Extract from JSON</span></span>
<span class="line"><span class="prompt">$</span> <span class="cmd">curl -s api.github.com/users/octocat | pick login</span></span>
<span class="line"><span class="output">octocat</span></span>
<span class="line gap"><span class="comment"># Pipe through filters</span></span>
<span class="line"><span class="prompt">$</span> <span class="cmd">cat data.json | pick 'users | select(age > 21) | name'</span></span>
<span class="line"><span class="output">Alice</span></span>
<span class="line"><span class="output">Charlie</span></span>
<span class="line gap"><span class="comment"># Array slicing</span></span>
<span class="line"><span class="prompt">$</span> <span class="cmd">cat items.json | pick 'items[0:3] | name'</span></span>
<span class="line"><span class="output">first</span></span>
<span class="line"><span class="output">second</span></span>
<span class="line"><span class="output">third</span></span>
<span class="line gap"><span class="comment"># Mutate and convert output format</span></span>
<span class="line"><span class="prompt">$</span> <span class="cmd">cat config.json | pick 'set(env, "prod")' -o yaml</span></span>
<span class="line"><span class="output">env: prod</span></span>
<span class="line"><span class="output">port: 8080</span></span>
<span class="line gap"><span class="comment"># Stream JSONL logs</span></span>
<span class="line"><span class="prompt">$</span> <span class="cmd">cat events.jsonl | pick --stream 'select(level == "error") | message'</span></span>
<span class="line"><span class="output">connection timeout</span></span>
<span class="line"><span class="output">disk full</span></span>
<span class="line gap"><span class="comment"># Recursive descent</span></span>
<span class="line"><span class="prompt">$</span> <span class="cmd">cat package.json | pick '..name'</span></span>
<span class="line"><span class="output">my-app</span></span>
<span class="line"><span class="output">lodash</span></span>
<span class="line"><span class="output">express</span></span>
</div>
</div>
</div>
<section>
<h2>8 formats, zero config</h2>
<div class="formats">
<div class="format-card">
<h3>JSON</h3>
<p>Objects, arrays, nested structures</p>
</div>
<div class="format-card">
<h3>YAML</h3>
<p>Config files, Kubernetes manifests</p>
</div>
<div class="format-card">
<h3>TOML</h3>
<p>Cargo.toml, pyproject.toml</p>
</div>
<div class="format-card">
<h3>.env</h3>
<p>Environment variable files</p>
</div>
<div class="format-card">
<h3>HTTP Headers</h3>
<p>curl -I output, response headers</p>
</div>
<div class="format-card">
<h3>logfmt</h3>
<p>Structured log lines</p>
</div>
<div class="format-card">
<h3>CSV / TSV</h3>
<p>Tabular data with headers</p>
</div>
<div class="format-card">
<h3>Plain text</h3>
<p>Key-value fallback and substring search</p>
</div>
</div>
</section>
<section>
<h2>Selector syntax</h2>
<table class="selector-table">
<tr><td>foo</td><td>Top-level key</td></tr>
<tr><td>foo.bar</td><td>Nested key</td></tr>
<tr><td>foo[0]</td><td>Array index</td></tr>
<tr><td>foo[-1]</td><td>Last element</td></tr>
<tr><td>foo[1:3]</td><td>Array slice (elements 1, 2)</td></tr>
<tr><td>foo[:2]</td><td>First two elements</td></tr>
<tr><td>foo[-2:]</td><td>Last two elements</td></tr>
<tr><td>foo[*].name</td><td>Pluck field from all elements</td></tr>
<tr><td>..key</td><td>Recursive descent — find key anywhere</td></tr>
<tr><td>name, age</td><td>Multiple selectors (union)</td></tr>
<tr><td>[0]</td><td>Index into root array</td></tr>
<tr><td>"dotted.key".sub</td><td>Quoted key for dots in names</td></tr>
</table>
</section>
<section>
<h2>Pipes & Filters</h2>
<p style="color:var(--muted);margin-bottom:24px;">Chain operations with the pipe operator. Filter arrays with <code style="color:var(--accent);font-family:'SF Mono','Fira Code','Consolas',monospace;font-size:14px;">select()</code> using comparison operators, regex, and boolean logic.</p>
<div class="example-block">
<span class="comment"># Chain operations with pipes</span>
<span class="prompt">$</span> echo '{"users":[{"name":"Alice","age":30},{"name":"Bob","age":17}]}' \
| pick 'users | select(age >= 18) | name'
<span class="output">Alice</span>
<span class="comment"># Regex matching</span>
<span class="prompt">$</span> echo '{"items":[{"id":"abc-123"},{"id":"def-456"},{"id":"abc-789"}]}' \
| pick 'items | select(id ~ "^abc") | id'
<span class="output">abc-123</span>
<span class="output">abc-789</span>
<span class="comment"># Boolean logic</span>
<span class="prompt">$</span> echo '{"users":[{"name":"Alice","active":true,"role":"admin"}]}' \
| pick 'users | select(active == true and role == "admin") | name'
<span class="output">Alice</span>
</div>
<h3 class="section-sub">Filter operators</h3>
<table class="op-table">
<tr><td>==, !=</td><td>Equality / inequality</td></tr>
<tr><td>>, <, >=, <=</td><td>Numeric comparisons</td></tr>
<tr><td>~</td><td>Regex match</td></tr>
<tr><td>and, or, not</td><td>Boolean combinators</td></tr>
</table>
</section>
<section>
<h2>Builtins</h2>
<p style="color:var(--muted);margin-bottom:24px;">Built-in functions for introspection and aggregation, usable anywhere in a pipeline.</p>
<table class="op-table">
<tr><td>keys()</td><td>Object keys as array</td></tr>
<tr><td>values()</td><td>Object values as array</td></tr>
<tr><td>length()</td><td>Length of array, object, or string</td></tr>
</table>
<div class="example-block" style="margin-top:16px;">
<span class="prompt">$</span> echo '{"a":1,"b":2,"c":3}' | pick 'keys()'
<span class="output">a</span>
<span class="output">b</span>
<span class="output">c</span>
<span class="prompt">$</span> echo '{"a":1,"b":2,"c":3}' | pick 'keys() | length()'
<span class="output">3</span>
</div>
</section>
<section>
<h2>Mutation</h2>
<p style="color:var(--muted);margin-bottom:24px;">Immutable tree operations — <code style="color:var(--accent);font-family:'SF Mono','Fira Code','Consolas',monospace;font-size:14px;">set()</code> adds or replaces keys, <code style="color:var(--accent);font-family:'SF Mono','Fira Code','Consolas',monospace;font-size:14px;">del()</code> removes them. Both return the full modified document.</p>
<div class="example-block">
<span class="comment"># Set a value</span>
<span class="prompt">$</span> echo '{"name":"Alice"}' | pick 'set(role, "admin")' --json
<span class="output">{"name":"Alice","role":"admin"}</span>
<span class="comment"># Delete a key</span>
<span class="prompt">$</span> echo '{"name":"Alice","tmp":true}' | pick 'del(tmp)' --json
<span class="output">{"name":"Alice"}</span>
<span class="comment"># Chain mutations in a pipeline</span>
<span class="prompt">$</span> echo '{"a":1}' | pick 'set(b, 2) | del(a)' --json
<span class="output">{"b":2}</span>
</div>
</section>
<section>
<h2>Output formats</h2>
<p style="color:var(--muted);margin-bottom:24px;">Convert between formats on the fly with <code style="color:var(--accent);font-family:'SF Mono','Fira Code','Consolas',monospace;font-size:14px;">-o / --output</code>. Input format is auto-detected; output format is your choice.</p>
<div class="example-block">
<span class="comment"># JSON to YAML</span>
<span class="prompt">$</span> echo '{"name":"Alice","age":30}' | pick -o yaml
<span class="output">age: 30</span>
<span class="output">name: Alice</span>
<span class="comment"># YAML to TOML</span>
<span class="prompt">$</span> cat config.yaml | pick server -o toml
<span class="output">host = "localhost"</span>
<span class="output">port = 8080</span>
<span class="comment"># Any format to JSON</span>
<span class="prompt">$</span> cat .env | pick -o json
<span class="output">{"DATABASE_URL":"postgres://...","PORT":"3000"}</span>
</div>
</section>
<section>
<h2>JSONL streaming</h2>
<p style="color:var(--muted);margin-bottom:24px;">Process newline-delimited JSON line by line with <code style="color:var(--accent);font-family:'SF Mono','Fira Code','Consolas',monospace;font-size:14px;">--stream</code>. Each line is parsed and queried independently — perfect for log files and event streams.</p>
<div class="example-block">
<span class="prompt">$</span> cat events.jsonl | pick --stream 'select(status >= 400) | url'
<span class="output">/api/broken-endpoint</span>
<span class="output">/api/timeout</span>
<span class="prompt">$</span> cat metrics.jsonl | pick --stream 'select(cpu > 90) | host'
<span class="output">server-3</span>
<span class="output">server-7</span>
</div>
</section>
<section>
<h2>Flags</h2>
<div class="flag-grid">
<div class="flag">
<code>-i, --input <format></code>
<p>Force input format</p>
</div>
<div class="flag">
<code>-o, --output <format></code>
<p>Output as json, yaml, or toml</p>
</div>
<div class="flag">
<code>-f, --file <path></code>
<p>Read from file instead of stdin</p>
</div>
<div class="flag">
<code>--stream</code>
<p>JSONL line-by-line mode</p>
</div>
<div class="flag">
<code>--json</code>
<p>Output as JSON</p>
</div>
<div class="flag">
<code>--lines</code>
<p>One element per line</p>
</div>
<div class="flag">
<code>-1, --first</code>
<p>Only first result</p>
</div>
<div class="flag">
<code>-d, --default <val></code>
<p>Fallback value</p>
</div>
<div class="flag">
<code>-e, --exists</code>
<p>Exit code only (0/1)</p>
</div>
<div class="flag">
<code>-c, --count</code>
<p>Count matches</p>
</div>
<div class="flag">
<code>-r, --raw</code>
<p>No quotes on strings</p>
</div>
<div class="flag">
<code>-q, --quiet</code>
<p>Suppress errors</p>
</div>
</div>
</section>
<section id="install-section">
<h2>Install</h2>
<div class="install-grid">
<div class="install-method">
<h3>Cargo</h3>
<p>Rust ecosystem</p>
<code class="cmd">cargo install pick-cli</code>
</div>
<div class="install-method">
<h3>Homebrew</h3>
<p>macOS & Linux</p>
<code class="cmd">brew install aryanbhosale/pick/pick</code>
</div>
<div class="install-method">
<h3>npm</h3>
<p>Node.js ecosystem</p>
<code class="cmd">npm install -g @aryanbhosale/pick</code>
</div>
<div class="install-method">
<h3>Snap</h3>
<p>Linux</p>
<code class="cmd">snap install pick-cli</code>
</div>
<div class="install-method">
<h3>Chocolatey</h3>
<p>Windows</p>
<code class="cmd">choco install pick</code>
</div>
<div class="install-method">
<h3>WinGet</h3>
<p>Windows</p>
<code class="cmd">winget install aryanbhosale.pick</code>
</div>
<div class="install-method">
<h3>Docker</h3>
<p>Any platform</p>
<code class="cmd">docker run -i ghcr.io/aryanbhosale/pick</code>
</div>
<div class="install-method">
<h3>GitHub Releases</h3>
<p>Pre-built binaries</p>
<a href="https://github.com/aryanbhosale/pick/releases" style="color:var(--accent);font-size:13px;font-family:'SF Mono','Fira Code','Consolas',monospace">Download →</a>
</div>
</div>
</section>
</div>
<footer>
<div class="container">
<a href="https://github.com/aryanbhosale/pick">GitHub</a> ·
<a href="https://crates.io/crates/pick-cli">crates.io</a> ·
<a href="https://www.npmjs.com/package/@aryanbhosale/pick">npm</a> ·
<a href="https://snapcraft.io/pick-cli">Snap Store</a> ·
<a href="https://github.com/aryanbhosale/pick/issues">Issues</a> ·
<a href="https://github.com/sponsors/aryanbhosale">Sponsor</a> ·
MIT License
</div>
</footer>
<div class="copied-toast" id="toast">Copied!</div>
<script>
function showToast() {
const t = document.getElementById('toast');
t.classList.add('show');
setTimeout(() => t.classList.remove('show'), 1200);
}
function copy() {
navigator.clipboard.writeText('cargo install pick-cli');
const btn = document.getElementById('copy-btn');
btn.textContent = 'Copied!';
setTimeout(() => btn.textContent = 'Copy', 1500);
showToast();
}
function copyBlock(btn) {
const body = btn.closest('.terminal').querySelector('.terminal-body');
const cmds = body.querySelectorAll('.cmd');
const text = Array.from(cmds).map(c => c.textContent).join('\n');
navigator.clipboard.writeText(text);
btn.classList.add('copied');
setTimeout(() => btn.classList.remove('copied'), 1500);
showToast();
}
document.querySelectorAll('.install-method code').forEach(cmd => {
cmd.title = 'Click to copy';
cmd.addEventListener('click', () => {
navigator.clipboard.writeText(cmd.textContent);
showToast();
});
});
document.querySelectorAll('.terminal-body .cmd').forEach(cmd => {
cmd.title = 'Click to copy';
cmd.addEventListener('click', () => {
navigator.clipboard.writeText(cmd.textContent);
showToast();
});
});
</script>
</body>
</html>