Repository navigation
Blog: bylines, per-post social cards, and a search API pricing post - #110
Merged
Merged
Conversation
- 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
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.
authorandauthorUrl. A named author renders as a byline under the title, inarticle:author, and as aPersonin theBlogPostingJSON-LD. Posts without the fields keep the existing team byline and stay anOrganization, so nothing else on the site changes.image,Sitetakes anogImageprop, andscripts/render-post-og.mjs(npm run og:posts) renders a 1200×630 card from the post title. The card palette moved toscripts/og-theme.mjsso the site card and the post cards cannot drift apart.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 pricing480/mo at KD 9, againstdeepseek web search api20/mo. Title targetssearch 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
$120on Brave,$135 to $144on Tavily, about$18on DeepSeek, about$60on Exa. It used to say$60 to $145against "under $2".¥5on its Chinese page and$0.75on its English one, so both posts carry the vendor's dollar figure instead of a¥5conversion; Exa isfrom $4, not$7. Tavily'sadvancedextract (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.authoris 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 anOrganization. AnauthorUrlwithout anauthoris a schema error.check-sitenow scanspublic/og/into the raster check and verifies each post's declaredimageexists at 1200×630;render-post-ogthrows instead of truncating a title or rendering a block scalar as>; the markdown twin reads the blog'simagefield.Verification
npm run check→ contrast and token checks green, 4 rasters current,astro check0 errors on 85 files.npm run build→ 54 pages, both posts present in/blog/,rss.xmlandsitemap-0.xml.agent surfaces: 39 files, 1171 kB, 42 links, 32 twins and 64 directive links offered, every one resolves.dist/: per-postog:imageandog:image:alt,article:author,PersonJSON-LD withurl, 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 usessocial-preview.pngwith the team byline as anOrganization.imagepath, a 512×512 card, atitle: >frontmatter and an over-long title all fail with the message they promise.