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.