Framework integration

Rankveo for another framework

The core client behind every rankveo integration. Express, Hono, Deno, Bun, React Router, Hugo - anywhere JavaScript runs.
@rankveo/client

Installation

Install the package in your existing another framework project.

terminal
npm install @rankveo/client

More than a fetch wrapper

The parts every blog needs and nobody enjoys writing - sitemaps, feeds, structured data - ship here rather than being reinvented per framework.

  • Typed articles, tags and sitemaps Published content only. Drafts and future-dated posts never leave the API.
  • XML you can serve directly Sitemaps with image entries, and RSS. Complete documents, not fragments.
  • BlogPosting structured data Built from the article, so it never drifts from what is on the page.
  • Constant-time secret checks For revalidate endpoints, so nobody hand-rolls a timing leak.
import { BlogClient, sitemapXml }
  from '@rankveo/client';

const blog = new BlogClient();

// any server, any router
app.get('/blog', async (c) => {
  const { articles } =
    await blog.getArticles({ limit: 10 });
  return c.json(articles);
});

app.get('/blog/sitemap.xml', async (c) => {
  const { articles } =
    await blog.getSitemap();
  return c.text(sitemapXml(articles, {
    siteUrl: 'https://yoursite.com',
  }), 200, {
    'Content-Type': 'application/xml',
  });
});

Recipes

Two stacks where a package would add nothing over the core. Both are complete integrations - copy the snippets and you are done.

React Router 7 Loaders and resource routes are plain server functions, so there is nothing for a package to wrap. Read the recipe
Hugo Go, not npm. A short prebuild script writes your articles into data/, and templates read them normally. Read the recipe

Safe by construction

It refuses to run in a browser Constructing the client client-side throws. A key that reached the browser is already in a bundle a visitor can read, whatever it was named.
Blog keys read published articles only They cannot reach analytics, keywords, or drafts, and they keep working after a plan change so a live site never starts failing.
Bring your own caching No framework-specific fetch options are hardcoded, so it behaves the same on Node, Workers, Deno and Bun.
Zero dependencies Nothing but the runtime’s own fetch.