Core (vanilla TypeScript)
@scribe-atp/core is pure TypeScript with no runtime dependencies. It works in any environment: Node.js, Deno, Bun, browsers, edge functions, or any JavaScript runtime.
All framework adapters are thin wrappers around this package. If your framework isn’t listed, or you prefer to manage state yourself, use @scribe-atp/core directly.
Install
Section titled “Install”npm install @scribe-atp/coreFetch a site
Section titled “Fetch a site”import { fetchSite, toSlug } from '@scribe-atp/core';
const site = await fetchSite('alice.bsky.social', toSlug('alice.bsky.social'));
console.log(site.title);console.log(site.description);console.log(site.url); // e.g. "alice.bsky.social"console.log(site.urlPrefix); // e.g. "blog" or ""
for (const group of site.groups) { for (const article of group.articles) { console.log(article.title, article.url, article.synopsis); }}
// Unpublished articles (assigned to the site but not yet in a group)console.log(site.ungroupedArticles);Fetch an article
Section titled “Fetch an article”import { fetchArticle } from '@scribe-atp/core';
const article = await fetchArticle('alice.bsky.social', 'my-first-post');
console.log(article.title);console.log(article.synopsis);console.log(article.content); // Full HTML — safe to render directlyconsole.log(article.createdAt);Utilities
Section titled “Utilities”import { toSlug, slugFromUri, flattenArticles } from '@scribe-atp/core';
toSlug('norobots.blog') // → "norobots-blog"toSlug('alice.bsky.social') // → "alice-bsky-social"
slugFromUri('at://did:plc:abc/app.scribe.article/my-post') // → "my-post"
// All published articles across all groups, in orderconst allArticles = flattenArticles(site.groups);Cancelling requests
Section titled “Cancelling requests”Both functions accept an optional AbortSignal as a third argument:
// Server context — cancel if the user navigates awayconst site = await fetchSite(author, siteSlug, request.signal);
// Client context — cancel on unmount or parameter changeconst controller = new AbortController();const site = await fetchSite(author, siteSlug, controller.signal);controller.abort(); // cancelTypeScript types
Section titled “TypeScript types”import type { Site, Article, ArticleRef, SiteGroup } from '@scribe-atp/core';See the API reference for full type definitions.