Skip to content

Blog: bylines, per-post social cards, and a search API pricing post - #110

Merged
kid7st merged 8 commits into
mainfrom
blog/publish-20261018-search-api-pricing
Oct 18, 2026
Merged

kid7st merged 8 commits into
mainfrom
blog/publish-20261018-search-api-pricing

Conversation

@kid7st

@kid7st kid7st commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

What

Three changes, one shape: make a post look authored and shareable, then ship the comparison page the first post's keyword research pointed at.

  1. Bylines. The blog schema gains author and authorUrl. A named author renders as a byline under the title, in article:author, and as a Person in the BlogPosting JSON-LD. Posts without the fields keep the existing team byline and stay an Organization, so nothing else on the site changes.
  2. Per-post social cards. The schema gains image, Site takes an ogImage prop, and scripts/render-post-og.mjs (npm run og:posts) renders a 1200×630 card from the post title. The card palette moved to scripts/og-theme.mjs so the site card and the post cards cannot drift apart.
  3. New post: Search API pricing for AI agents, compared. Brave, Tavily, Exa and DeepSeek side by side: list price per 1,000, what one request includes, rate limits, free allowances, what the plans hide, and one realistic task (5 searches + 3 pages) costed under all four. It links to the DeepSeek post, and the DeepSeek post now links here from its price section.

The DeepSeek post also picks up the new frontmatter fields, so it gets a card and a byline.

Keywords

DataForSEO, US, October 2026: brave search api pricing 480/mo at KD 9, against deepseek web search api 20/mo. Title targets search API pricing, and each provider has its own H2 (Brave Search API pricing, Tavily pricing, Exa pricing, DeepSeek pricing) so the long-tail exact matches have somewhere to land.

Review fixes

  • The closing paragraph now agrees with its own table: at a hundred tasks a day, $120 on Brave, $135 to $144 on Tavily, about $18 on DeepSeek, about $60 on Exa. It used to say $60 to $145 against "under $2".
  • Prices re-read against the providers' own pages: DeepSeek publishes ¥5 on its Chinese page and $0.75 on its English one, so both posts carry the vendor's dollar figure instead of a ¥5 conversion; Exa is from $4, not $7. Tavily's advanced extract (two credits per five URLs), Exa's Monitors and Agent pricing, and DeepSeek's free server-side window through 1 November 2026 are in the post too.
  • author is optional and the JSON-LD decides on "is there a name", not "is there a profile", so a person with no homepage cannot be declared an Organization. An authorUrl without an author is a schema error.
  • check-site now scans public/og/ into the raster check and verifies each post's declared image exists at 1200×630; render-post-og throws instead of truncating a title or rendering a block scalar as >; the markdown twin reads the blog's image field.

Verification

  • npm run check → contrast and token checks green, 4 rasters current, astro check 0 errors on 85 files.
  • npm run build → 54 pages, both posts present in /blog/, rss.xml and sitemap-0.xml.
  • postbuild link check: agent surfaces: 39 files, 1171 kB, 42 links, 32 twins and 64 directive links offered, every one resolves.
  • Checked in dist/: per-post og:image and og:image:alt, article:author, Person JSON-LD with url, byline renders # blog · October 18, 2026 · kid7st, the markdown twins carry the same card as the HTML head, and an untouched post (fastagent-0-21) still uses social-preview.png with the team byline as an Organization.
  • Each new check was run against a deliberately broken input once: a wrong image path, a 512×512 card, a title: > frontmatter and an over-long title all fail with the message they promise.
  • New post title 59 characters, description 156; DeepSeek post title 63, description 146.
  • Prices come from each provider's own pricing page, read October 2026; the post carries a disclosure that the DeepSeek package is ours.

- blog schema gains author, authorUrl and image; a named author renders as a
  Person in BlogPosting and as a byline, and the team default stays an
  Organization, so existing posts are unchanged
- Site takes an ogImage prop; posts with an image use a 1200x630 card rendered
  by scripts/render-post-og.mjs (npm run og:posts), others keep the site card
- the card palette moves to scripts/og-theme.mjs so both renderers share it
- new post: Search API pricing for AI agents, compared (Brave, Tavily, Exa,
  DeepSeek, one task costed four ways), linked from the DeepSeek post and back
@kid7st
kid7st requested a review from Sukitly as a code owner October 18, 2026 15:06
The byline and the Person in the structured data now link to x.com/kid7st
instead of the GitHub profile.
Both posts linked the package repository but never the product one, so the only
funnel to github.com/fastagent-sh/fastagent was the site header. The closing
sections now link it in context: the DeepSeek post as the runtime for taking an
agent to a service, the pricing post as what surrounds the search layer.
The pricing post now says what the reader can do next: star the repository the
package ships with. One sentence, in the closing paragraph.
check-site.mjs read CARD from render-og.mjs, which no longer exports it; it now
reads og-theme.mjs. Also adopts z.url() and drops an unused binding so the check
is clean rather than merely passing.
The closing paragraph of the new post quoted a monthly spread its own
table contradicted: $60 to $145 for Brave and Tavily, "under $2" for
DeepSeek. At a hundred tasks a day the table's per-task costs come out
at $120 on Brave, $135 to $144 on Tavily, about $18 on DeepSeek and
about $60 on Exa, so the sentence now says that instead.

DeepSeek publishes two list prices for the same endpoint, ¥5 on the
Chinese page and $0.75 on the English one. Both posts converted ¥5 at
about 7.1 and printed $0.70, which a reader checking the English page
would not find; they now carry the vendor's own dollar figure. The
Exa figure in the DeepSeek post moves from $7 to the $4 floor its
pricing page states, so the two posts no longer disagree.

Also from reading the provider pages today: Tavily's advanced extract
costs two credits per five URLs, Exa bills Monitors and Agent runs
that the comparison did not mention, and DeepSeek's server-side
search and fetch calls are free through its own harness, Claude Code
and Codex until 1 November 2026 — a window that does not cover a
client calling the API with its own key.
Three gaps a per-post social card opened, none visible on the page:

check-site now scans public/og/ into the raster check, so a palette
change that strands a card is caught instead of looking like a design
choice; and it verifies the image each post declares exists under
public/ at 1200x630, which was the one head link no other check
followed.

render-post-og used to truncate a title past four lines and let a long
word run off the edge; it throws now, while the person adding the post
is watching the terminal. Its frontmatter reader is a YAML subset, and
a block scalar or an alias arrived as a bare ">" that it rendered as
the title, so those forms throw with the file and field named.

The markdown twin reads the blog's `image` field as well as the docs'
`socialImage`, so a post's twin frontmatter carries the same card as
the HTML head instead of advertising the site card.
The structured data chose Person over Organization by asking whether
authorUrl was set, while `author` carried a default, so a future post
naming a person who has no profile would have declared them an
Organization. The schema leaves `author` optional, the layout decides
on whether a name was given, and the profile is optional inside
either branch. An authorUrl with no author is a refinement error now
rather than a link that every reader silently drops.
@kid7st
kid7st enabled auto-merge (squash) October 18, 2026 15:35
@kid7st
kid7st merged commit dde33b8 into main Oct 18, 2026
5 checks passed
@kid7st
kid7st deleted the blog/publish-20261018-search-api-pricing branch October 18, 2026 15:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant