Official agent skill

Notion Worker Sync Scaffold

by makenotion in makenotion/workers-template

Walks you through designing a new sync for a Notion Worker, covering data source, mode, pagination and cursors, and then generates working code.

OfficialMITAuto-check: notesBackend & APIs

Install Notion Worker Sync Scaffold

skills CLI
$ npx skills add makenotion/workers-template --skill sync -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install makenotion/workers-template sync --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/makenotion/workers-template.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/sync .claude/skills/sync && rm -rf skills-src

Use ~/.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/

Facts

Skill name
sync
GitHub stars
439
Used in
1 other repo
Token cost
~4.6k tokens
SKILL.md length
2,266 words
Files
1
Skills in repo
5
Repo updated
First seen
Licence
MIT

At a glance

Walks you through designing a new sync for a Notion Worker, covering data source, mode, pagination and cursors, and then generates working code.

  • Works in 9 steps: Understand the Data Source → Determine the Right Architecture → Design the Schema → …
  • Adding a new data sync to a Notion Worker project
  • Calls npm and npx; needs JIRA_API_TOKEN
  • Choosing between a replace sync and a backfill plus delta pair for an API

What it does

The agent interviews you about what data you want to sync, such as Jira issues or Stripe customers, and looks up the source API's pagination and change-tracking features: an updated_at field, an events endpoint or cursors. Before asking anything it reads the sync-guide reference files and the project's src/index.ts to see what already exists.

It then recommends one of two designs. A simple replace sync re-fetches everything each cycle and suits small sources or APIs without change tracking. A backfill plus delta pair writes two syncs into the same database: a manually triggered full backfill in replace mode and a frequent incremental delta sync. Change tracking, not dataset size, decides which one fits. Code is generated at the end of the walkthrough.

When your agent uses it

  • Adding a new data sync to a Notion Worker project
  • Choosing between a replace sync and a backfill plus delta pair for an API
  • Designing pagination and cursor handling for a source API

Example prompts

  • “Add a sync that pulls our Linear issues into a Notion database.”
  • “Help me design a sync for Stripe customers, including pagination and cursors.”
  • “I need a Notion Worker sync for a small internal API that has no updated_at field.”

Requirements

  • A Notion Worker project created from the workers template
  • Pre-approved tools (allowed-tools): Read, Edit, Write, Bash, Glob, Grep, Agent

Workflow steps

9 steps, taken from the step headings in SKILL.md.

  1. Understand the Data Source
  2. Determine the Right Architecture
  3. Design the Schema
  4. Design the State Machine
  5. Set Up Authentication
  6. Generate the Code
  7. Test Locally
  8. Deploy and Validate with Preview
  9. Go Live

What it can do on your machine

Read from SKILL.md and the folder at commit 681d89d. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Edit
    • Write
    • Bash
    • Glob
    • Grep
    • Agent

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npm
    • npx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npm and npx, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • JIRA_API_TOKEN

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Notion Worker Sync Scaffold loads about 4.6k tokens when it runs. Until then it costs about 36 tokens; SKILL.md has 2,266 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~36
When it runs · the whole SKILL.md, loaded when a task matches
~4.6k

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.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:192
    directly to `.env` themselves. Never ask them to send the values in chat:
  • NoteMentions a .env fileSKILL.md:197
    If `.env` doesn't exist, create it. The `.env` file is automatically loaded
  • NoteMentions a .env fileSKILL.md:204
    app's client ID and secret. These go in `.env`:
  • NoteMentions a .env fileSKILL.md:234
    access token into `.env`. Before that bootstrap, `.accessToken()` fails because
  • NoteMentions a .env fileSKILL.md:279
    e execute function on your machine with `.env` loaded.
  • NoteMentions a .env fileSKILL.md:297
    If the user has API credentials in `.env`, write a test that hits the real
  • NoteMentions a .env fileSKILL.md:304
    import "dotenv/config"; // load .env
  • NoteMentions a .env fileSKILL.md:350
    2. `ntn workers env push` — push `.env` secrets to remote
  • NoteMentions a .env fileSKILL.md:355
    2. `ntn workers env push` — push `.env` secrets to remote
  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Read, Edit, Write, Bash, Glob, Grep, Agent

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.

SKILL.md

The full file from makenotion/workers-template at commit 681d89d, republished under its MIT licence (© makenotion). 2,266 words, ~4,584 tokens.

Download SKILL.mdSave it as .claude/skills/sync/SKILL.md (or your agent's skills folder).
name
sync
description
Scaffold a new sync capability with guided setup — asks about data source, mode, pagination, and cursor design, then generates working code
allowed-tools
Read, Edit, Write, Bash, Glob, Grep, Agent
user-invocable
true
disable-model-invocation
true

Instructions

You are helping the user create a new sync capability for their Notion Worker. Walk through each step, asking questions and making recommendations. Generate working code at the end.

Before you begin, read these reference files to understand sync patterns:

  • .agents/skills/sync-guide/SKILL.md — concepts, modes, patterns, common mistakes
  • .agents/skills/sync-guide/api-pagination-patterns.md — real-world API strategies
  • .agents/skills/sync-guide/examples/ — working code templates

Also read the current src/index.ts to understand what already exists.

Step 1: Understand the Data Source

Ask the user:

  • What data are you syncing? (e.g., "Jira issues", "Stripe customers", "ServiceNow tickets")

If they name a well-known API, look up its pagination mechanism and change-tracking capabilities (does it have updated_at? an events endpoint? cursor-based pagination?).

Step 2: Determine the Right Architecture

Based on what you know about the data source, recommend one of two architectures:

Simple replace sync

Use when: the source is small (<1k records) OR the API has no change tracking (no updated_at, no event feed).

One sync, replace mode. Re-fetches everything each cycle. The runtime auto-deletes records that disappear from the source. Simplest option.

Backfill + delta pair

Use when: the API supports change tracking (updated_at, events, changelog) — this covers most enterprise APIs (Salesforce, Stripe, Linear, GitHub, HubSpot).

Two separate syncs writing to the same database:

  • Backfill sync (replace mode, schedule: "manual"): Paginates the full dataset. Triggered manually via CLI when a full re-import is needed. Replace mode's mark-and-sweep automatically cleans up records deleted from the source.
  • Delta sync (incremental mode, schedule: "5m" or similar): Fetches only recently changed records. Runs on a timer for low-latency updates.

Advantages over a single bi-modal sync:

  • No phase discrimination in state — each sync has simple, focused state
  • No backfill-to-delta transition logic
  • Backfill and delta run independently — re-backfill anytime without disrupting delta
  • Easier to reason about and debug

Change tracking drives the decision, not dataset size. A Linear workspace may only have a few thousand issues, but its API supports the queries needed for delta sync, so backfill+delta is the right choice. Conversely, a website listing local pickleball courts has no updated_since endpoint regardless of how many records it has.

Recommend an architecture with a brief explanation. Let the user override if they disagree.

Step 3: Design the Schema

Based on the API's response shape, propose a schema. Look up what fields the API returns and map the most useful ones to Schema types. Don't ask the user to enumerate fields — propose a sensible default and let them adjust.

For example, if syncing Jira issues, propose:

ts
const issuesDb = worker.database("issuesDb", {
  type: "managed",
  initialTitle: "Jira Issues",
  primaryKeyProperty: "Issue Key",
  schema: {
    properties: {
      "Issue Key": Schema.richText(),    // primaryKeyProperty — the unique ID
      "Summary": Schema.title(),         // the main display field
      "Status": Schema.select([
        { name: "To Do" },
        { name: "In Progress", color: "yellow" },
        { name: "Done", color: "green" },
      ]),                                // mapped from Jira statuses
      "Assignee": Schema.richText(),     // or Schema.people() if email available
      "Updated": Schema.date(),
    },
  },
});

Guidelines:

  • Declare the database with worker.database() and reference the handle in worker.sync()
  • Every schema needs exactly one Schema.title() — pick the most descriptive field
  • Use Schema.richText() for the primary key property (the unique ID)
  • Treat property order as product design, not API order. Put the title first, followed by the five properties that best help an end user recognize, evaluate, or act on the record.
  • Keep opaque IDs, sync keys, timestamps used only for cursors, and other implementation metadata out of the first six properties. Include a user-facing identifier such as an order number or issue key early only when users genuinely rely on it.
  • Use Schema.url(), Schema.email(), Schema.date(), Schema.number(), Schema.checkbox(), Schema.select() where the data type fits
  • Use Schema.relation("otherDatabaseKey") for relations to another managed database
  • Start with 10-20 properties — be generous, include most useful fields from the API
  • See the full type list in .agents/skills/sync-guide/SKILL.md under "Schema Reference"

Present the proposed schema to the user and ask if they want to add, remove, or change any fields before generating code.

Step 4: Design the State Machine

Research the API to determine its pagination and change-tracking mechanisms. Do NOT ask the user about pagination details — figure it out from the API docs, your knowledge of the API, or by looking up the API. The user shouldn't need to know whether their API uses opaque cursors vs page numbers.

You need to determine:

  1. How the API paginates list results (opaque cursor, page number, offset, keyset)
  2. Whether the API has change tracking (updated_at field, events endpoint, changelog)
  3. Whether the API has deletion signals (archived filter, audit log, delete events)

Then design the state accordingly:

For simple replace syncs: State is just within-cycle pagination.

  • Opaque cursor: { cursor: string | null }
  • Page number: { page: number }

For backfill + delta pairs: Each sync has its own simple state — no bi-modal discriminated union needed.

  • Backfill state: Just pagination cursor for walking the full dataset. Depends on how the API paginates its list endpoint:

    • Opaque cursor: { cursor: string | null }
    • Page number: { page: number }
    • Keyset: { cursorTimestamp: string | null; cursorId: string | null }
  • Delta state: Change-tracking cursor for fetching recent modifications. Depends on how the API exposes changes:

    • Opaque cursor (API sorted by updated_at): { cursor: string | null }
    • Timestamp keyset: { cursorTimestamp: string; cursorId: string }
    • Event ID: { eventCursor: string }

Consistency buffer (delta syncs only): In incremental mode the cursor never resets, so if you advance past a record that hasn't been indexed yet, it's lost permanently. Apply a consistency buffer: never advance the cursor closer than 10-15 seconds to "now". This is especially important for APIs with eventual consistency (Stripe, Salesforce, etc.).

Deletion handling: There are three cases to consider:

  1. API supports delta deletes (e.g., Stripe events with *.deleted types, APIs that return deleted: true in change feeds): Emit { type: "delete", key } in the delta sync. This is the cleanest approach.
  2. Deletes are rare or irrelevant for the use case: No action needed. Stale records remain in Notion but don't cause problems.
  3. Deletes matter but the API has no delete signal: The backfill sync's replace mode handles this automatically — its mark-and-sweep deletes any records not seen during the full cycle. Trigger a backfill periodically to clean up stale records.

If the API has no change tracking at all, go back and recommend a simple replace sync instead.

Present your state design to the user as a brief summary (e.g., "This API uses cursor-based pagination and has an updated_at field, so I'll use a backfill+delta pair with opaque cursor for backfill and timestamp keyset for delta"). Let them confirm or adjust before generating code.

Step 5: Set Up Authentication

Before generating code, determine what auth the API needs and set it up so you can test locally.

There are two patterns:

Pattern A: Static API token/key For APIs where the user has a personal token or API key (e.g., Jira API token, GitHub PAT, simple API keys).

Prefer a brokered credential when the token is only used in outbound request headers to known domains. Follow .agents/skills/auth-guide/SKILL.md to declare it with worker.credential().

If the worker needs the plaintext token — for example, for signing or a request body — tell the user which variables are needed and have them add the values directly to .env themselves. Never ask them to send the values in chat:

JIRA_API_TOKEN=...
JIRA_EMAIL=user@example.com

If .env doesn't exist, create it. The .env file is automatically loaded during local execution (--local flag).

Pattern B: OAuth For APIs that require OAuth (e.g., Google, Salesforce, HubSpot). This has two parts:

  1. Client credentials — the OAuth app's client ID and secret. These go in .env:

    MY_OAUTH_CLIENT_ID=...
    MY_OAUTH_CLIENT_SECRET=...
  2. User token — obtained through the OAuth flow after deploying. This is handled by the runtime automatically via worker.oauth() and .accessToken().

For OAuth syncs, you'll add a worker.oauth() call in the generated code. Always use UserManagedOAuthConfiguration (the shape with explicit endpoints and client credentials) rather than the { provider: "..." } shorthand, as Notion-managed OAuth is in alpha and the user likely does not have access.

ts
const myAuth = worker.oauth("myAuth", {
  name: "my-provider",
  authorizationEndpoint: "https://provider.example.com/oauth/authorize",
  tokenEndpoint: "https://provider.example.com/oauth/token",
  scope: "read write",
  clientId: process.env.MY_OAUTH_CLIENT_ID ?? "",
  clientSecret: process.env.MY_OAUTH_CLIENT_SECRET ?? "",
});

Then use await myAuth.accessToken() in the execute function instead of reading a static token from process.env.

Note: the OAuth flow itself requires a deployed worker, but local execution works after the first authorization completes and ntn workers env pull copies the access token into .env. Before that bootstrap, .accessToken() fails because the local token is missing. Proceed to Step 8 for the initial authorization.

Step 6: Generate the Code

Write the sync into src/index.ts. Use the closest example from .agents/skills/sync-guide/examples/ as a starting point:

  • replace-simple.ts — static data, no API
  • replace-paginated.ts — paginated replace mode (also used for backfill syncs)
  • incremental-basic.ts — delta sync with opaque cursor
  • incremental-bimodal.ts — full backfill + delta pair example
  • incremental-events.ts — delta sync with event feed

Include in the generated code:

  • Proper imports (Worker, Builder, Schema)
  • Database declaration via worker.database() with schema and primaryKeyProperty
  • A pacer for the upstream API via worker.pacer() — and await pacer.wait() before every API request
  • The state type(s) — simple types, one per sync (no discriminated unions needed)
  • The worker.sync() call(s) referencing the database handle
  • For backfill+delta: two syncs targeting the same database, backfill with schedule: "manual", delta with a timed schedule
  • A consistency buffer for delta syncs (if the API is eventually consistent)
  • Inline comments explaining why each design choice was made
  • API calls using fetch with auth from a brokered credential or process.env

Code generation checklist:

  • Database declared with worker.database() and referenced by handle
  • Pacer declared with worker.pacer() for the upstream API
  • await pacer.wait() called before every fetch to the upstream API
  • State types are simple (no bi-modal discriminated unions)
  • Backfill sync uses mode: "replace" and schedule: "manual" (if applicable)
  • Delta sync uses mode: "incremental" with a timed schedule (if applicable)
  • Consistency buffer applied to delta cursor advancement (if applicable)
  • Deletion handling matches one of the three cases from Step 4
Show full SKILL.md (830 more words)Show less
Step 7: Test Locally

Test the sync before deploying. This catches bugs early without a deploy cycle.

For syncs using static API tokens (Pattern A):

Brokered credentials must be tested after deploy in Step 8. For tokens read from process.env, test locally:

  1. Run npm run check to verify TypeScript types compile. Fix any errors.

  2. Run ntn workers exec <key> --local to execute the sync locally. This runs the execute function on your machine with .env loaded.

    • Check: does it return data? Are properties populated correctly?
    • Check: does hasMore look right? Does the cursor advance?
  3. If it returns hasMore: true, test the next page: ntn workers exec <key> --local -d '<nextState from previous output>'

  4. If there are errors (auth failures, wrong field mappings, crashes): fix the code and re-run — no deploy needed, iteration is fast.

  5. For backfill+delta pairs, test each sync independently:

    • Test the backfill sync: ntn workers exec <backfillKey> --local
    • Test the delta sync: ntn workers exec <deltaKey> --local
    • Verify they both return well-formed data with the correct properties.
  6. Write a test file (test.ts) that exercises the sync. Import the worker directly and call its .run() method.

    If the user has API credentials in .env, write a test that hits the real API — this is the most valuable test because it validates actual field mappings, pagination behavior, and auth against the real service. If credentials aren't available, stub the HTTP calls instead.

    Integration test (preferred when credentials are available):

    ts
    import "dotenv/config"; // load .env
    import worker from "./src/index.ts";
    import assert from "node:assert";
    
    async function test() {
      // First page (backfill start, no prior state)
      const page1 = await worker.run("mySync", undefined, { concreteOutput: true });
      console.log(`Page 1: ${page1.changes.length} records, hasMore: ${page1.hasMore}`);
      assert(page1.changes.length > 0, "Should return records");
    
      // Verify fields are populated
      const first = page1.changes[0];
      assert(first.key, "Record should have a key");
      console.log("Sample record:", JSON.stringify(first, null, 2));
    
      // Test pagination
      if (page1.hasMore) {
        const page2 = await worker.run("mySync", page1.nextState, { concreteOutput: true });
        console.log(`Page 2: ${page2.changes.length} records, hasMore: ${page2.hasMore}`);
        assert(page2.changes.length > 0, "Second page should return records");
      }
    
      console.log("All tests passed!");
    }
    
    test().catch((err) => { console.error(err); process.exit(1); });

    Run with npx tsx test.ts. Adapt to the specific sync: use the actual capability key, add assertions for specific field values, verify both backfill and delta syncs for backfill+delta pairs, etc.

For syncs using OAuth (Pattern B): Before the first authorization, local execution won't work because .accessToken() requires a token from a completed OAuth flow. After deploying, completing the flow, and running ntn workers env pull, local execution works. You can always run npm run check for type validation.

Step 8: Deploy and Validate with Preview

Once local testing passes (or immediately for OAuth syncs), deploy and test remotely.

If secrets need to be available at deploy time (e.g., OAuth clientSecret read from process.env during capability registration), create the worker and push secrets first:

  1. ntn workers create --name <name> — create the worker without deploying
  2. ntn workers env push — push .env secrets to remote
  3. ntn workers deploy — now deploy with secrets available

Otherwise, the simpler flow:

  1. ntn workers deploy — build and publish
  2. ntn workers env push — push .env secrets to remote

Then, if the sync uses OAuth, complete the OAuth flow before previewing. Important: env push must happen before oauth start — the deployed worker needs the client secret to exchange the authorization code for tokens.

  • ntn workers oauth show-redirect-url — get the redirect URL
  • Tell the user to configure this URL in their OAuth provider's app settings
  • ntn workers oauth start <oauthKey> — opens browser to complete the OAuth flow
  1. ntn workers sync trigger <syncKey> --preview — execute remotely without writing to Notion
    • Inspect the output: record count, property values, hasMore status
    • If hasMore: true, continue: ntn workers sync trigger <syncKey> --preview --context '<nextState>'
  2. If the preview shows issues, fix the code and redeploy (go back to step 1)

For backfill+delta pairs, preview both syncs:

  • ntn workers sync trigger <backfillKey> --preview
  • ntn workers sync trigger <deltaKey> --preview
Step 9: Go Live

When the preview looks good:

  1. ntn workers sync trigger <key> — trigger a real sync
  2. ntn workers sync status — check that the sync is running and progressing
  3. ntn workers runs list then ntn workers runs logs <runId> — check for errors
  4. Run ntn workers sync status again to confirm progress (record count increasing, no errors)

For backfill+delta pairs, initialize the delta cursor before loading all data, so changes made during the backfill are not skipped:

  1. ntn workers sync trigger <deltaKey> — initialize the delta cursor
  2. ntn workers sync trigger <backfillKey> — start the full dataset load
  3. Monitor with ntn workers sync status until the backfill completes
  4. The delta sync will continue automatically on its configured schedule

Tell the user: initialize the delta cursor before starting the backfill. The backfill may take a while depending on dataset size. They should periodically run ntn workers sync status to monitor progress until the initial backfill completes. After that, the delta sync runs automatically on its configured schedule. To re-backfill later: ntn workers sync state reset <backfillKey> && ntn workers sync trigger <backfillKey>

© makenotion, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/sync of makenotion/workers-template.

Open the folder on GitHubat commit 681d89d

Used in 1 other repository

We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in makenotion/workers-template, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Notion Worker Sync Scaffold 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.

Notion Worker Sync Scaffold compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Notion Worker Sync Scaffold this skillmakenotion/workers-template4391 repos~4.6kAutomated safety check: NotesMIT
Dinobase Connector Builderkappa90/dinobase263—~1.9kAutomated safety check: PassCustom licence
API Integrationsickn33/agentic-awesome-skills47k1 repos~1.3kAutomated safety check: PassMIT
Integration PatternsJoelLewis/finance_skills205—~10kAutomated safety check: PassMIT
Finta SDK Patternsjeremylongshore/tons-of-skills-marketplace2.8k—~1.2kAutomated safety check: PassMIT
Tushare Plugin BuilderYourdaylight/stock_datasource188—~2.5kAutomated safety check: PassMIT

Similar skills

  • Writes a new Dinobase YAML connector for a REST API that has no verified dlt source, covering auth, pagination, read and write endpoints and incremental loading.

    263 GitHub stars~1.9k tokensUpdated 3 mo ago
    Backend & APIsAuto-check passed
  • API Integration

    sickn33/agentic-awesome-skills

    Designs event-driven architectures, webhook systems, API chaining flows, ETL pipelines, and integration patterns between services.

    47k GitHub starsUsed in 1 repo~1.3k tokens
    Backend & APIsAuto-check passed
  • Integration Patterns

    JoelLewis/finance_skills

    Design and implement integration architectures connecting financial systems — APIs, FIX protocol, ISO 20022, event-driven patterns, batch feeds, idempotency, and resilience.

    205 GitHub stars~10k tokensUpdated 2 mo ago
    Backend & APIsAuto-check passed
  • Finta SDK Patterns

    jeremylongshore/tons-of-skills-marketplace

    Integration patterns for Finta fundraising CRM with email and calendar APIs.

    2.8k GitHub stars~1.2k tokensUpdated today
    Backend & APIsAuto-check passed
  • Tushare Plugin Builder

    Yourdaylight/stock_datasource

    Turns a Tushare API doc URL into a full data plugin for the stock_datasource repo: extractor, ClickHouse schema, query service, config and curl examples.

    188 GitHub stars~2.5k tokensUpdated 1 mo ago
    Data & AnalyticsAuto-check passed
  • Ae Data Integration Helper

    infometa/workbuddyskills

    Answers questions about ThinkingData SDK integration and usage, including the LogBus2 data import tool.

    344 GitHub stars~3k tokensUpdated today
    Data & AnalyticsAuto-check passed

More from makenotion/workers-template

  • Notion Worker Third-Party Auth Guide

    makenotion/workers-template

    Official

    Decides whether a Notion Worker should use a brokered credential, a plaintext environment secret, or OAuth to authenticate against a non-Notion service.

    439 GitHub starsUsed in 1 repo~3.5k tokens
    Auto-check: notes
  • Workers Sync Debugger

    makenotion/workers-template

    Official

    Works out why a Workers sync is failing or returning wrong data by reading run logs through the ntn CLI, matching errors to the sync code and proposing fixes.

    439 GitHub starsUsed in 1 repo~957 tokens
    Auto-check: notes
  • Notion Workers Sync Guide

    makenotion/workers-template

    Official

    Guides the design of Notion Workers syncs, from choosing a simple replace sync or a backfill plus delta pair to pagination, consistency buffers, pacing and deletion handling.

    439 GitHub starsUsed in 1 repo~3k tokens
    Auto-check passed
  • Sync Capability Validator

    makenotion/workers-template

    Official

    Checks a Workers sync capability against a list of common bugs, such as stuck cursors, endless pagination and lost deletions, and reports by severity.

    439 GitHub starsUsed in 1 repo~1.2k tokens
    Auto-check: notes

Works with

Categories

Questions about Notion Worker Sync Scaffold

What does Notion Worker Sync Scaffold do?

Walks you through designing a new sync for a Notion Worker, covering data source, mode, pagination and cursors, and then generates working code. The agent interviews you about what data you want to sync, such as Jira issues or Stripe customers, and looks up the source API's pagination and change-tracking features: an updated_at field, an events endpoint or cursors.ts to see what already exists.

When should I use Notion Worker Sync Scaffold?

Notion Worker Sync Scaffold fits situations like: adding a new data sync to a Notion Worker project; choosing between a replace sync and a backfill plus delta pair for an API; designing pagination and cursor handling for a source API.

How do I install Notion Worker Sync Scaffold in Claude Code?

Run `npx skills add makenotion/workers-template --skill sync -a claude-code`. Or copy the skill folder (.agents/skills/sync in makenotion/workers-template) into .claude/skills/sync in your project. Claude Code loads it when a task matches its description.

How do I install Notion Worker Sync Scaffold in Codex?

Run `npx skills add makenotion/workers-template --skill sync -a codex`. Or copy the skill folder (.agents/skills/sync in makenotion/workers-template) into .agents/skills/sync in your project. Codex loads it when a task matches its description.

Can I use Notion Worker Sync Scaffold in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add makenotion/workers-template --skill sync -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sync, .gemini/skills/sync, .github/skills/sync and .opencode/skills/sync in your project.

What does Notion Worker Sync Scaffold need to run?

Going by SKILL.md and its folder, Notion Worker Sync Scaffold needs the command-line tools its instructions call (npm and npx) and credentials named JIRA_API_TOKEN. Our summary lists: A Notion Worker project created from the workers template. Its frontmatter pre-approves these tools: Read, Edit, Write, Bash, Glob, Grep, Agent.

Does Notion Worker Sync Scaffold access the network?

SKILL.md contains no URLs. Its commands use npm and npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Notion Worker Sync Scaffold safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file; pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Notion Worker Sync Scaffold use?

Notion Worker Sync Scaffold is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Notion Worker Sync Scaffold use?

About 4.6k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Notion Worker Sync Scaffold?

Skills that share tags, products or a category with Notion Worker Sync Scaffold: Dinobase Connector Builder (kappa90/dinobase, 263 stars), API Integration (sickn33/agentic-awesome-skills, 47k stars), Integration Patterns (JoelLewis/finance_skills, 205 stars) and Finta SDK Patterns (jeremylongshore/tons-of-skills-marketplace, 2.8k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Notion Worker Sync Scaffold?

makenotion (a GitHub organization, an official publisher) maintains it in makenotion/workers-template, which has 439 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on September 11, 2026.

Source: makenotion/workers-template on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.