How to build blog and editorial pages for a job board

Render a blog index, tag, author, search, post, adjacent-post, and related-post experience.

The blog namespace supplies the editorial graph for a content-led job board. Build index, tag, author, post, and search routes from the same canonical records. Keep tag and author URLs stable so posts never create competing archives.

Build the blog index

ts
const firstPage = await board.blog.posts.list({ limit: 12 });
const nextPage = firstPage.nextCursor
? await board.blog.posts.list({
limit: 12,
cursor: firstPage.nextCursor,
})
: undefined;

Blog archives use cursor pagination. Carry nextCursor forward unchanged in a crawlable “Next” link; do not convert it into a page number. Render title, excerpt, author, publication date, tags, and the canonical post path. Keep draft or unavailable content out of the public response rather than filtering it in the frontend.

Build tag and author archives

ts
const [tag, taggedPosts] = await Promise.all([
board.blog.tags.retrieve(tagSlug),
board.blog.posts.list({ tagSlug: tagSlug, limit: 12 }),
]);
const [author, authoredPosts] = await Promise.all([
board.blog.authors.retrieve(authorSlug),
board.blog.posts.list({ authorSlug: authorSlug, limit: 12 }),
]);

Redirect a non-canonical slug to the value returned by the API. Map missing tags and authors to native 404 responses.

Compose a post page

ts
const [post, adjacent, similar] = await Promise.all([
board.blog.posts.retrieve(postSlug),
board.blog.posts.adjacent(postSlug),
board.blog.posts.similar(postSlug, { limit: 4 }),
]);

Render the API’s content through your application’s approved content renderer and sanitization policy. Do not use unsanitized HTML injection. Adjacent posts power previous/next navigation; similar posts power a related-reading section.

Keep search non-canonical

ts
const results = await board.blog.search({ query, limit: 12 });

Blog search is a discovery state. Give the search page one canonical URL, retain the query for navigation, and avoid indexing arbitrary result combinations.

Verify the editorial journey

  1. Open the index, a tag, an author, and a post and confirm each has one self-referencing canonical URL.
  2. Rename or alias a slug in development data and confirm the old route redirects.
  3. Open a missing post, tag, and author and confirm native 404 responses.
  4. Confirm adjacent links do not cross unpublished content.
  5. Search for a unique phrase and confirm the result route does not create an indexable canonical for the query.

Next, add Talent directory and profile pages when the board exposes candidates to employers or the public.