Skip to content

Commit aede4d5

Browse files
rubenmarcusclaude
andauthored
fix(docs): match blog card images to post titles and fix broken badge (#204)
* fix(docs): match blog card images to post titles and fix broken badge - Replace broken shields.io GitHub stars badge with custom "built with ralph-starter" badge (PNG with Ralph icon, includes @2x retina) - Add dedicated card images for 2 posts that were using wrong cards: - why-autonomous-coding.md was showing "The Ralph Wiggum Technique" card - validation-driven-development.md was showing "Specs Are the New Code" card - Update all card titles/subtitles to match actual blog post frontmatter - Fix "Five AI Coding Agents" → "5 AI coding agents" on card image - Regenerate all 14 blog card images with correct titles Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(docs): two-tone badge with contrast and customization page - Regenerate dark badge with contrasting backgrounds (#1a1a1e / #333338) - Add light variant badge (gray / amber) - Create /badge page for users to customize and copy badge code - Add badge section to README.md - Move badge to footer, restore GitHub stars in navbar Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(docs): add rounded corners to badge PNGs Ensure transparent alpha channel so the rx=8 rounded corners from the SVG clip-path are preserved in the exported PNGs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: add built-with badge to top of README Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(docs): use real Ralph favicon as shields.io logo Convert favicon-96x96.png to 14x14 base64 PNG for the shields.io flat badge variant. The logo now shows the actual Ralph character instead of a placeholder. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(docs): higher-res shields.io logo and natural badge size - Upgrade Ralph logo from 14x14 to 32x32 base64 for sharper rendering - Flat badge now renders at natural shields.io height (~20px) instead of being forced to 28px which made it look oversized and blurry Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(docs): remove shields.io flat badge option Keep only Dark and Light custom badge variants which render consistently at the right size and resolution. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent b0318e1 commit aede4d5

26 files changed

+333
-26
lines changed

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
<img src="ralph.png" alt="Ralph Wiggum" />
33
</p>
44

5+
<p align="center">
6+
<a href="https://ralphstarter.ai/badge"><img src="https://ralphstarter.ai/img/badge-built-with@2x.png" alt="built with ralph-starter" height="28"></a>
7+
</p>
8+
59
<p align="center">
610
<a href="https://www.npmjs.com/package/ralph-starter"><img src="https://img.shields.io/npm/v/ralph-starter.svg?style=flat-square" alt="npm version"></a>
711
<a href="https://www.npmjs.com/package/ralph-starter"><img src="https://img.shields.io/npm/dm/ralph-starter.svg?style=flat-square" alt="npm downloads"></a>
@@ -734,6 +738,18 @@ Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
734738

735739
For creating custom integrations, agents, or using the programmatic API, see the [Developer Extension Guide](https://ralphstarter.ai/docs/guides/extending-ralph-starter).
736740

741+
## Badge
742+
743+
Using ralph-starter? Add the badge to your README:
744+
745+
[![built with ralph-starter](https://ralphstarter.ai/img/badge-built-with@2x.png)](https://github.com/multivmlabs/ralph-starter)
746+
747+
```markdown
748+
[![built with ralph-starter](https://ralphstarter.ai/img/badge-built-with@2x.png)](https://github.com/multivmlabs/ralph-starter)
749+
```
750+
751+
More styles available at [ralphstarter.ai/badge](https://ralphstarter.ai/badge).
752+
737753
## License
738754

739755
MIT

docs/blog/2026-01-15-why-autonomous-coding.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ title: Why autonomous AI coding loops work
44
authors: [ruben]
55
tags: [ai, coding, automation]
66
description: I spent months copy-pasting between ChatGPT and my editor before I realized the loop itself was the problem, not the AI.
7-
image: /img/blog/ralph-wiggum-technique.png
7+
image: /img/blog/why-autonomous-coding.png
88
---
99

1010
I spent months copy-pasting code between ChatGPT and my editor before I realized I was the bottleneck.

docs/blog/2026-01-20-validation-driven-development.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ title: Let your tests guide the AI
44
authors: [ruben]
55
tags: [testing, validation, quality, best-practices]
66
description: AI-generated code that looks perfect can blow up at runtime. Adding tests to the loop lets the agent catch and fix its own mistakes.
7-
image: /img/blog/specs-new-code.png
7+
image: /img/blog/validation-driven-dev.png
88
---
99

1010
The first time I let an AI agent write code without running tests, it produced something that looked perfect. Clean code, nice comments, the works. Blew up at runtime. The second time, I added `--test` and the agent caught its own mistake and fixed it in the next loop. That's when I realized: the tests aren't just for me anymore. They're for the agent.

docs/docusaurus.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ const config: Config = {
325325
{
326326
type: 'html',
327327
position: 'right',
328-
value: '<a href="https://github.com/multivmlabs/ralph-starter" target="_blank" rel="noopener noreferrer" class="navbar__badge-link"><img src="https://img.shields.io/github/stars/multivmlabs/ralph-starter?style=for-the-badge&colorA=08080A&colorB=28282E&label=stars&logo=github&logoColor=white" alt="GitHub stars" height="28" /></a>',
328+
value: '<a href="https://github.com/multivmlabs/ralph-starter" target="_blank" rel="noopener noreferrer" class="navbar__badge-link"><img src="https://img.shields.io/github/stars/multivmlabs/ralph-starter?style=for-the-badge&logo=github&logoColor=white&label=stars&color=28282E" alt="GitHub stars" height="28" /></a>',
329329
},
330330
],
331331
},
@@ -358,7 +358,7 @@ const config: Config = {
358358
],
359359
},
360360
],
361-
copyright: `<div class="footer__logos"><a href="/" class="footer__logo-link"><img src="/img/favicon-96x96.png" alt="ralph-starter" height="28" /></a><span class="footer__logo-separator">&</span><a href="https://multivmlabs.com" target="_blank" rel="noopener noreferrer" class="footer__logo-link"><img src="/img/multivm-logo.png" alt="MultiVM Labs" height="28" /></a></div><div class="footer__copyright-text">v${version} · vibecoded with love ❤️ by <a href="https://github.com/rubenmarcus" target="_blank" rel="noopener noreferrer">rubenmarcus</a></div>`,
361+
copyright: `<div class="footer__logos"><a href="/" class="footer__logo-link"><img src="/img/favicon-96x96.png" alt="ralph-starter" height="28" /></a><span class="footer__logo-separator">&</span><a href="https://multivmlabs.com" target="_blank" rel="noopener noreferrer" class="footer__logo-link"><img src="/img/multivm-logo.png" alt="MultiVM Labs" height="28" /></a></div><div class="footer__badge"><a href="/badge" class="footer__badge-link"><img src="/img/badge-built-with.png" srcset="/img/badge-built-with@2x.png 2x" alt="built with ralph-starter" height="28" /></a></div><div class="footer__copyright-text">v${version} · vibecoded with love ❤️ by <a href="https://github.com/rubenmarcus" target="_blank" rel="noopener noreferrer">rubenmarcus</a></div>`,
362362
},
363363
prism: {
364364
theme: prismThemes.dracula,

docs/scripts/generate-blog-images.sh

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -97,66 +97,78 @@ generate_image_with_logo() {
9797

9898
echo "Generating blog images with Ralph characters..."
9999

100+
# Titles and subtitles must match the blog post frontmatter (title + description)
101+
102+
generate_image "why-autonomous-coding" \
103+
"Why autonomous AI coding loops work" \
104+
"The loop itself was the problem, not the AI" \
105+
"${IMG_DIR}/coder.png"
106+
100107
generate_image "why-i-built-ralph-starter" \
101-
"Why I Built ralph-starter" \
102-
"The story behind autonomous AI coding loops" \
108+
"Why I built ralph-starter" \
109+
"I was copy-pasting between ChatGPT and my editor" \
103110
"${IMG_DIR}/coder.png"
104111

105112
generate_image "first-ralph-loop" \
106-
"My First Ralph Loop" \
107-
"What happens when AI codes on repeat" \
113+
"My first ralph loop" \
114+
"What actually happens from start to PR" \
108115
"${IMG_DIR}/engineer.png"
109116

117+
generate_image "validation-driven-dev" \
118+
"Let your tests guide the AI" \
119+
"Tests in the loop catch and fix mistakes" \
120+
"${RALPH_DIR}/scientist.png"
121+
110122
generate_image "claude-code-setup" \
111123
"ralph-starter + Claude Code" \
112-
"The full setup guide" \
124+
"Zero to your first automated PR" \
113125
"${IMG_DIR}/coder.png"
114126

115127
generate_image_with_logo "figma-to-code" \
116-
"Figma to Code in One Command" \
117-
"Design specs to production components" \
128+
"Figma to code in one command" \
129+
"12-screen dashboard, 87 cents total" \
118130
"${RALPH_DIR}/scientist.png" \
119131
"${IMG_DIR}/figma-logo.svg"
120132

121133
generate_image "auto-mode-github" \
122-
"Automating Entire Workflows" \
134+
"Automating entire workflows" \
123135
"From specs to PRs on autopilot" \
124136
"${RALPH_DIR}/astronaut-fly.png"
125137

126138
generate_image_with_logo "linear-workflow" \
127-
"Ship Linear Tasks with AI" \
128-
"Daily workflow from tickets to PRs" \
139+
"Ship Linear tasks with AI" \
140+
"My daily workflow from tickets to PRs" \
129141
"${IMG_DIR}/engineer.png" \
130142
"${IMG_DIR}/linear.jpeg"
131143

132144
generate_image "connect-your-tools" \
133-
"From Spec to Code" \
134-
"One command pulls specs from GitHub, Linear, Notion" \
145+
"From spec to code in one command" \
146+
"Pulls specs from GitHub, Linear, Notion" \
135147
"${IMG_DIR}/coder.png"
136148

137149
generate_image "cost-tracking" \
138-
"Prompt Caching Saved Me \$47" \
139-
"Real cost breakdown of AI coding loops" \
150+
"Prompt caching saved me \$47" \
151+
"90% off input tokens after the first loop" \
140152
"${RALPH_DIR}/ralphwiggum.png"
141153

142154
generate_image "specs-new-code" \
143-
"Specs Are the New Code" \
144-
"Why writing specs beats writing code" \
155+
"Specs are the new code" \
156+
"A clear spec gets you a working PR in 2 loops" \
145157
"${RALPH_DIR}/scientist.png"
146158

147159
generate_image "ralph-wiggum-technique" \
148-
"The Ralph Wiggum Technique" \
149-
"Dumb loops, smart results" \
160+
"The Ralph Wiggum technique" \
161+
"AI coding agents in loops until done" \
150162
"${RALPH_DIR}/ralphwiggum.png"
151163

152164
generate_image "ai-agents-comparison" \
153-
"Five AI Coding Agents Compared" \
165+
"5 AI coding agents compared" \
154166
"Claude Code, Cursor, Codex, OpenCode and more" \
155167
"${RALPH_DIR}/scientist.png"
156168

157169
generate_image "vs-manual" \
158-
"ralph-starter vs Manual" \
159-
"One week, 12 tasks, real numbers" \
170+
"ralph-starter vs manual" \
171+
"6 tasks manual, 6 with ralph-starter" \
160172
"${IMG_DIR}/engineer.png"
161173

162-
echo "Done! Generated 12 blog images in ${OUT_DIR}"
174+
echo "Done! Generated 14 blog images in ${OUT_DIR}"

docs/src/css/custom.css

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,22 @@ body::before {
432432
color: var(--quantum-steel);
433433
}
434434

435+
.footer__badge {
436+
display: flex;
437+
justify-content: center;
438+
margin-bottom: var(--space-md);
439+
}
440+
441+
.footer__badge-link {
442+
display: inline-flex;
443+
opacity: 0.8;
444+
transition: opacity 0.2s ease;
445+
}
446+
447+
.footer__badge-link:hover {
448+
opacity: 1;
449+
}
450+
435451
.footer__copyright-text {
436452
margin-top: 0;
437453
}

docs/src/pages/badge.module.css

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
.main {
2+
padding: 4rem 1rem;
3+
min-height: calc(100vh - 60px);
4+
}
5+
6+
.container {
7+
max-width: 640px;
8+
margin: 0 auto;
9+
}
10+
11+
.title {
12+
font-size: 2rem;
13+
font-weight: 700;
14+
margin-bottom: 0.5rem;
15+
}
16+
17+
.subtitle {
18+
color: var(--ifm-color-secondary-darkest);
19+
margin-bottom: 2.5rem;
20+
font-size: 1.05rem;
21+
line-height: 1.6;
22+
}
23+
24+
.preview {
25+
display: flex;
26+
align-items: center;
27+
justify-content: center;
28+
padding: 2.5rem;
29+
border-radius: 12px;
30+
background: var(--ifm-background-surface-color, #1a1a1e);
31+
border: 1px solid var(--ifm-color-emphasis-200);
32+
margin-bottom: 2rem;
33+
}
34+
35+
.badgeImg {
36+
height: 28px;
37+
width: auto;
38+
}
39+
40+
.options {
41+
display: flex;
42+
flex-direction: column;
43+
gap: 1.25rem;
44+
margin-bottom: 2rem;
45+
}
46+
47+
.optionGroup {
48+
display: flex;
49+
align-items: center;
50+
gap: 1rem;
51+
}
52+
53+
.label {
54+
font-weight: 600;
55+
font-size: 0.85rem;
56+
text-transform: uppercase;
57+
letter-spacing: 0.05em;
58+
min-width: 60px;
59+
color: var(--ifm-color-secondary-darkest);
60+
}
61+
62+
.btnGroup {
63+
display: flex;
64+
gap: 0.5rem;
65+
flex-wrap: wrap;
66+
}
67+
68+
.optionBtn {
69+
padding: 0.4rem 0.85rem;
70+
border-radius: 6px;
71+
border: 1px solid var(--ifm-color-emphasis-300);
72+
background: transparent;
73+
color: var(--ifm-font-color-base);
74+
cursor: pointer;
75+
font-size: 0.85rem;
76+
transition: all 0.15s ease;
77+
}
78+
79+
.optionBtn:hover {
80+
border-color: var(--ifm-color-primary);
81+
}
82+
83+
.optionBtn.active {
84+
background: var(--ifm-color-primary);
85+
border-color: var(--ifm-color-primary);
86+
color: #000;
87+
font-weight: 600;
88+
}
89+
90+
.codeBlock {
91+
border-radius: 8px;
92+
overflow: hidden;
93+
border: 1px solid var(--ifm-color-emphasis-200);
94+
}
95+
96+
.codeHeader {
97+
display: flex;
98+
justify-content: space-between;
99+
align-items: center;
100+
padding: 0.5rem 1rem;
101+
background: var(--ifm-color-emphasis-100);
102+
font-size: 0.8rem;
103+
color: var(--ifm-color-secondary-darkest);
104+
}
105+
106+
.copyBtn {
107+
padding: 0.25rem 0.75rem;
108+
border-radius: 4px;
109+
border: 1px solid var(--ifm-color-emphasis-300);
110+
background: transparent;
111+
color: var(--ifm-font-color-base);
112+
cursor: pointer;
113+
font-size: 0.75rem;
114+
transition: all 0.15s ease;
115+
}
116+
117+
.copyBtn:hover {
118+
background: var(--ifm-color-primary);
119+
border-color: var(--ifm-color-primary);
120+
color: #000;
121+
}
122+
123+
.code {
124+
margin: 0;
125+
padding: 1rem;
126+
font-size: 0.82rem;
127+
line-height: 1.5;
128+
overflow-x: auto;
129+
white-space: pre-wrap;
130+
word-break: break-all;
131+
}

0 commit comments

Comments
 (0)