Make the feed ad worth opening: artwork, a brand line, a quieter title - #201
Merged
Merged
Conversation
Reported off rssamplifier.com/topics/rust.rss: the ads read as spam and nobody would open them. Three changes, none of which touch what the advertiser wrote. **The title no longer leads with the label.** "[Sponsored] Ship faster" becomes "Ship faster (Sponsored)". A leading bracket is the first thing the eye meets in a list of headlines and it reads as a spam subject-line prefix, so the item is skipped before the offer is ever read. Trailing, the headline gets to say what it is and the label still travels everywhere the title travels -- and <category> carries it machine-readably besides. Nothing is hidden; the same word is in the same field. **The card carries the artwork.** A feed item sits between real blog posts that each have a title, a picture and a few paragraphs. A bare line of text next to them does not read as restrained, it reads as broken, and gets scrolled past. The card now leads with the advertiser's hero image, then an <h3> headline, the body, and the call to action. width is set and height deliberately is not: readers scale to their own column, and a fixed height distorts every image that is not exactly the ratio we guessed. **A brand line names who is paying.** The logo where there is one, and always the destination host. "Sponsored" tells a reader an ad is an ad; the domain tells them whose it is, which is what they actually decide on. The host cannot come from our click URL -- that is always crawlproof.com -- so destinationHost reads it off the advertiser's own logo/image and returns "" rather than guessing when the only candidate is our own storage. The companion migration undoes a decision from the format's first migration, which dropped image_url on the reasoning that a feed item has no artwork. That was right about the one-line `text` style and wrong about the format. Restores it from each campaign's medium rectangle, which is the creative the hero image was resolved for: 96 of 106 campaigns. The other 10 render a card with no picture, which the renderer treats as ordinary rather than assuming an image. No copy is invented. Bodies average 76 characters because that is what the advertisers wrote; an ad describing a product in words its owner never wrote is a fabricated claim however good it looks. What changed is the layout around it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ThreatCrush Security Scan35 finding(s) HIGH/CRITICAL: 3 | MEDIUM: 23 | LOW: 9
Snippets are redacted; ThreatCrush never prints matched credential material. |
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.
Follow-up to #200, reported off
rssamplifier.com/topics/rust.rss: the ads read as spam and nobody would open them.Three changes, none of which touch what the advertiser wrote.
The title no longer leads with the label
[Sponsored] Ship faster→Ship faster (Sponsored)A leading bracket is the first thing the eye meets in a list of headlines and reads as a spam subject-line prefix, so the item is skipped before the offer is ever read. Trailing, the headline gets to say what it is and the label still travels everywhere the title travels — plus
<category>carries it machine-readably. Nothing is hidden: same word, same field.The card carries the artwork
A feed item sits between real blog posts that each have a title, a picture and a few paragraphs. A bare line of text next to them does not read as restrained — it reads as broken. The card now leads with the hero image, then an
<h3>headline, the body, the CTA.widthis set andheightdeliberately is not: readers scale to their own column, and a fixed height distorts every image that is not exactly the ratio we guessed.A brand line names who is paying
The logo where there is one, and always the destination host. "Sponsored" tells a reader an ad is an ad; the domain tells them whose it is, which is what they actually decide on.
The host cannot come from our click URL — that is always
crawlproof.com— sodestinationHostreads it off the advertiser's own logo/image, and returns""rather than guessing when the only candidate is our own storage.Migration
20260818160000_ad_feed_item_artwork.sqlundoes a decision from the format's first migration, which droppedimage_urlon the reasoning that a feed item has no artwork. That was right about the one-linetextstyle and wrong about the format.Restores it from each campaign's medium rectangle — the creative the hero image was resolved for. 96 of 106 campaigns; the other 10 render a card with no picture, which the renderer treats as ordinary rather than assuming an image. Already applied to prod (
{"success": true}, verified 0 → 96).Not done on purpose
No copy is invented. Bodies average 76 characters because that is what the advertisers wrote — an ad describing a product in words its owner never wrote is a fabricated claim however good it looks. What changed is the layout around it.
Verification
1507 tests pass (6 new),
tsc --noEmitclean,next buildclean.Paired with profullstack/rssamplifier.com#104, which fixes the ads sorting to the top of the feed.
🤖 Generated with Claude Code