agentsclimarketplace

Citely connect

Skill stephenpham68/citely-blog-kit/skills/citely-connect

Connect a website to Citely so published articles appear on the site immediately. Use when the user wants to receive blog content from Citely (citely-seo.com), build a reader for the Citely read-API, implement a CPP webhook receiver, wire a deploy hook, or debug articles that publish in Citely but take hours to appear on the site. Pairs with the blog-builder skill for rendering.From its SKILL.md

Install
npx -y skills add stephenpham68/citely-blog-kit --skill citely-connect

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • 22 days oldThe repository was created 22 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

5.2 KB, ~1.2k tokens by cl100k_base, as published. Nobody here has run it

Citely Connect — receive articles, show them instantly

Wire the user's site to Citely so that one publish in Citely = article live on the site within seconds to ~1 minute. Rendering quality is the blog-builder skill's job; this skill covers transport and freshness.

Source of truth: fetch the live spec first

Before writing any code, fetch the canonical integration spec — it is versioned and maintained by Citely; do not rely on memorized field lists:

Fetch https://citely-seo.com/connect/v1/agent.md

Everything below is decision guidance layered on top of that spec, not a replacement for it.

When to use

  • The site should display articles written/published in Citely.
  • Building the reader (Mode A) or webhook receiver (Mode B/C) for Citely Connect.
  • Articles publish in Citely but appear on the site late (minutes–hours) — see references/instant-publish.md.

When NOT to use

  • Designing/styling the blog UI itself → blog-builder skill (use both together: this skill delivers the data, blog-builder renders it).
  • WordPress sites — Citely has a native WP plugin; no custom integration needed.

Required inputs (ask if missing)

  1. Stack + hosting — Next.js/Astro/Hugo/…, and whether pages are SSG (static export), SSR/on-demand, or ISR. This decides the mode and the freshness wiring.
  2. Site token + read-key — from the user's Citely dashboard (Websites → Connect). The read-key is server-side only (CITELY_READ_KEY env); it must never reach the browser bundle.
  3. Deploy hook URL (SSG only) — from Cloudflare Pages / Netlify / Vercel settings.

Mode decision (fast)

SituationMode
Site can fetch at request/build time; user wants zero backendA — citely-api (recommended default): Citely hosts content, you build a reader
Site already has a runtime + database (Next SSR, Laravel, Rails) and wants to own storageB — db receiver (CPP webhook, HMAC-verified)
Static repo where content lives as files in gitC — fs-build receiver

Default to Mode A unless the user explicitly wants to own storage. It needs no webhook signature code and inherits Citely's CDN cache.

Workflow (Mode A)

  1. Fetch the spec (above) and confirm endpoints/fields against it.
  2. Env setupCITELY_READ_KEY in the host's server env. Public single-post endpoint needs no key; list/export do. Include the key on build-time fetches to lift rate limits.
  3. Build the reader:
    • List page: GET /posts (server-side, Bearer read-key), paginate with cursor.
    • Article page: GET /posts/{slug} (public, edge-cached — cheap per request).
    • Render html as-is; emit each jsonLd[] entry as its own <script type="application/ld+json">; <title> = seoTitle ?? title; map categories via GET /categories.
    • Hand the payload to the blog-builder standard for rendering (its content-contract.md matches this payload).
  4. Wire freshness — the step most integrations get wrong. Follow references/instant-publish.md. Summary: SSR/ISR → short revalidate; SSG → register the deploy hook in Citely (never rely on cron/scheduled builds).
  5. Verify end-to-end: publish a test article in Citely (or use the dashboard's "trigger test build") → confirm it renders on the site within ~1 minute → confirm an edit in Citely also propagates.

For Mode B/C, follow the spec's CPP receiver section exactly (raw-body-first HMAC verification, test:true no-persist, idempotency on webhook-id, CPP_* error codes) — the spec includes a reference implementation and checklist.

Hard rules

  • Read-key never ships to the browser. Server env only; list/export endpoints are called server-side.
  • SSG without a deploy hook is a bug, not a choice — it is the #1 cause of "published in Citely, appeared half a day later". If the user refuses the hook, set expectations explicitly and add a frequent scheduled build as the documented fallback.
  • Don't cache list responses longer than a few minutes on your side; the article page itself may rely on Citely's edge cache.
  • Ignore unknown payload fields (the protocol is additive); never fail the render on an unrecognized key.
  • Webhook secret (whsec_…) and hook URLs are secrets — env only, never committed.

Output format

Report: chosen mode + why, files created, env vars the user must set (names only, no values), whether the deploy hook is registered, and the result of the end-to-end publish test (measured publish→visible latency).

References

FileContents
references/instant-publish.mdFreshness patterns per stack + diagnosing slow-to-appear articles
https://citely-seo.com/connect/v1/agent.mdCanonical protocol spec (always fetch live)
../blog-builder/SKILL.mdRendering standard for the received content

What ships with it: 1 file

3.4 KB alongside SKILL.md

references/

Keep looking

Skills are one crate of 326,452. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.