← sync. labsCONTENT HISTORY

Update to sync. labs

Snapshot Nov 6, 2026 · 18:14 UTC · version 2.1.1

WHAT CHANGED

Package or technical metadata updated

Package or technical metadata updated

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Save sync. labs and check future changes in Following.

Up to 3 plugins free · no card required.

All fields and original values.

These are saved file metadata. Open a changed file to read its text edits.

Package file

Before

Nov 3, 2026 · 18:14 UTC

57be430d0a2e66eb5c0e9a26c195a8e9e544969883a7b6a07bdbcc82a2fc1a69

After

Nov 6, 2026 · 18:14 UTC

039f542ee8388401f93a765963e5ccbe614ad5043c7f63cab64c82d63fdf35a9

Package file

Before

Nov 3, 2026 · 18:14 UTC

3436

After

Nov 6, 2026 · 18:14 UTC

3477

Package file

Before

Nov 3, 2026 · 18:14 UTC

Not present

After

Nov 6, 2026 · 18:14 UTC

{"sha256":"5ea1e02f1e61e34fec4f22d82e0d099199621cb70cf29800a265a1b7a8fd1360","size":5751}

Package file

Before

Nov 3, 2026 · 18:14 UTC

Not present

After

Nov 6, 2026 · 18:14 UTC

{"sha256":"feedb17d19d88a1c87834635d39b362709453130f03e82c66916d758717775ba","size":233}

Compare saved observations

Download comparison JSON

Changed files

Choose a file to see its text changes. Binary or large files show metadata only.

.codex-plugin/plugin.json →

skills/ai-video-to-talking/SKILL.md →

skills/ai-video-to-talking/agents/openai.yaml →

skills/ai-video-to-talking/references/api.md →

skills/ai-video-to-talking/references/connect.md →

skills/ai-video-to-talking/references/media-input.md →

skills/ai-video-to-talking/references/source-clip.md →

skills/batch-lipsync/SKILL.md →

skills/batch-lipsync/agents/openai.yaml →

skills/batch-lipsync/references/batch-api.md →

skills/batch-lipsync/references/connect.md →

skills/batch-lipsync/references/media-input.md →

skills/batch-lipsync/scripts/sync_batch.py →

skills/edit-dialogue/SKILL.md →

skills/edit-dialogue/agents/openai.yaml →

skills/edit-dialogue/references/connect.md →

skills/edit-dialogue/references/media-input.md →

skills/lipsync-video/SKILL.md →

skills/lipsync-video/agents/openai.yaml →

skills/lipsync/SKILL.md →

skills/lipsync/agents/openai.yaml →

skills/lipsync/references/api.md →

skills/lipsync/references/connect.md →

skills/lipsync/references/media-input.md →

skills/localize-campaign/SKILL.md →

skills/localize-campaign/agents/openai.yaml →

skills/localize-campaign/references/api.md →

skills/localize-campaign/references/connect.md →

skills/localize-campaign/references/media-input.md →

skills/setup/SKILL.md →

skills/setup/agents/openai.yaml →

skills/setup/references/connect.md →

skills/sync-api/SKILL.md →

skills/sync-api/agents/openai.yaml →

skills/sync-api/references/api.md →

skills/sync-api/references/batch-api.md →

skills/sync-api/references/python.md →

skills/sync-api/references/typescript.md →

skills/sync-api/references/webhooks.md →

skills/talking-photo/SKILL.md →

skills/talking-photo/agents/openai.yaml →

skills/talking-photo/references/api.md →

skills/talking-photo/references/connect.md →

skills/talking-photo/references/media-input.md →

skills/translate-and-dub/SKILL.md →

skills/translate-and-dub/agents/openai.yaml →

skills/translate-and-dub/references/api.md →

skills/translate-and-dub/references/connect.md →

skills/translate-and-dub/references/media-input.md →

skills/troubleshoot/SKILL.md →

skills/troubleshoot/agents/openai.yaml →

skills/troubleshoot/references/connect.md →

skills/troubleshoot/references/media-input.md →

skills/sync-api/references/python.md

− removed · + added

--- before
+++ after
@@ -0,0 +1,113 @@
+# Python integration
+
+`pip install syncsdk`. It brings in `httpx`, which the HTTP-only calls below also use. Python 3.8+.
+
+```python
+import json
+import mimetypes
+import os
+import pathlib
+import time
+import uuid
+
+import httpx
+from sync import Sync
+from sync.common import Audio, Video
+from sync.core.api_error import ApiError
+
+API = "https://api.sync.so/v2"
+HEADERS = {"x-api-key": os.environ["SYNC_API_KEY"]}
+client = Sync()  # reads SYNC_API_KEY
+
+
+def upload(path: str, kind: str) -> str:
+    """Upload a local file into sync. storage and return its asset ID. kind: VIDEO, AUDIO or IMAGE."""
+    file = pathlib.Path(path)
+    content_type = mimetypes.guess_type(file.name)[0] or "application/octet-stream"
+    presign = httpx.post(f"{API}/assets/upload", headers=HEADERS, timeout=30,
+                         json={"fileName": file.name, "contentType": content_type, "size": file.stat().st_size})
+    presign.raise_for_status()
+    target = presign.json()
+    # The presigned upload URL must not receive the API key.
+    with file.open("rb") as body:
+        httpx.put(target["uploadUrl"], content=body, headers={"Content-Type": content_type}, timeout=600).raise_for_status()
+    asset = httpx.post(f"{API}/assets", headers=HEADERS, timeout=30, json={"url": target["url"], "type": kind})
+    asset.raise_for_status()
+    return asset.json()["id"]
+
+
+def estimate(model: str, seconds: float) -> float:
+    resp = httpx.post(f"{API}/generations/estimate", headers=HEADERS, timeout=30,
+                      json={"model": model, "duration": seconds})
+    resp.raise_for_status()
+    return resp.json()["estimatedGenerationCost"]  # USD
+
+
+def start_lipsync(job: dict) -> str:
+    """job is your persisted record: video/audio asset IDs and an idempotency key, all saved before this call."""
+    while True:
+        try:
+            generation = client.generations.create(
+                model="sync-3",
+                input=[Video(asset_id=job["video_asset_id"]), Audio(asset_id=job["audio_asset_id"])],
+                options={"sync_mode": "bounce"},
+                webhook_url=job.get("webhook_url"),
+                request_options={"additional_headers": {"Idempotency-Key": job["idempotency_key"]}},
+            )
+            return generation.id
+        except ApiError as err:
+            body = err.body if isinstance(err.body, dict) else {}
+            if err.status_code == 429:
+                time.sleep(float(body.get("retryAfterSeconds", 20)))
+                continue  # same key, so no duplicate generation
+            if err.status_code == 409 and body.get("generationId"):
+                return body["generationId"]
+            raise
+
+
+def wait_for(generation_id: str) -> str:
+    """Polling fallback. Prefer a webhook in production."""
+    while True:
+        resp = httpx.get(f"{API}/generate/{generation_id}", headers=HEADERS, timeout=30,
+                         params={"wait": "true", "timeout": 10})
+        resp.raise_for_status()
+        generation = resp.json()
+        if generation["status"] == "COMPLETED":
+            return generation["outputUrl"]
+        if generation["status"] in ("FAILED", "REJECTED"):
+            raise RuntimeError(f"{generation['status']}: {generation.get('errorCode')} {generation.get('error')}")
+        time.sleep(2)
+
+
+JOB_FILE = pathlib.Path("lipsync-job.json")  # stands in for a row in your database
+
+
+def load_or_create_job() -> dict:
+    """Save the asset IDs and the idempotency key before creating, so a restart can't pay twice."""
+    if JOB_FILE.exists():
+        return json.loads(JOB_FILE.read_text())
+    job = {
+        "video_asset_id": upload("talk.mp4", "VIDEO"),
+        "audio_asset_id": upload("new-take.wav", "AUDIO"),
+        "idempotency_key": str(uuid.uuid4()),
+    }
+    JOB_FILE.write_text(json.dumps(job))
+    return job
+
+
+if __name__ == "__main__":
+    job = load_or_create_job()
+    if not job.get("generation_id"):
+        print("Estimated cost: $%.2f" % estimate("sync-3", 12.0))
+        job["generation_id"] = start_lipsync(job)
+        JOB_FILE.write_text(json.dumps(job))
+    # After a restart this polls the saved generation instead of creating another one.
+    print("Output:", wait_for(job["generation_id"]))
+```
+
+## Variations
+
+- **Script instead of audio:** `from sync.common import Tts, ElevenLabs`, then `Tts(provider=ElevenLabs(voice_id="<voiceId>", script="Hello!"))` in place of `Audio(...)`. List voices with `GET /v2/voices`.
+- **Image input, `dubParams`, `projectId`:** if your installed `syncsdk` doesn't type them yet, send the same JSON body with `httpx.post(f"{API}/generate", headers={**HEADERS, "Idempotency-Key": key}, json=body)`.
+- **Async code:** `from sync import AsyncSync` has the same methods, awaited.
+- **Batch:** `client.batch.create(input=open("rows.jsonl", "rb"), dry_run=True)`, then without `dry_run`. Batch creation isn't idempotent, so leave retries off (the Python SDK's default is 0), record that you're submitting before the call, and after a timeout check `GET /v2/batch` before sending it again. See `batch-api.md`.
Full technical diff · 62 changed fields

changed /files/.codex-plugin~1plugin.json/sha256

BEFORE
"57be430d0a2e66eb5c0e9a26c195a8e9e544969883a7b6a07bdbcc82a2fc1a69"
AFTER
"039f542ee8388401f93a765963e5ccbe614ad5043c7f63cab64c82d63fdf35a9"

changed /files/.codex-plugin~1plugin.json/size

BEFORE
3436
AFTER
3477

added /files/skills~1ai-video-to-talking~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "5ea1e02f1e61e34fec4f22d82e0d099199621cb70cf29800a265a1b7a8fd1360",
  "size": 5751
}

added /files/skills~1ai-video-to-talking~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "feedb17d19d88a1c87834635d39b362709453130f03e82c66916d758717775ba",
  "size": 233
}

added /files/skills~1ai-video-to-talking~1references~1api.md

BEFORE
Field was absent
AFTER
{
  "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
  "size": 4169
}

added /files/skills~1ai-video-to-talking~1references~1connect.md

BEFORE
Field was absent
AFTER
{
  "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
  "size": 3346
}

added /files/skills~1ai-video-to-talking~1references~1media-input.md

BEFORE
Field was absent
AFTER
{
  "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
  "size": 3853
}

added /files/skills~1ai-video-to-talking~1references~1source-clip.md

BEFORE
Field was absent
AFTER
{
  "sha256": "8546d0a63b02210027655531e3fb1a20bcbdfec10894f740897f1e8f892d370b",
  "size": 2167
}

added /files/skills~1batch-lipsync~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "1c207d521664b8587de3910bafb04a0721999bfa0692b4a6e74cc4cd78c7395f",
  "size": 6425
}

added /files/skills~1batch-lipsync~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "8bcd0983adff0da6aa5177a2a87e9de425ea9115d195ad8ca1b95421a41b71a8",
  "size": 194
}

added /files/skills~1batch-lipsync~1references~1batch-api.md

BEFORE
Field was absent
AFTER
{
  "sha256": "3f9caaaccdda807942d04d3328beb16c3105ed181ee2a80f8caf6f5a985f745a",
  "size": 3787
}

added /files/skills~1batch-lipsync~1references~1connect.md

BEFORE
Field was absent
AFTER
{
  "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
  "size": 3346
}

added /files/skills~1batch-lipsync~1references~1media-input.md

BEFORE
Field was absent
AFTER
{
  "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
  "size": 3853
}

added /files/skills~1batch-lipsync~1scripts~1sync_batch.py

BEFORE
Field was absent
AFTER
{
  "sha256": "b4c01decdcdc3eb8be8f5535f379ed41faa2b4e687d56ac4fe1859b33651359c",
  "size": 27525
}

changed /files/skills~1edit-dialogue~1SKILL.md/sha256

BEFORE
"880aa5421d80a7a3c395a2367e070221daf63f958dde13b912cdd763fd74a2ba"
AFTER
"64879bd5ede7d75261f7fd72f690bb89b316050c16d8d790237c4078ed1bde6f"

changed /files/skills~1edit-dialogue~1SKILL.md/size

BEFORE
3594
AFTER
5141

changed /files/skills~1edit-dialogue~1agents~1openai.yaml/sha256

BEFORE
"e02542ea183d7a3d356091aa412a5c55541cd66aa8210b203431bd779a15b43b"
AFTER
"6159ae06234f0f4991c7ac061231bb33f1d4f5cd822bc6b5fb5a8471697ac94e"

changed /files/skills~1edit-dialogue~1agents~1openai.yaml/size

BEFORE
203
AFTER
206

added /files/skills~1edit-dialogue~1references~1connect.md

BEFORE
Field was absent
AFTER
{
  "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
  "size": 3346
}

added /files/skills~1edit-dialogue~1references~1media-input.md

BEFORE
Field was absent
AFTER
{
  "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
  "size": 3853
}

removed /files/skills~1lipsync-video~1SKILL.md

BEFORE
{
  "sha256": "a10625f62c954ffcce19392f631a0421813ecda225285828ff74c8ceb6817076",
  "size": 4395
}
AFTER
Field is absent

removed /files/skills~1lipsync-video~1agents~1openai.yaml

BEFORE
{
  "sha256": "a1ae3cfeb2b6c118912a63b3edb198f314c2d735b9eb3487e90602a8d12631cf",
  "size": 205
}
AFTER
Field is absent

added /files/skills~1lipsync~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "aab4944b204493b12920917cd90b4e9999ce6eaa7c362ef302571cd2bad37a2c",
  "size": 5124
}

added /files/skills~1lipsync~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "a611c56385745beb85b4c222011857be45ad6c7af583d885b18009d635ac39be",
  "size": 194
}

added /files/skills~1lipsync~1references~1api.md

BEFORE
Field was absent
AFTER
{
  "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
  "size": 4169
}

added /files/skills~1lipsync~1references~1connect.md

BEFORE
Field was absent
AFTER
{
  "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
  "size": 3346
}

added /files/skills~1lipsync~1references~1media-input.md

BEFORE
Field was absent
AFTER
{
  "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
  "size": 3853
}

added /files/skills~1localize-campaign~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "48176aacaaaef977a806f2509ad4f7955e9375f0dd7363d4629f57ab6f5ba4f0",
  "size": 5089
}

added /files/skills~1localize-campaign~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "2681aa94d3de0b50ac2dcbe513cfa8f1ba1ce2653d32d0f8ff8e6c7c0cad41bf",
  "size": 218
}

added /files/skills~1localize-campaign~1references~1api.md

BEFORE
Field was absent
AFTER
{
  "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
  "size": 4169
}

added /files/skills~1localize-campaign~1references~1connect.md

BEFORE
Field was absent
AFTER
{
  "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
  "size": 3346
}

added /files/skills~1localize-campaign~1references~1media-input.md

BEFORE
Field was absent
AFTER
{
  "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
  "size": 3853
}

changed /files/skills~1setup~1SKILL.md/sha256

BEFORE
"7687308da0731c5ef23a4ad4352610d0f71023d0d611a637d27178d96468cb1e"
AFTER
"904bb4d86c53eaf1753e28ae3c70a7a9099298ce984bd5b3553171ee7c8b3f98"

changed /files/skills~1setup~1SKILL.md/size

BEFORE
1811
AFTER
2452

changed /files/skills~1setup~1agents~1openai.yaml/sha256

BEFORE
"854273f833b6ee10c8b34e7ce203fef8ee58181208977851eddc28188d17302c"
AFTER
"c95bb92bad2840d984fed9ac5b81dc8b9d8bca27905219cb23bfede8ba9e7598"

changed /files/skills~1setup~1agents~1openai.yaml/size

BEFORE
229
AFTER
244

added /files/skills~1setup~1references~1connect.md

BEFORE
Field was absent
AFTER
{
  "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
  "size": 3346
}

added /files/skills~1sync-api~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "1319bf8b74e31f7a8ea90907b0b1921cfb653a4014a2b36bc157d196d56dc7d3",
  "size": 5779
}

added /files/skills~1sync-api~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "50cc0dbcc9a0601d84d01f2d6a0f270b460e00f106688eae67742d7d8c36d21c",
  "size": 198
}

added /files/skills~1sync-api~1references~1api.md

BEFORE
Field was absent
AFTER
{
  "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
  "size": 4169
}

added /files/skills~1sync-api~1references~1batch-api.md

BEFORE
Field was absent
AFTER
{
  "sha256": "3f9caaaccdda807942d04d3328beb16c3105ed181ee2a80f8caf6f5a985f745a",
  "size": 3787
}

added /files/skills~1sync-api~1references~1python.md

BEFORE
Field was absent
AFTER
{
  "sha256": "4f1902a9daecbe0f2f8f4f0872a0a9d7cf991373c809fce589b6b77ad3e603c2",
  "size": 5050
}

added /files/skills~1sync-api~1references~1typescript.md

BEFORE
Field was absent
AFTER
{
  "sha256": "0a4b7d2236a8c4ffa9ca1fce5363813a07a93fade659f186080d83d8ab234f40",
  "size": 5665
}

added /files/skills~1sync-api~1references~1webhooks.md

BEFORE
Field was absent
AFTER
{
  "sha256": "b03f957d176006d5578fc2255689424736bab12069f9819829716fe88b6ee4d3",
  "size": 3381
}

changed /files/skills~1talking-photo~1SKILL.md/sha256

BEFORE
"39999c45ef608b062f5d154079690ef6cf31f5184513a88c6b8853f5ab2aa31b"
AFTER
"8a74d7fb7ccaf791e6b751e3eb88d7c63c78eed29523333490a89c0b8dd0787f"

changed /files/skills~1talking-photo~1SKILL.md/size

BEFORE
3723
AFTER
4616

changed /files/skills~1talking-photo~1agents~1openai.yaml/sha256

BEFORE
"cf50b0a370b0a7afe7b7b01b011e11c2ed2d34675a5917976d1c89a7a81b6643"
AFTER
"d26d7f517f4d8c2f74f9ea87cc04d084ddb27b775afc3810f63ec8d12bef3384"

changed /files/skills~1talking-photo~1agents~1openai.yaml/size

BEFORE
213
AFTER
192

added /files/skills~1talking-photo~1references~1api.md

BEFORE
Field was absent
AFTER
{
  "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
  "size": 4169
}

added /files/skills~1talking-photo~1references~1connect.md

BEFORE
Field was absent
AFTER
{
  "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
  "size": 3346
}

added /files/skills~1talking-photo~1references~1media-input.md

BEFORE
Field was absent
AFTER
{
  "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
  "size": 3853
}

changed /files/skills~1translate-and-dub~1SKILL.md/sha256

BEFORE
"540b899b2d5d5ab48d1b82a6867ebf328cf07f88260f8fff6d55121e63c3d98d"
AFTER
"a5dc78642d83853740678b1b147ca6e285c7729c7cb27ddf908969f0c811cf3a"

changed /files/skills~1translate-and-dub~1SKILL.md/size

BEFORE
3361
AFTER
3705

changed /files/skills~1translate-and-dub~1agents~1openai.yaml/sha256

BEFORE
"b3e44c828051940be246b69af9162ad981fcf09b05ec55e325fdf0b5c3b4784b"
AFTER
"3aa37f041039194300b7a7d276347cc351b47343f2e0e7a5f9471906ba4b37d9"

changed /files/skills~1translate-and-dub~1agents~1openai.yaml/size

BEFORE
221
AFTER
197

added /files/skills~1translate-and-dub~1references~1api.md

BEFORE
Field was absent
AFTER
{
  "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
  "size": 4169
}

added /files/skills~1translate-and-dub~1references~1connect.md

BEFORE
Field was absent
AFTER
{
  "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
  "size": 3346
}

added /files/skills~1translate-and-dub~1references~1media-input.md

BEFORE
Field was absent
AFTER
{
  "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
  "size": 3853
}

added /files/skills~1troubleshoot~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "fd3a3b42cf2841ee296ebb4598fd1f0b751ef159668cd985d63cc2091f92f00a",
  "size": 4745
}

added /files/skills~1troubleshoot~1agents~1openai.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "53dd5c854ff7bdfd343c92665efed3f87f12cf51123cce1c2d2e74a9bb1bec49",
  "size": 195
}

added /files/skills~1troubleshoot~1references~1connect.md

BEFORE
Field was absent
AFTER
{
  "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
  "size": 3346
}

added /files/skills~1troubleshoot~1references~1media-input.md

BEFORE
Field was absent
AFTER
{
  "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
  "size": 3853
}
Full snapshot data
{
  "files": {
    ".app.json": {
      "sha256": "065f3762ad1a4c2cd9a8ac6ddae574f0e9c3af1b17da64ad82f1483b203ad46c",
      "size": 101
    },
    ".codex-plugin/plugin.json": {
      "sha256": "039f542ee8388401f93a765963e5ccbe614ad5043c7f63cab64c82d63fdf35a9",
      "size": 3477
    },
    ".mcp.json": {
      "sha256": "78150adcf50228f4fe0d14a87e7c3199f3315b95a8624393025d3b2597a917a7",
      "size": 90
    },
    "assets/logo.png": {
      "sha256": "883e7d7abc470c735c256068205ef4582a2c6f561c6bcebcd3f5c011fe25804f",
      "size": 8266
    },
    "skills/ai-video-to-talking/SKILL.md": {
      "sha256": "5ea1e02f1e61e34fec4f22d82e0d099199621cb70cf29800a265a1b7a8fd1360",
      "size": 5751
    },
    "skills/ai-video-to-talking/agents/openai.yaml": {
      "sha256": "feedb17d19d88a1c87834635d39b362709453130f03e82c66916d758717775ba",
      "size": 233
    },
    "skills/ai-video-to-talking/references/api.md": {
      "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
      "size": 4169
    },
    "skills/ai-video-to-talking/references/connect.md": {
      "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
      "size": 3346
    },
    "skills/ai-video-to-talking/references/media-input.md": {
      "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
      "size": 3853
    },
    "skills/ai-video-to-talking/references/source-clip.md": {
      "sha256": "8546d0a63b02210027655531e3fb1a20bcbdfec10894f740897f1e8f892d370b",
      "size": 2167
    },
    "skills/batch-lipsync/SKILL.md": {
      "sha256": "1c207d521664b8587de3910bafb04a0721999bfa0692b4a6e74cc4cd78c7395f",
      "size": 6425
    },
    "skills/batch-lipsync/agents/openai.yaml": {
      "sha256": "8bcd0983adff0da6aa5177a2a87e9de425ea9115d195ad8ca1b95421a41b71a8",
      "size": 194
    },
    "skills/batch-lipsync/references/batch-api.md": {
      "sha256": "3f9caaaccdda807942d04d3328beb16c3105ed181ee2a80f8caf6f5a985f745a",
      "size": 3787
    },
    "skills/batch-lipsync/references/connect.md": {
      "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
      "size": 3346
    },
    "skills/batch-lipsync/references/media-input.md": {
      "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
      "size": 3853
    },
    "skills/batch-lipsync/scripts/sync_batch.py": {
      "sha256": "b4c01decdcdc3eb8be8f5535f379ed41faa2b4e687d56ac4fe1859b33651359c",
      "size": 27525
    },
    "skills/edit-dialogue/SKILL.md": {
      "sha256": "64879bd5ede7d75261f7fd72f690bb89b316050c16d8d790237c4078ed1bde6f",
      "size": 5141
    },
    "skills/edit-dialogue/agents/openai.yaml": {
      "sha256": "6159ae06234f0f4991c7ac061231bb33f1d4f5cd822bc6b5fb5a8471697ac94e",
      "size": 206
    },
    "skills/edit-dialogue/references/connect.md": {
      "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
      "size": 3346
    },
    "skills/edit-dialogue/references/media-input.md": {
      "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
      "size": 3853
    },
    "skills/lipsync/SKILL.md": {
      "sha256": "aab4944b204493b12920917cd90b4e9999ce6eaa7c362ef302571cd2bad37a2c",
      "size": 5124
    },
    "skills/lipsync/agents/openai.yaml": {
      "sha256": "a611c56385745beb85b4c222011857be45ad6c7af583d885b18009d635ac39be",
      "size": 194
    },
    "skills/lipsync/references/api.md": {
      "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
      "size": 4169
    },
    "skills/lipsync/references/connect.md": {
      "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
      "size": 3346
    },
    "skills/lipsync/references/media-input.md": {
      "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
      "size": 3853
    },
    "skills/localize-campaign/SKILL.md": {
      "sha256": "48176aacaaaef977a806f2509ad4f7955e9375f0dd7363d4629f57ab6f5ba4f0",
      "size": 5089
    },
    "skills/localize-campaign/agents/openai.yaml": {
      "sha256": "2681aa94d3de0b50ac2dcbe513cfa8f1ba1ce2653d32d0f8ff8e6c7c0cad41bf",
      "size": 218
    },
    "skills/localize-campaign/references/api.md": {
      "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
      "size": 4169
    },
    "skills/localize-campaign/references/connect.md": {
      "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
      "size": 3346
    },
    "skills/localize-campaign/references/media-input.md": {
      "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
      "size": 3853
    },
    "skills/setup/SKILL.md": {
      "sha256": "904bb4d86c53eaf1753e28ae3c70a7a9099298ce984bd5b3553171ee7c8b3f98",
      "size": 2452
    },
    "skills/setup/agents/openai.yaml": {
      "sha256": "c95bb92bad2840d984fed9ac5b81dc8b9d8bca27905219cb23bfede8ba9e7598",
      "size": 244
    },
    "skills/setup/references/connect.md": {
      "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
      "size": 3346
    },
    "skills/sync-api/SKILL.md": {
      "sha256": "1319bf8b74e31f7a8ea90907b0b1921cfb653a4014a2b36bc157d196d56dc7d3",
      "size": 5779
    },
    "skills/sync-api/agents/openai.yaml": {
      "sha256": "50cc0dbcc9a0601d84d01f2d6a0f270b460e00f106688eae67742d7d8c36d21c",
      "size": 198
    },
    "skills/sync-api/references/api.md": {
      "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
      "size": 4169
    },
    "skills/sync-api/references/batch-api.md": {
      "sha256": "3f9caaaccdda807942d04d3328beb16c3105ed181ee2a80f8caf6f5a985f745a",
      "size": 3787
    },
    "skills/sync-api/references/python.md": {
      "sha256": "4f1902a9daecbe0f2f8f4f0872a0a9d7cf991373c809fce589b6b77ad3e603c2",
      "size": 5050
    },
    "skills/sync-api/references/typescript.md": {
      "sha256": "0a4b7d2236a8c4ffa9ca1fce5363813a07a93fade659f186080d83d8ab234f40",
      "size": 5665
    },
    "skills/sync-api/references/webhooks.md": {
      "sha256": "b03f957d176006d5578fc2255689424736bab12069f9819829716fe88b6ee4d3",
      "size": 3381
    },
    "skills/talking-photo/SKILL.md": {
      "sha256": "8a74d7fb7ccaf791e6b751e3eb88d7c63c78eed29523333490a89c0b8dd0787f",
      "size": 4616
    },
    "skills/talking-photo/agents/openai.yaml": {
      "sha256": "d26d7f517f4d8c2f74f9ea87cc04d084ddb27b775afc3810f63ec8d12bef3384",
      "size": 192
    },
    "skills/talking-photo/references/api.md": {
      "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
      "size": 4169
    },
    "skills/talking-photo/references/connect.md": {
      "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
      "size": 3346
    },
    "skills/talking-photo/references/media-input.md": {
      "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
      "size": 3853
    },
    "skills/translate-and-dub/SKILL.md": {
      "sha256": "a5dc78642d83853740678b1b147ca6e285c7729c7cb27ddf908969f0c811cf3a",
      "size": 3705
    },
    "skills/translate-and-dub/agents/openai.yaml": {
      "sha256": "3aa37f041039194300b7a7d276347cc351b47343f2e0e7a5f9471906ba4b37d9",
      "size": 197
    },
    "skills/translate-and-dub/references/api.md": {
      "sha256": "f8fb4753c43c8dad50600409aa5e09bf8e540a4828990e277a0fc60130a062a2",
      "size": 4169
    },
    "skills/translate-and-dub/references/connect.md": {
      "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
      "size": 3346
    },
    "skills/translate-and-dub/references/media-input.md": {
      "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
      "size": 3853
    },
    "skills/troubleshoot/SKILL.md": {
      "sha256": "fd3a3b42cf2841ee296ebb4598fd1f0b751ef159668cd985d63cc2091f92f00a",
      "size": 4745
    },
    "skills/troubleshoot/agents/openai.yaml": {
      "sha256": "53dd5c854ff7bdfd343c92665efed3f87f12cf51123cce1c2d2e74a9bb1bec49",
      "size": 195
    },
    "skills/troubleshoot/references/connect.md": {
      "sha256": "a3ca25776209ce4ceaac1233e6b58494b1bc59e90509f09d6c36629350d5b3e1",
      "size": 3346
    },
    "skills/troubleshoot/references/media-input.md": {
      "sha256": "8029e5aca62797e02c375cc4d8ebe079383c6e900afe2ce13aad410552219e32",
      "size": 3853
    }
  }
}

SHA-256 of public snapshot: 40babc6b1efb94fcdb0f4a78ada23d0aa6650c4761dde8b069ec90fdaee8c901