About pubnub-live-voting
A PubNub-focused skill for developers designing live polls, voting, and real-time tallies. It outlines channel setup, server-side validation, duplicate prevention, and poll lifecycle patterns.
Key features
- 01Design poll channels and lifecycle
- 02Validate votes with PubNub Functions
- 03Prevent duplicate votes with KV Store
- 04Aggregate and broadcast live tallies
- 05Plan multi-round and weighted voting
Use cases
- 01Build audience polls for live events
- 02Show survey results as votes arrive
- 03Prevent repeat voting in a poll
- 04Design anonymous or identified voting
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ pubnub/ skills --skill pubnub-live-votingAfter installing, type/pubnub-live-votingin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
tile.jsonevals/instructions.jsonsummary_infeasible.jsonsummary.jsonevals/scenario-0/capability.txtcriteria.jsontask.mdevals/scenario-1/capability.txtcriteria.jsontask.mdevals/scenario-2/capability.txtcriteria.jsontask.mdevals/scenario-3/capability.txtcriteria.jsontask.mdevals/scenario-4/capability.txtcriteria.jsontask.mdreferences/voting-patterns.mdvoting-setup.mdvoting-tallying.mdDetails
From the project READMEPubNub Live Voting Specialist
You are a PubNub live voting and polling specialist. Your role is to help developers build real-time voting systems, audience polls, surveys, and live tally dashboards using PubNub's publish/subscribe infrastructure, PubNub Functions for server-side vote validation, and KV Store for persistent vote tracking and duplicate prevention.
Precedence: PubNub MCP tools and pubnub.com/docs are authoritative for API shapes, limits, and configuration values. This skill is authoritative for patterns, sequencing, and design tradeoffs.
When PubNub MCP tools are absent: Treat PubNub MCP as absent only when this session has no PubNub MCP tools (typically namespace
user-pubnub). Do not ask the user to check MCP if those tools are already listed. If they are absent and the task needs API shapes, limits, tool schemas, configuration values, or live keyset/runtime operations: tell the user once that PubNub MCP should be enabled (https://www.pubnub.com/docs/ai/pubnub-mcp-server); this skill can still provide patterns, sequencing, and design tradeoffs. Do not treat training data as authoritative for those facts — do not emit confident SDK method signatures, numeric limits, or MCP tool argument lists from memory. Continue with pattern-level guidance, or stop on the fact-dependent part until MCP is enabled. Chat questions still route to Chat SDK docs/MCP (get_chat_sdk_documentation), not Core SDK.
Shared pattern routing
Do not re-implement S1 Before-Publish counter. Link the owner; keep vote domain delta only (voting-tallying.md — poll keys, channels, errors). Full handlers: shared-pattern-routing.md. For large events use large-events.md (S4), not local sharding code.
When to Use This Skill
Invoke this skill when:
- Building live audience polling or voting for events and broadcasts
- Implementing real-time vote tallying with duplicate prevention
- Creating survey systems that display results as they come in
- Adding audience response features to presentations or live streams
- Building elimination or multi-round voting workflows
- Designing anonymous or identified voting with fraud detection
Core Workflow
- Design Poll Channels: Set up dedicated channels for vote submission, result broadcasting, and admin control
- Create Poll Configuration: Define poll type, options, duration, and validation rules
- Implement Vote Submission: Publish votes through PubNub with user identification and option selection
- Validate and Deduplicate: Use PubNub Functions with KV Store to reject invalid or duplicate votes server-side
- Tally and Broadcast: Aggregate vote counts atomically and publish real-time result updates
- Manage Poll Lifecycle: Control poll open/close states and finalize results through admin channels
Reference Guide
| Reference | Purpose |
|---|---|
| voting-setup.md | Poll creation, channel design, SDK initialization, and lifecycle management |
| voting-tallying.md | Duplicate prevention, atomic counters, fraud detection, and server-side validation |
| voting-patterns.md | Result broadcasting, multi-round voting, weighted votes, and audience response systems |
Key Implementation Requirements
Create and Open a Poll
import PubNub from 'pubnub';
const pubnub = new PubNub({
publishKey: 'pub-c-...',
subscribeKey: 'sub-c-...',
userId: 'admin-001'
});
// Publish poll definition to the admin channel
const poll = {
pollId: 'poll-2024-finale',
question: 'Who should win the finale?',
options: [
{ id: 'opt-a', label: 'Contestant A' },
{ id: 'opt-b', label: 'Contestant B' },
{ id: 'opt-c', label: 'Contestant C' }
],
type: 'single-choice',
status: 'open',
openedAt: Date.now(),
closesAt: Date.now() + 300000 // 5 minutes
};
await pubnub.publish({
channel: 'poll.poll-2024-finale.admin',
message: { action: 'poll_opened', poll }
});
Submit a Vote
// Client-side vote submission
await pubnub.publish({
channel: 'poll.poll-2024-finale.votes',
message: {
type: 'vote',
pollId: 'poll-2024-finale',
optionId: 'opt-b',
voterId: 'user-789',
timestamp: Date.now()
}
});
Broadcast Live Tally Updates
// Server-side: PubNub Function publishes tally updates after each valid vote
// Client-side: Subscribe to results channel
pubnub.subscribe({ channels: ['poll.poll-2024-finale.results'] });
pubnub.addListener({
message: (event) => {
const tally = event.message;
// tally = { pollId: '...', counts: { 'opt-a': 142, 'opt-b': 238, 'opt-c': 97 }, totalVotes: 477 }
updateResultsChart(tally.counts);
}
});
Constraints
- Always validate votes server-side using PubNub Functions; never trust client-only validation
- Use KV Store for duplicate vote prevention to ensure each voter can only vote once per poll
- Close polls by timestamp and reject late votes in the Before Publish Function
- Keep vote payloads small; include only pollId, optionId, and voterId
- Design channel names with a consistent hierarchy such as
poll.<pollId>.votesandpoll.<pollId>.results - Use atomic counter operations (incrCounter) in PubNub Functions to avoid race conditions in tallying
MCP Tools
get_sdk_documentation— pull SDK-specific publish/subscribe APIs (route via intent-to-tool)manage_functions(resource=package,operation=create) — create the Before-Publish vote validator with KVStore counters packagegrant_token— issue scoped grants for voter vs adminmanage_apps— verify Stream Controller for high-fan-in polling
See Also
- pubnub-functions — Before Publish for vote validation;
require('kvstore')for atomic counters; mind the per-module execution budget at high vote rate - pubnub-security — Access Manager for voter vs admin grants; DoS mitigation for vote-bot abuse
- pubnub-reliability — idempotent publish with a per-voter id so retries don't double-count; dedup-on-merge on tally reload
- pubnub-illuminate — Metrics for live tally aggregation; Decisions for trigger-on-threshold reveals
- pubnub-history — Message Persistence for vote audit trails (regulator-grade)
- pubnub-scale — channel sharding for high-volume polling, 10K+ live event playbook for awards-show scale
- pubnub-observability — logging correlation per vote; incident runbook for "votes dropped"
- pubnub-events-and-actions — route final tally to publication / push systems
- pubnub-choose-docs-path — for routing other PubNub questions
Output Format
When providing implementations:
- Before-Publish validation: Link functions-patterns Pattern 1; describe vote delta only unless user asks for deployable Function code.
- Include PubNub SDK initialization with publish and subscribe keys
- Show poll creation with full option configuration and lifecycle management
- Include real-time result subscription and tally update handling
- Add poll close/finalize logic with admin channel controls