ReadMe developer hubs
ReadMe Docs Testimonial Widget Embed
ReadMe hubs have a settings screen made for this: Appearance, then CSS, JS, HTML, with an End of Body Tag field that lands right before the closing body tag. That holds the StoryProof script. The widget div then goes into HTML you control, such as the landing page’s Custom HTML body or a Custom Page in HTML mode. Plan rules and ReadMe’s single page navigation decide how far you can take it.
- The script in the End of Body Tag field
- The div on the landing page or a Custom Page
- Which ReadMe plans unlock which fields
ReadMe fields
Script include, landing page and Custom Page
Type the widget id. The first card goes in the End of Body Tag field once. Then pick where the div lives: the landing page’s Custom HTML body, a Custom Page in HTML mode, or both.
Part 1 · End of Body Tag include
Project dashboard › Appearance › CSS, JS, HTML › End of Body Tag
<script src="https://app.storyproof.io/embed.js" async></script>Part 2 · Landing page body
Appearance › Navigation › Landing Page on › body template: Custom HTML
<!-- Landing page › body › Custom HTML template -->
<section class="customer-proof">
<h2>Teams shipping on our API</h2>
<div data-storyproof-widget="YOUR_WIDGET_ID"></div>
</section>Part 3 · A Custom Page
Custom Pages › new page › HTML mode
<!-- Custom Page set to HTML mode (ReadMe sanitizes this HTML) -->
<h1>Customer stories</h1>
<p>What developers say after their first integration.</p>
<div data-storyproof-widget="YOUR_WIDGET_ID"></div>Save, then open the hub in a private window and load the page with the widget directly. View source to confirm the script sits before the closing body tag and the div kept its data-storyproof-widget attribute.
The HTML is produced in your browser. The id you type is not stored.
The problem, solved
ReadMe hub snags and how the embed fits around them
- Problem 1
Custom JavaScript is greyed out
ReadMe’s plan table puts Custom JavaScript on Enterprise only, which rules out pasting code there for most teams.
How StoryProof solves it
The StoryProof script is a plain HTML tag, so it can go in the End of Body Tag include, a Custom HTML field ReadMe lists on Pro and Enterprise.
- Problem 2
Custom Pages strip what I paste
ReadMe sanitizes HTML on Custom Pages and sends CSS and JavaScript to the Appearance settings instead.
How StoryProof solves it
The page only needs an empty div with the widget id; the script lives in the include, which is where ReadMe wants it.
- Problem 3
Widget blank after moving between guides
ReadMe says the hub is a single page app: custom script loads once and does not re-run on each page change.
How StoryProof solves it
Put the div on the landing page, often the first page a visitor loads, or on a Custom Page you link to directly. One script copy fills every div present on that load.
- Problem 4
Marketing quotes in technical docs
Developers distrust hype, and one unreviewed quote on an API hub draws the wrong attention.
How StoryProof solves it
Testimonials appear only after approval in StoryProof, and you decide which approved ones each widget id shows.
- Problem 5
Starter plan with no custom HTML
ReadMe’s table shows Custom HTML unavailable on Starter, so there is no field for the script at all.
How StoryProof solves it
Link to your hosted Wall of Love from a guide or the navigation instead. Every StoryProof plan includes one.
In StoryProof
Set it up in a ReadMe project
Step 1 of 5
Choose the widget’s testimonials
In StoryProof, build a widget for the hub, choose a compact layout and the approved testimonials it shows, and copy its id.
Step 2 of 5
Add the script include
Go to Appearance, then CSS, JS, HTML. Paste the script line into End of Body Tag and save.
Step 3 of 5
Place the div on the landing page
Turn on the Landing Page under Appearance, then Navigation, and pick the Custom HTML body template. ReadMe warns that Custom HTML in the header overrides the promo title and text.
Step 4 of 5
Or build a Custom Page
Create a Custom Page in HTML mode with the second snippet. Check the published source to make sure sanitizing left the data attribute in place.
Step 5 of 5
Test a direct load
Open the page with the widget from a fresh tab, then reach it by clicking around the hub, and note which routes show it.
What each ReadMe plan lets you do here
Before you start
Limits on ReadMe
ReadMe docs as of 2026-11-14
Menu names, plan availability, sanitizing and the lifecycle events follow docs.readme.com as read on 2026-11-14. Nobody has tried these steps on a live ReadMe hub yet.
In app navigation
StoryProof does not claim a widget fills after a ReadMe page change without a reload. Direct loads are the dependable case.
Sanitized HTML
ReadMe sanitizes Custom Page HTML. If the data attribute is ever removed, use the landing page body or link to the Wall of Love.
No ReadMe integration
StoryProof has no ReadMe app or integration. The include tag and the div are the whole setup.
Badge on lower plans
Widgets keep a small "Powered by StoryProof" badge until Pro.
FAQ
Questions people ask
Short answers to what usually comes up next.
Should the script go in Head Tag or End of Body Tag?
Either is allowed; ReadMe describes Head Tag as suitable for loading external JS. End of Body Tag keeps the async file after your content, which suits a widget.
Can I put the widget inside a guide page?
Guide pages are reached mostly by in app navigation, where scripts do not re-run. The landing page and a directly linked Custom Page are the safer spots.
Does the script slow down API reference pages?
It loads async once per hub visit. Pages without a div simply have nothing for it to fill.
Is there a way without any ReadMe plan upgrade?
Yes. A normal link from a guide to your StoryProof Wall of Love needs no custom HTML at all.
Still have a question? Ask the StoryProof team or book a demo.
Show developers who already ships with you
Approve testimonials in StoryProof, then add one include tag and one div to your ReadMe hub.
Sources
- Custom CSS, HTML, and JavaScript, ReadMe Documentation. Checked 2026-11-14.
- Custom Pages, ReadMe Documentation. Checked 2026-11-14.
- Landing Page, ReadMe Documentation. Checked 2026-11-14.
Last updated 2026-11-14.