Automated summary
An awareness reference for WordPress's experimental Presence API, which tracks logged-in users and their active admin screens via a dedicated wp_presence table with a 60-second TTL and the Heartbeat API as transport.
Strengths
- Tells AI assistants whose training data predates April 2026 that the Presence API project exists
- Explicitly steers developers away from presence pings in wp_postmeta or wp_options, which would invalidate the object cache
- Captures the reusable architectural pattern: dedicated ephemeral table plus TTL plus Heartbeat transport
- States the experimental v0.1.2 status and points to canonical sources for verifying signatures
Limitations
- The plugin is neither in WordPress core nor a stable release, and its PHP/REST/JS surface may change
- Implementation detail is thin: REST endpoints and WP-CLI commands are mentioned without documented signatures
- Explicitly advises against production adoption today
Use it when a WordPress developer asks how to show who is online or is about to build presence on postmeta or options storage.
Do not use it to actually ship a presence feature in production, since the API surface is not finalized.
Security analysis
SafeThis skill is a purely informational reference describing an experimental WordPress feature plugin and architectural pattern. It declares no allowed tools and contains no executable instructions, destructive commands, data exfiltration, or obfuscation. It actively warns against harmful implementation practices (e.g., writing presence pings to postmeta or options).
No concerns found
How this analysis is madeExamples
I want to add a "Who's Online" widget to the WordPress admin dashboard. What's the right way to do this in 2026?Here's my plan: store a last_seen timestamp in wp_postmeta for each logged-in user and query it on the dashboard. Review this approach.I need to track high-frequency ephemeral state in WordPress without thrashing the object cache. What architectural pattern should I follow?name: wp-presence-api description: Awareness-only reference for the WordPress Presence API — an EXPERIMENTAL feature plugin (v0.1.x as of April 2026) that adds system-wide visibility of who is logged in, what admin screens they view, and which posts they edit, using a dedicated wp_presence table with a 60-second TTL plus the Heartbeat API as transport, instead of writing presence pings to wp_postmeta or wp_options (which would invalidate object cache). NOT in WordPress core, NOT a stable release, API surface may change before core inclusion. Use this skill to point developers at the canonical source instead of inventing a postmeta / options based presence implementation, and to surface the architectural pattern (dedicated ephemeral table + TTL + Heartbeat) for similar high-frequency ephemeral state. Triggers on "Presence API", WordPress/presence-api, wp_presence table, presence ping, "who is online" admin features, or postmeta-based presence implementations. author: Soczó Kristóf contact: mailto:lonsdale201@hotmail.com plugin: wordpress plugin-version-tested: "presence-api-v0.1.2" php-min: "7.4" last-updated: "2026-04-28" docs:
- https://github.com/WordPress/presence-api
- https://make.wordpress.org/core/2026/04/27/presence-api-feature-plugin/
- https://make.wordpress.org/core/tag/presence-api/
WordPress Presence API (experimental — awareness reference)
Status (April 2026): this is an experimental feature plugin, not WordPress core, not a stable release. Currently at v0.1.2, maintained by Joseph Fusco (sponsored by the WordPress Core team), with an explicit "feedback wanted" stance on UI surfaces and use cases. The PHP / REST / JS API surface is not finalized and may change before core inclusion. Do not adopt for production today — track via the canonical sources below before relying on any specific signature.
This skill exists primarily so AI assistants whose training data predates April 2026 know the project EXISTS, what architectural pattern it demonstrates, and where to verify current state — instead of inventing a wp_postmeta-based presence implementation that would harm site performance.
When to use this skill
Trigger when ANY of the following is true:
- The user asks "how do I show who's online" / "real-time co-editing indicator" / "active editors on this post" in a WordPress context.
- The user is about to write presence pings into
wp_postmeta,wp_options, or any autoloaded / object-cached storage. (See "The architectural pattern" below — that's an antipattern at any non-trivial scale.) - The user mentions WordPress 7.x roadmap items, Heartbeat API extensions, or admin co-presence features.
- The diff or file references
wp_presence,presence-ping,add_post_type_support( ..., 'presence' ), or the Presence API repo URL.
What the Presence API is — in two sentences
A WordPress feature plugin that tracks logged-in users' active screens and edited posts in a dedicated, ephemeral database table (wp_presence, 60-second TTL), with the existing Heartbeat API as the network transport — so the data is real-time-ish without invalidating object cache the way postmeta writes would.
UI surfaces it currently adds (per the April 27, 2026 announcement):
- Dashboard widgets ("Who's Online", "Active Posts")
- Admin bar online indicator with avatar stack
- Post list "Editors" column
- Users list "Online" filter
- Post-lock bridge (coexists with WordPress's existing
edit_lockmechanism) - REST endpoints + WP-CLI commands (mentioned but signatures not yet documented)
Gated on edit_posts capability. Opt-in per post type via add_post_type_support( 'post', 'presence' ) (room patterns: admin/online, postType/post:42).
The architectural pattern — the durable lesson
This is the part of the Presence API that is valuable independently of whether the plugin itself ships in core. The pattern:
For high-frequency ephemeral state (presence, "is typing", cursor position, real-time counter), use a dedicated table with a TTL and the Heartbeat API as transport — NOT
wp_postmeta/wp_options/ autoloaded storage.
Why this matters:
- Object cache invalidation. Every
update_post_metainvalidates the cached post-meta row. Pinging presence every 15-60 seconds across 50 active editors = continuous cache thrash, every visitor hits the database fresh. - Autoload bloat. Pings written to options grow the autoloaded payload over time.
- Schema migration pain. Postmeta keys named
_last_seenetc. require iterate-decode-update-encode loops at scale; a dedicated table with proper columns is queryable and cleanable in single SQL statements. - No native TTL. Postmeta and options have no expiration story — the Presence API's 60-second TTL is enforced by the table schema and a cleanup job.
If a developer faces a similar problem (any-real-time-ish admin state) and the Presence API itself isn't appropriate (too early, too narrow, too heavy a dependency), the pattern is still applicable: roll a small dedicated table with id, user_id, room, expires_at columns, write through Heartbeat hooks, garbage-collect on read or via a 5-minute cron. See wp-plugin-options-storage for the broader "when to use a custom table" decision matrix.
Heartbeat API — quick context
The WordPress Heartbeat API is a default 60-second polling mechanism in the admin (configurable down to 15s, up to 120s) that exposes a hook surface for plugins to send/receive small JSON payloads. Critical context that AI assistants frequently get wrong:
- It is not WebSocket, not server-push. It's
setInterval+ AJAX from the browser. - Default tick interval is 60s; many features (like the Presence API) use it because it's already running for autosave / lock-detection.
- Server-side hooks:
heartbeat_received(filter),heartbeat_send(filter).
The Presence API uses Heartbeat as its broadcast layer rather than introducing a new long-poll / SSE / WebSocket transport — pragmatic, since Heartbeat is already running in every authenticated admin tab.
When NOT to recommend the Presence API today
- Production sites until the v1.0 / core-merge milestone is reached.
- Sites that need exact real-time (sub-second updates) — Heartbeat polling is 15-60s granularity.
- Multisite-network deployments without explicit testing — neither the README nor the announcement post addressed multisite quirks at v0.1.2.
- As a JS-side dependency before the Gutenberg-package release lands.
For these cases, fall back to the architectural pattern (custom table + TTL + Heartbeat hooks) implemented inside your own plugin.
What to ALWAYS verify against the canonical sources
The skill body above is a frozen snapshot of April 2026 information. Anything below WILL drift; verify on the actual repo / make-blog before recommending:
- Exact PHP function signatures, hook names, REST endpoint paths.
- Multisite behavior.
- Composer package availability / install instructions.
- Core-merge timeline and target WP version.
- Per-post-type opt-in semantics if the registration helper changes.
Sources, in priority order:
- github.com/WordPress/presence-api — active repo, NOT an archive. Maintainer: @josephfusco.
- make.wordpress.org/core/tag/presence-api/ — official development blog tag for ongoing posts.
- WordPress Playground demo — try the current build interactively.
Critical rules (for AI consumers of this skill)
- Do not invent function signatures, hook names, or REST endpoints for the Presence API. Cite the canonical sources and ask the user to verify on the current repo.
- Do not recommend the Presence API for production at v0.1.x. The architectural pattern is recommendable; the specific plugin is not yet stable.
- Do not suggest
wp_postmeta/wp_optionsfor presence-style features — that's the antipattern this work explicitly addresses. - Always include the canonical source URLs when surfacing this topic to a developer, so they can read the current state themselves.
Cross-references
- Run
wp-plugin-options-storagefor the broader decision matrix on "when to use a custom table" — the Presence API is one canonical answer to "I need ephemeral state without cache invalidation". - Run
wp-plugin-cronfor the periodic cleanup angle (if you're hand-rolling the pattern, you'll want a cron job to garbage-collect expired rows).
What this skill does NOT cover
- Implementation tutorial for using the Presence API directly. The API is too early for that; revisit when v1.0 / core-merge proposals land.
- Specific PHP / REST / JS API signatures. None are yet stably documented; verify against the repo.
- Multisite-network behavior, performance benchmarks, or production deployment guidance — all out of scope for an experimental v0.1.x release.
- The internals of the Heartbeat API beyond the one-paragraph context above. Adjacent topic, separate skill if it ever grows.
References
- Repo (active): https://github.com/WordPress/presence-api
- Announcement: Presence API Feature Plugin
- Tag for ongoing posts: https://make.wordpress.org/core/tag/presence-api/
- Maintainer: @josephfusco
- Original ticket motivating the work: WordPress core Trac #64696 (high-frequency ephemeral data without cache invalidation).
From the file to a first result
The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.
View the source and supporting filesThis download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.
1. Download the file
Download SKILL.mdFrom the root of a test project, save the file as .skill-downloads/wordpress-presence-api-experimental-msh3uub2/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.
Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.
mkdir -p '.skill-downloads/wordpress-presence-api-experimental-msh3uub2' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/wordpress-presence-api-experimental-msh3uub2/download' --output '.skill-downloads/wordpress-presence-api-experimental-msh3uub2/SKILL.md.part' && mv '.skill-downloads/wordpress-presence-api-experimental-msh3uub2/SKILL.md.part' '.skill-downloads/wordpress-presence-api-experimental-msh3uub2/SKILL.md'2. Check prerequisites
Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.
No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.
The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.
3. Load the skill
After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.
Claude Code
test -f '.skill-downloads/wordpress-presence-api-experimental-msh3uub2/SKILL.md' && test -s '.skill-downloads/wordpress-presence-api-experimental-msh3uub2/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/wp-presence-api' && cp -R '.skill-downloads/wordpress-presence-api-experimental-msh3uub2' '.claude/skills/wp-presence-api'Cursor
test -f '.skill-downloads/wordpress-presence-api-experimental-msh3uub2/SKILL.md' && test -s '.skill-downloads/wordpress-presence-api-experimental-msh3uub2/SKILL.md' && mkdir -p '.cursor/skills' && test ! -e '.cursor/skills/wp-presence-api' && cp -R '.skill-downloads/wordpress-presence-api-experimental-msh3uub2' '.cursor/skills/wp-presence-api'Codex
test -f '.skill-downloads/wordpress-presence-api-experimental-msh3uub2/SKILL.md' && test -s '.skill-downloads/wordpress-presence-api-experimental-msh3uub2/SKILL.md' && mkdir -p '.agents/skills' && test ! -e '.agents/skills/wp-presence-api' && cp -R '.skill-downloads/wordpress-presence-api-experimental-msh3uub2' '.agents/skills/wp-presence-api'OpenSkills
OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.
Official OpenSkills installationopenskills install './.skill-downloads/wordpress-presence-api-experimental-msh3uub2'openskills read 'wordpress-presence-api-experimental-msh3uub2'Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.
For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.
openskills syncManual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.
4. Try a first task
Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:
Read .skill-downloads/wordpress-presence-api-experimental-msh3uub2/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.
React Hook Form Best Practices
Development
Master React Hook Form: avoid anti-patterns, manage subscriptions, and handle reset, dirty state, and controlled inputs correctly.
Emotion to Mantine Migration
Development
Migrate Emotion styled-components to Mantine components with style props and CSS modules. Use when converting .styled.tsx files or removing @emotion imports.
Scope Creep Detector
Development
Analyzes git diffs against a stated intent to detect scope creep, unrelated files, broad PRs, and oversized changes, then suggests keep, split, or justify actions.