Gemini Live API Dev
google-gemini/gemini-skills
A skill your agent uses when building real-time, bidirectional streaming applications with the Gemini Live API, or migrating legacy Live models (2.0/2.5/3.1) to Gemini 3.8 Live.
Ably is a hosted realtime messaging service: clients publish and subscribe to named channels over WebSockets, see who is present, replay message history, and resume after a dropped connection.
$ npx skills add TerminalSkills/skills --skill ably -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install TerminalSkills/skills ably --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/TerminalSkills/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/ably .claude/skills/ably && rm -rf skills-srcUse ~/.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/
Install the "ably" agent skill from https://github.com/TerminalSkills/skills/tree/main/skills/ably into .claude/skills/ably/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ably", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/TerminalSkills/skills/tree/main/skills/ablyType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add TerminalSkills/skills --skill ably -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install TerminalSkills/skills ably --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TerminalSkills/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/ably .agents/skills/ably && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ably" agent skill from https://github.com/TerminalSkills/skills/tree/main/skills/ably into .agents/skills/ably/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ably", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add TerminalSkills/skills --skill ably -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install TerminalSkills/skills ably --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TerminalSkills/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/ably .cursor/skills/ably && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ably" agent skill from https://github.com/TerminalSkills/skills/tree/main/skills/ably into .cursor/skills/ably/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ably", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/TerminalSkills/skills.git --path skills/ably--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add TerminalSkills/skills --skill ably -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install TerminalSkills/skills ably --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TerminalSkills/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/ably .gemini/skills/ably && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ably" agent skill from https://github.com/TerminalSkills/skills/tree/main/skills/ably into .gemini/skills/ably/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ably", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install TerminalSkills/skills ablyInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add TerminalSkills/skills --skill ably -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/TerminalSkills/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/ably .github/skills/ably && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ably" agent skill from https://github.com/TerminalSkills/skills/tree/main/skills/ably into .github/skills/ably/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ably", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add TerminalSkills/skills --skill ably -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install TerminalSkills/skills ably --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/TerminalSkills/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/ably .opencode/skills/ably && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ably" agent skill from https://github.com/TerminalSkills/skills/tree/main/skills/ably into .opencode/skills/ably/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ably", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ablyAbly is a hosted realtime messaging service: clients publish and subscribe to named channels over WebSockets, see who is present, replay message history, and resume after a dropped connection.
Ably is an agent skill from TerminalSkills/skills. Ably is a hosted realtime messaging service: clients publish and subscribe to named channels over WebSockets, see who is present, replay message history, and resume after a dropped connection. Use when a user asks to "add realtime updates", "push live notifications to the browser", "show who is online", "add a chat room with typing indicators", "publish from a serverless function", or "authenticate Ably clients without exposing the API key". Covers the ably 2.x JavaScript SDK (Realtime and REST), JWT token…
Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `_scores.json`). Compatibility notes: Requires an Ably account and API key. ably 2.x runs in browsers and Node.js 16+; @ably/chat 1.x needs Node.js 20+ and ably ^2.19.
It sits in Backend & APIs, covering Authentication, Realtime and WebSockets and Serverless. It works with JavaScript. The repository describes itself as: Open-source library of AI agent skills — SKILL.md files for Claude Code, Codex, Gemini CLI, Cursor. The licence is Apache-2.0.
Read from SKILL.md and the folder at commit a021875. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
ABLY_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Requires an Ably account and API key. ably 2.x runs in browsers and Node.js 16+; @ably/chat 1.x needs Node.js 20+ and ably ^2.19.
From compatibility in the SKILL.md frontmatter.
Ably loads about 3.1k tokens when it runs. Until then it costs about 152 tokens; SKILL.md has 835 words of instructions outside code blocks.
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.
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.
The full file from TerminalSkills/skills at commit a021875, republished under its Apache-2.0 licence (© TerminalSkills). 835 words, ~3,148 tokens.
.claude/skills/ably/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Ably is a managed pub/sub platform. An application publishes messages to named channels and every subscribed client receives them over a WebSocket connection that the SDK keeps alive and resumes after a short network drop. On top of plain messaging it provides presence (who is on a channel), message history, token authentication with per-channel permissions, and a separate Chat SDK with rooms, typing indicators and reactions.
Two clients exist in the ably package: Ably.Realtime holds a connection and can subscribe; Ably.Rest is stateless HTTP and is the right choice for servers and serverless functions that only publish or issue tokens.
npm install ably
npm install @ably/chat # Chat SDK, optional; built on top of ably
npm install jsonwebtoken # server side, to sign tokens for browser clientsCreate an app in the Ably dashboard and copy an API key. A key looks like I2E_JQ.OqUdfg:EVKVT...: the part before the colon is the key name, the part after it is the secret. Keep it in ABLY_API_KEY on the server only.
Browsers and mobile apps must never receive the API key. The server signs a short-lived JWT with the key secret; the SDK fetches it through authUrl (or authCallback) and renews it before it expires.
// server/ably-token.ts
import jwt from "jsonwebtoken";
const [keyName, keySecret] = process.env.ABLY_API_KEY!.split(":");
export function createAblyToken(userId: string): string {
return jwt.sign(
{
"x-ably-clientId": userId,
// capability is a JSON string: resource -> allowed operations
"x-ably-capability": JSON.stringify({
"orders:*": ["subscribe", "history"],
[`notifications:${userId}`]: ["subscribe"],
"support:*": ["publish", "subscribe", "presence", "history", "message-update-own"],
}),
},
keySecret,
{ algorithm: "HS256", keyid: keyName, expiresIn: "1h" }, // 24 hours is the maximum
);
}Return that string as the plain-text body of an authenticated endpoint such as GET /api/ably-token. ably.auth.createTokenRequest({ clientId, capability }) on an Ably.Rest client is the older alternative; it still works, but JWTs are the format Ably recommends.
// client/orders.ts
import * as Ably from "ably";
const realtime = new Ably.Realtime({ authUrl: "/api/ably-token" });
await realtime.connection.once("connected");
const channel = realtime.channels.get("orders:store-17");
// subscribe() attaches the channel; filter by event name or receive everything
await channel.subscribe("status-update", (message) => {
console.log(message.name, message.data, message.clientId, message.timestamp);
});
// Publishing needs the publish capability; the token above grants it on support:* only
const lobby = realtime.channels.get("support:lobby");
await lobby.publish("question", { text: "Is anyone from billing online?" });
// Presence needs an identified client (clientId comes from the token)
await lobby.presence.subscribe((member) => {
console.log(member.action, member.clientId, member.data); // enter | leave | update | present
});
await lobby.presence.enter({ name: "Dana Whitfield", status: "available" });
await lobby.presence.update({ name: "Dana Whitfield", status: "busy" });
const members = await lobby.presence.get();
console.log("Online:", members.map((m) => m.clientId));
realtime.close(); // release the connection when the page or process is doneMessages are kept for two minutes by default, enough for the SDK to resume a dropped connection. Longer retention is switched on with a channel rule in the app settings: a match expression such as orders:* with "Persist all messages" enabled (24 hours on the free plan, 72 hours on paid plans).
// client/history.ts
import * as Ably from "ably";
const realtime = new Ably.Realtime({ authUrl: "/api/ably-token" });
// Option 1, rewind: attach and immediately receive the last 10 messages, then live ones
const feed = realtime.channels.get("orders:store-17", { params: { rewind: "10" } });
await feed.subscribe((message) => console.log(message.data));
// Option 2, history: page backwards from the point of attachment, with no gap.
// Pick one: the first history page repeats the messages rewind already delivered.
const page = await feed.history({ untilAttach: true, limit: 50 });
for (const message of page.items) console.log(message.timestamp, message.data);
if (page.hasNext()) {
const older = await page.next();
console.log(older?.items.length);
}// server/notify.ts
import * as Ably from "ably";
const rest = new Ably.Rest({ key: process.env.ABLY_API_KEY });
// No connection is opened: one HTTP request per publish
await rest.channels.get("notifications:usr_8f3a21").publish("alert", {
title: "Payment received",
amount: 150.0,
});
// One request, many channels
const result = await rest.batchPublish({
channels: ["notifications:usr_8f3a21", "notifications:usr_c04d77"],
messages: [{ name: "alert", data: { title: "Scheduled maintenance at 02:00 UTC" } }],
});
console.log(result.successCount, result.failureCount);A room wraps a channel and adds messages, typing, reactions, presence and occupancy. rooms.get() is asynchronous, and nothing arrives until the room is attached. The underlying client must have a clientId.
// client/support-chat.ts
import * as Ably from "ably";
import { ChatClient } from "@ably/chat";
const realtime = new Ably.Realtime({ authUrl: "/api/ably-token" });
const chat = new ChatClient(realtime);
const room = await chat.rooms.get("support:ticket-4812");
const { unsubscribe, historyBeforeSubscribe } = room.messages.subscribe((event) => {
console.log(`${event.message.clientId}: ${event.message.text}`);
});
room.typing.subscribe((event) => {
console.log("Typing:", event.currentTypers.map((t) => t.clientId).join(", "));
});
room.reactions.subscribe((event) => {
console.log(`${event.reaction.clientId} reacted with ${event.reaction.name}`);
});
await room.attach();
const earlier = await historyBeforeSubscribe({ limit: 20 });
console.log(earlier.items.map((m) => m.text));
await room.typing.keystroke(); // call on each keypress; the SDK throttles it
const sent = await room.messages.send({ text: "How can I help you?" });
await room.typing.stop();
await room.messages.update(sent.serial, sent.copy({ text: "How can I help you today?" }));
await room.reactions.send({ name: "like" });
unsubscribe();
await chat.rooms.release("support:ticket-4812"); // detach and free the roomUser request: "Our dashboard should update the moment an order ships. The backend is a Next.js app; don't put the Ably key in the client."
// app/api/ably-token/route.ts
import { createAblyToken } from "../../../server/ably-token";
import { getSessionUser } from "../../../server/session";
export async function GET(request: Request) {
const user = await getSessionUser(request);
if (!user) return new Response("Unauthorized", { status: 401 });
return new Response(createAblyToken(user.id), { headers: { "Content-Type": "text/plain" } });
}// server/ship-order.ts
import * as Ably from "ably";
const rest = new Ably.Rest({ key: process.env.ABLY_API_KEY });
export async function markShipped(storeId: string, orderId: string) {
await rest.channels.get(`orders:${storeId}`).publish("status-update", { orderId, status: "shipped" });
}The browser runs the client/orders.ts code above with authUrl: "/api/ably-token". When markShipped("store-17", "ORD-789") runs, every open dashboard receives a status-update message whose data is { orderId: "ORD-789", status: "shipped" }. A client holding this token cannot publish to orders:*; an attempt is rejected with error code 40160 (capability denied).
User request: "After updating @ably/chat the build fails: RoomOptionsDefaults is not exported and room.messages is undefined."
// Before (0.x)
const room = chatClient.rooms.get("support-room", RoomOptionsDefaults);
await room.typing.start();
await room.reactions.send({ type: "like" });
// After (1.x)
const room = await chatClient.rooms.get("support-room"); // returns a Promise; no options needed to enable features
await room.attach();
await room.typing.keystroke();
await room.reactions.send({ name: "like" });Listeners change shape too: reactions arrive as event.reaction.name, and typing events carry event.currentTypers, an array of { clientId } objects (event.currentlyTyping is deprecated since 1.2). After the change tsc passes and messages sent with room.messages.send({ text }) are delivered to every attached client.
authUrl or authCallback with a server-issued token, scope x-ably-capability to the channels and operations that user needs, and set x-ably-clientId on the server so users cannot impersonate each other.useEffect and pass it to AblyProvider from ably/react, so that server rendering does not open connections that never close.Ably.Rest. It is stateless HTTP; serverless platforms (Lambda, Cloud Functions, Workers) are not built for the persistent connection a Realtime client holds.clientId and the presence capability to enter; the subscribe capability is enough to watch the presence set.orders:, notifications:, support:). Channel rules and capabilities both match colon-delimited segments with * wildcards, so the prefix is what lets you grant orders:* or persist only support:*. A trailing * needs at least one segment: orders:* does not match a channel named orders.idempotentRestPublishing, on by default); set id yourself when your code may publish the same event twice.ably.request() takes a protocol version as its third argument in v2 (request(method, path, version, params, body, headers)); prefer the typed methods such as batchPublish().© TerminalSkills, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in skills/ably of TerminalSkills/skills.
Open the folder on GitHubat commit a021875
Ably 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ably this skillTerminalSkills/skills | 163 | — | ~3.1k | Automated safety check: Pass | Apache-2.0 | |
| Gemini Live API Devgoogle-gemini/gemini-skills | 4.3k | — | ~4.6k | Automated safety check: Pass | Apache-2.0 | |
| Gemini Live API DevJetBrains/skills | 366 | — | ~2.6k | Automated safety check: Pass | None | |
| Supabase Development and Debuggingsupabase/agent-skills | 2.7k | 3 repos | ~3.6k | Automated safety check: Pass | MIT | |
| Qstash JSupstash/qstash-js | 269 | — | ~746 | Automated safety check: Pass | MIT | |
| Sasjs Adaptersasjs/core | 132 | — | ~2.6k | Automated safety check: Pass | MIT |
google-gemini/gemini-skills
A skill your agent uses when building real-time, bidirectional streaming applications with the Gemini Live API, or migrating legacy Live models (2.0/2.5/3.1) to Gemini 3.8 Live.
JetBrains/skills
A skill your agent uses when building real-time, bidirectional streaming applications with the Gemini Live API.
supabase/agent-skills
General Supabase skill for database, auth, Edge Functions, Realtime and storage work, plus client libraries, migrations, security audits, debugging and reading logs.
upstash/qstash-js
Work with the QStash JavaScript/TypeScript SDK for serverless messaging, scheduling.
sasjs/core
Frontend/Node integration with SAS backends using @sasjs/adapter - configuring the SASjs class, the exact request() inputs and response shape, authentication, file upload, and session management.
BlkLeg/CircuitBreaker
How Circuit Breaker moves data between backend and frontend — the NATS internal bus, Redis pub/sub, the WebSocket stream endpoints and their first-message JWT handshake, SSE log/event streams, and…
TerminalSkills/skills
Build custom Blender add-ons with Python. An agent skill from TerminalSkills/skills.
TerminalSkills/skills
Run local SEO from your terminal via the SEOG MCP server — Google Business Profile management, map-pack rank tracking and geo-grid scans, review sync and replies published to Google, competitor…
TerminalSkills/skills
Build marketplace and platform payment flows with Stripe Connect.
TerminalSkills/skills
Scripts and configures production rendering in Autodesk 3ds Max with the V-Ray and Corona renderers: output size and files, render elements, denoising, light mix, batch and command-line rendering…
TerminalSkills/skills
Covers scripting Autodesk 3ds Max, the 3D modeling and rendering application, with MAXScript and Python (pymxs): scene manipulation, object creation, material assignment, camera and light setup…
TerminalSkills/skills
3proxy is a small open-source proxy server that runs HTTP/HTTPS, SOCKS4/5, SNI and TCP/UDP port-mapping proxies from one config file.
Works with
Categories
Ably is a hosted realtime messaging service: clients publish and subscribe to named channels over WebSockets, see who is present, replay message history, and resume after a dropped connection. Ably is an agent skill from TerminalSkills/skills. Ably is a hosted realtime messaging service: clients publish and subscribe to named channels over WebSockets, see who is present, replay message history, and resume after a dropped connection.
Ably fits situations like: A user asks to add realtime updates; push live notifications to the browser; show who is online; add a chat room with typing indicators.
Run `npx skills add TerminalSkills/skills --skill ably -a claude-code`. Or copy the skill folder (skills/ably in TerminalSkills/skills) into .claude/skills/ably in your project. Claude Code loads it when a task matches its description.
Run `npx skills add TerminalSkills/skills --skill ably -a codex`. Or copy the skill folder (skills/ably in TerminalSkills/skills) into .agents/skills/ably in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add TerminalSkills/skills --skill ably -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ably, .gemini/skills/ably, .github/skills/ably and .opencode/skills/ably in your project.
Going by SKILL.md and its folder, Ably needs the command-line tools its instructions call (npm) and credentials named ABLY_API_KEY. Our summary lists: Node.js; A credential in ABLY_API_KEY. Compatibility (from SKILL.md): Requires an Ably account and API key. ably 2.x runs in browsers and Node.js 16+; @ably/chat 1.x needs Node.js 20+ and ably ^2.19..
SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
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.
Ably is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.1k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Ably: Gemini Live API Dev (google-gemini/gemini-skills, 4.3k stars), Gemini Live API Dev (JetBrains/skills, 366 stars), Supabase Development and Debugging (supabase/agent-skills, 2.7k stars) and Qstash JS (upstash/qstash-js, 269 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
TerminalSkills (a GitHub organization) maintains it in TerminalSkills/skills, which has 163 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 3, 2026.
Source: TerminalSkills/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.