specs-sync-kit

Implements multiplayer shared-state AR experiences for Spectacles using SpectaclesSyncKit Connected Lenses.

16|2|Updated Apr 13, 2026
One-click install
npx skills add https://github.com/lens-studio-devs/ls-extensions --skill specs-sync-kit-lens-studio-devs
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: specs-sync-kit
Source: https://github.com/lens-studio-devs/ls-extensions/tree/main/plugins/ls-clad/skills/specs-sync-kit
Command: npx skills add https://github.com/lens-studio-devs/ls-extensions --skill specs-sync-kit-lens-studio-devs

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes scripts (resource) and references (resource) components.

What problem does it solve? Building multiplayer, colocated AR lenses for Spectacles requires correctly wiring SpectaclesSyncKit's session lifecycle, ownership model, storage properties, and prefab instantiation — a process where silent runtime failures (missed ownership claims, desynced state, misplaced content) are common without a proven recipe. ## Core Features & Use Cases - Complete SyncKit API guidance: Covers SessionController, SyncEntity, StorageProperty, Instantiator, SyncTransform, networked events, and the notifyOnReady readiness gates with verbatim API names. - Copy-paste TypeScript recipes: Ready-made components for name tags, host-only and per-player spawners, scoreboards, collectibles, turn-taking games, synced timers, ownership-transfer game pieces, and persistent/transient spawners. - Pitfall prevention: Documents mock-preview asymmetries, host-gating decisions (doIOwnStore vs isHost), late-joiner handshakes, and setup checks like disabling the bundled Examples object and verifying targetPlatform. - Use Case: Build a two-player colocated AR board game where each player drags shared pieces with cooperative ownership transfer, a synced scoreboard tracks both teams, and late joiners discover existing peers automatically. ## Quick Start Use the specs-sync-kit skill to set up SpectaclesSyncKit in my Lens Studio project and create a per-player name tag that floats above each user's head in a shared session.

Frequently Asked Questions about specs-sync-kit

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I build a multiplayer AR lens for Spectacles?

Install Spectacles Sync Kit from the Asset Library, drag the SpectaclesInteractionKit and SpectaclesSyncKit prefabs into the scene, and place synced content under Colocated World / EnableOnReady. Use SyncEntity with StorageProperty for shared state and Instantiator for networked prefab spawning.

How do I sync a SceneObject transform across Spectacles devices?

Add the Inspector-configured SyncTransform component with Position and Rotation set to Location for colocated content. For selective axes or conditional sync, use StorageProperty.forPosition and forRotation with PropertyType.Location on a SyncEntity instead.

Should I use doIOwnStore or isHost for host gating in SyncKit?

Use syncEntity.doIOwnStore() on a claimOwnership:true entity for per-entity write authority, which covers most game-state writes. Use SessionController.isHost() === true only for session-wide authority or early initialization before any SyncEntity exists.

Why does my SyncKit lens work in MULTIPLAYER preview but break in START_MENU mode?

The notifyOnReady timing differs between modes: START_MENU fires per-pane when each user taps Multiplayer, so event handlers wired in onAwake can miss firings that already happened on a peer. Pair every subscription with a per-frame retry in UpdateEvent for authority transitions.

How do late joiners discover existing players in a Connected Lens session?

sendEvent does not replay history, so late joiners miss earlier presence broadcasts. Implement a re-announce handshake where each pane re-broadcasts its connectionId when it hears a new peer, or read initial state via getUsers() and readAll on the RealtimeStore.

What are the SpectaclesSyncKit networked event payload limits?

Networked event payloads must be JSON-serializable and are limited to 100 KB per message and 350 messages per 5-second window per session. Use StorageProperty for persistent state that joiners must see, reserving events for one-shot signals.