AbsoluteJS

Blog

@absolutejs/blogv0.1.0betaFrontend & UX

Headless, typed blog publishing primitives for AbsoluteJS: post registries, reading metrics, SEO metadata, feeds, sitemap routes, Elysia endpoints, and React hooks without bundled UI.

#Installation

BASH
bun add @absolutejs/blog

#Capabilities

Overview

Headless blog publishing for AbsoluteJS. The package owns post contracts, publication metadata, feeds, sitemap routes, and browser hooks. Your application owns every element and every style.

Define a blog

blog.all() returns published posts newest first. Drafts stay out of public lookups, feeds, and sitemap routes unless explicitly requested.

blog.head(post) returns canonical, Open Graph, Twitter, article meta, and BlogPosting JSON-LD values that can be passed to the AbsoluteJS Head component.

Feeds

Mount all three standard feed formats with the optional Elysia plugin:

The literal paths preserve exact Elysia and Eden route inference:

/blog/rss.xml

Show 3 more

/blog/atom.xml

/blog/feed.json

The core package also exports generateRssFeed, generateAtomFeed, and generateJsonFeed for applications that own their routes.

Reading hooks

The React subpath contains hooks, not visual components:

Progress is measured against the article element instead of the entire document, so a site header and footer do not distort it.

Outcomes

What you can build

Overview

Headless blog publishing for AbsoluteJS. The package owns post contracts, publication metadata, feeds, sitemap routes, and browser hooks. Your application owns every element and every style.

Define a blog

blog.all() returns published posts newest first. Drafts stay out of public lookups, feeds, and sitemap routes unless explicitly requested.

Feeds

Mount all three standard feed formats with the optional Elysia plugin:

Hardening checklist

Production guidance

Make every external boundary explicitPin the deployed @absolutejs/blog version, replace example or memory-backed dependencies with durable implementations, bound external calls, protect credentials, and emit enough evidence to retry or recover safely.

Follow in order

Troubleshooting path

1
Trace from the first failed boundary
Reproduce the smallest canonical @absolutejs/blog example, confirm the supported entry point and version in the API explorer, then inspect the first boundary that did not produce its documented result.

#Define a blog

Partial snippet

Working example for Define a blog.

TS
import { createBlog, defineAuthor, definePost } from "@absolutejs/blog";

const author = defineAuthor({
  id: "alex-kahn",
  name: "Alex Kahn",
  role: "AbsoluteJS",
});

const post = definePost({
  author,
  description: "Why provider differences belong in typed data.",
  publishedAt: "2026-07-31",
  slug: "why-citra-typed-oauth",
  tags: ["OAuth", "TypeScript", "Citra"],
  title: "Why Citra: Typed OAuth Without Provider Classes",
});

export const blog = createBlog({
  posts: [post],
  site: {
    baseUrl: "https://absolutejs.com",
    description: "Engineering notes from AbsoluteJS.",
    name: "AbsoluteJS Blog",
    publisher: {
      name: "AbsoluteJS",
      url: "https://absolutejs.com",
    },
  },
});

#Define a blog 2

Partial snippet

blog.all() returns published posts newest first. Drafts stay out of public lookups, feeds, and sitemap routes unless explicitly requested.

TS
blog.get("why-citra-typed-oauth");
blog.byTag("TypeScript");
blog.relatedTo(post);
blog.sitemapRoutes();
blog.head(post);

#Public entry points

Supported entry points declared by this project’s package manifest. Internal dist paths are not part of the package contract.

Public package entry point declared in package.json.

@absolutejs/blog@absolutejs/blog/elysia@absolutejs/blog/react@absolutejs/blog/manifest@absolutejs/blog/manifest.json@absolutejs/blog/package.json

#Package commands

Scripts declared by this project’s package manifest.

bun run buildrm -rf dist && bun build src/index.ts src/elysia.ts src/react.ts src/manifest.ts --outdir dist --root ./src --sourcemap --target=browser --external react --external 'react/*' --external elysia --external 'elysia/*' --external @absolutejs/manifest --external '@absolutejs/manifest/*' --external @sinclair/typebox --external '@sinclair/typebox/*' && tsc --project tsconfig.build.json && absolute-manifest emit
bun run check:packagebun run format && bun run typecheck && bun run test && bun run verify-package && bun run build && bun run verify-package --artifacts
bun run formatprettier --write "./**/*.{ts,json,md}"
bun run testbun test tests/
bun run typechecktsc --noEmit

#API reference

Search the declarations exported by the current package type files. Expand a symbol to inspect its source-backed signature.

29 symbols
generateRssFeedvaluePermalink
TS
const generateRssFeed: (posts: readonly BlogPost[], site: BlogSite) => string;
Exported from @absolutejs/blog