Skip to content

blog: restyle docs.litellm.ai/blog to engineering blog aesthetic - #25580

Merged
ishaan-berri merged 5 commits into
mainfrom
blog/ramp-style-restyle-with-redis-post
Apr 12, 2026
Merged

blog: restyle docs.litellm.ai/blog to engineering blog aesthetic#25580
ishaan-berri merged 5 commits into
mainfrom
blog/ramp-style-restyle-with-redis-post

Conversation

@ishaan-berri

@ishaan-berri ishaan-berri commented Apr 12, 2026

Copy link
Copy Markdown
Contributor

Relevant issues

Screenshot 2026-04-11 at 6 05 48 PM

None

What

Restyled the LiteLLM docs blog (/blog) to match a clean engineering blog aesthetic (similar to builders blog).

Blog list page (/blog):

  • Hero section: "AI Gateway" eyebrow + "Engineering" heading + subtitle + "We're hiring!" button
  • Provider marquee showing 14 providers with favicons, animated scroll
  • Clean flat-list layout: title, description, authors (linked), date with "—" separator
  • No cards, no colored tags — just clean typography

Blog post pages:

  • Left sidebar (all posts) hidden via CSS targeting .blog-post-page aside.col
  • Hiring CTA appended to every post: "Like what you see? Join us →" linking to Ashby
  • Swizzled BlogPostPage component

New post:

  • Added blog/redis_circuit_breaker/ — "Making the AI Gateway Resilient to Redis Failures"
  • 4 inline React diagram components (CascadeFailure, CircuitBreakerStates, CircuitBreakerFlow, IncidentTimeline)
  • No external dependencies, all inline styles

Pre-Submission checklist

Type

  • New Feature
  • Documentation / Blog
  • Bug Fix

Changes

  • docs/my-website/src/css/custom.css — blog sidebar hide + prose overrides
  • docs/my-website/src/theme/BlogListPage/index.js — full restyle
  • docs/my-website/src/theme/BlogListPage/styles.module.css — new styles
  • docs/my-website/src/theme/BlogPostPage/index.js — new swizzle
  • docs/my-website/src/theme/BlogPostPage/styles.module.css — CTA styles
  • docs/my-website/blog/redis_circuit_breaker/index.md — new post
  • docs/my-website/blog/redis_circuit_breaker/diagrams.js — React diagram components

@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@codspeed-hq

codspeed-hq Bot commented Apr 12, 2026

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 16 untouched benchmarks


Comparing blog/ramp-style-restyle-with-redis-post (14eed24) with main (2c786ca)

Open in CodSpeed

@ishaan-berri ishaan-berri changed the title blog: restyle docs.litellm.ai/blog to Ramp-style engineering blog aesthetic blog: restyle docs.litellm.ai/blog to engineering blog aesthetic Apr 12, 2026
@codecov

codecov Bot commented Apr 12, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@greptile-apps

greptile-apps Bot commented Apr 12, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR restyled the /blog page to a clean flat-list engineering blog aesthetic (Ramp-style), swizzled BlogPostPage to append a hiring CTA, and added a new Redis circuit breaker blog post with inline React diagram components.

  • P1 — dark mode code block regression: background: #ffffff !important on .blog-wrapper article .markdown pre has no [data-theme='dark'] counterpart, so all code blocks in blog posts render with a bright white background in dark mode.
  • P2 — dead useEffect: The blog-post-body body class added in BlogPostPage/index.js is never referenced in CSS; sidebar hiding already works via Docusaurus's own .blog-post-page class.

Confidence Score: 4/5

Safe to merge after fixing the dark-mode code block regression; all other findings are P2 style improvements.

One P1 issue: missing dark-mode override for pre blocks causes white boxes in dark mode due to !important. The remaining findings (dead useEffect, Google favicon API, missing noreferrer) are P2 and don't block merge.

docs/my-website/src/css/custom.css — missing [data-theme='dark'] override for .blog-wrapper article .markdown pre

Important Files Changed

Filename Overview
docs/my-website/src/css/custom.css Adds blog styling overrides; background: #ffffff !important on pre blocks has no dark-mode counterpart, causing white code blocks in dark mode
docs/my-website/src/theme/BlogPostPage/index.js New swizzle wrapping OriginalBlogPostPage with a hiring CTA; useEffect adding blog-post-body to body is dead code (no matching CSS selector)
docs/my-website/src/theme/BlogListPage/index.js Full restyle of blog list with marquee and flat post rows; provider favicons sourced from Google's undocumented favicon API (external runtime dependency); author links missing noreferrer
docs/my-website/src/theme/BlogListPage/styles.module.css New CSS module for blog list; dark-mode overrides are present and complete for all elements in this file
docs/my-website/src/theme/BlogPostPage/styles.module.css New CTA styles with dark-mode variants; no issues found
docs/my-website/blog/redis_circuit_breaker/diagrams.js New inline React diagram components (CascadeFailure, CircuitBreakerStates, CircuitBreakerFlow, IncidentTimeline) with all inline styles; no issues found
docs/my-website/blog/redis_circuit_breaker/index.md New blog post on Redis circuit breaker; imports diagram components from sibling file; no structural issues

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["/blog route"] --> B[BlogListPage]
    B --> C[Layout]
    B --> D[Hero Section]
    B --> E[ProviderMarquee\n14 providers via Google favicon API]
    B --> F[Post List]
    F --> G["PostRow × N"]
    G --> H[AuthorList]
    J["/blog/:post route"] --> K[BlogPostPage swizzle]
    K --> L[OriginalBlogPostPage]
    K --> M[HiringCTA]
    K --> N["useEffect — adds blog-post-body\n⚠ class unused in CSS"]
    P["redis_circuit_breaker/index.md"] --> Q[CascadeFailure]
    P --> R[CircuitBreakerStates]
    P --> S[CircuitBreakerFlow]
    P --> T[IncidentTimeline]
Loading

Reviews (1): Last reviewed commit: "add redis circuit breaker blog post with..." | Re-trigger Greptile

Comment on lines +877 to +882
.blog-wrapper article .markdown pre {
background: #ffffff !important;
border: 1px solid #e5e7eb !important;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.06);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Code blocks always white in dark mode

.blog-wrapper article .markdown pre is forced to background: #ffffff !important, but there is no corresponding [data-theme='dark'] override for pre — only inline code gets one (lines 912–916). The !important flag beats Docusaurus's own dark-theme stylesheet, so every code block in a blog post renders with a bright white box in dark mode.

Suggested change
.blog-wrapper article .markdown pre {
background: #ffffff !important;
border: 1px solid #e5e7eb !important;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.06);
}
.blog-wrapper article .markdown pre {
background: #ffffff !important;
border: 1px solid #e5e7eb !important;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.06);
}
[data-theme='dark'] .blog-wrapper article .markdown pre {
background: #1f2937 !important;
border-color: #374151 !important;
box-shadow: none;
}

Comment on lines +28 to +32
// Add body class so CSS can hide the sidebar
useEffect(() => {
document.body.classList.add('blog-post-body');
return () => document.body.classList.remove('blog-post-body');
}, []);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 blog-post-body class is never used

The comment says this body class is added so CSS can hide the sidebar, but custom.css targets .blog-post-page aside.col — a class Docusaurus applies automatically to the page container, not the <body>. The blog-post-body class has no matching CSS selector anywhere, making this useEffect dead code.

Suggested change
// Add body class so CSS can hide the sidebar
useEffect(() => {
document.body.classList.add('blog-post-body');
return () => document.body.classList.remove('blog-post-body');
}, []);
export default function BlogPostPage(props) {
return (
<>
<OriginalBlogPostPage {...props} />
<HiringCTA />
</>
);
}

Comment on lines +7 to +22
const PROVIDERS = [
{ name: 'OpenAI', img: 'https://www.google.com/s2/favicons?domain=openai.com&sz=64' },
{ name: 'Anthropic', img: 'https://www.google.com/s2/favicons?domain=claude.ai&sz=64' },
{ name: 'Google Gemini', img: 'https://www.google.com/s2/favicons?domain=ai.google.dev&sz=64' },
{ name: 'AWS Bedrock', img: 'https://www.google.com/s2/favicons?domain=aws.amazon.com&sz=64' },
{ name: 'Azure OpenAI', img: 'https://www.google.com/s2/favicons?domain=azure.microsoft.com&sz=64' },
{ name: 'Mistral AI', img: 'https://www.google.com/s2/favicons?domain=mistral.ai&sz=64' },
{ name: 'Meta Llama', img: 'https://www.google.com/s2/favicons?domain=meta.com&sz=64' },
{ name: 'Groq', img: 'https://www.google.com/s2/favicons?domain=groq.com&sz=64' },
{ name: 'Hugging Face', img: 'https://www.google.com/s2/favicons?domain=huggingface.co&sz=64' },
{ name: 'Perplexity', img: 'https://www.google.com/s2/favicons?domain=perplexity.ai&sz=64' },
{ name: 'DeepSeek', img: 'https://www.google.com/s2/favicons?domain=deepseek.com&sz=64' },
{ name: 'Cohere', img: 'https://www.google.com/s2/favicons?domain=cohere.com&sz=64' },
{ name: 'Together AI', img: 'https://www.google.com/s2/favicons?domain=together.ai&sz=64' },
{ name: 'Vertex AI', img: 'https://www.google.com/s2/favicons?domain=cloud.google.com&sz=64' },
];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 External Google favicon API dependency

Every page load fires 14 requests to https://www.google.com/s2/favicons?.... This service is undocumented, has no SLA, and is commonly blocked by privacy extensions and corporate proxies — meaning the marquee may show broken-image icons for many visitors. Hosting the favicons locally in static/img/providers/ would remove the runtime dependency and load faster.

<React.Fragment key={a.name}>
{i > 0 && <span className={styles.authorSep}> </span>}
{a.url ? (
<a href={a.url} target="_blank" rel="noopener" className={styles.authorLink}>{a.name}</a>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Missing noreferrer on author external links

rel="noopener" alone doesn't suppress the Referer header. For links that open in a new tab, the recommendation is rel="noopener noreferrer" to also prevent the destination from receiving the referrer URL.

Suggested change
<a href={a.url} target="_blank" rel="noopener" className={styles.authorLink}>{a.name}</a>
<a href={a.url} target="_blank" rel="noopener noreferrer" className={styles.authorLink}>{a.name}</a>

@ishaan-berri
ishaan-berri merged commit f74d626 into main Apr 12, 2026
48 of 49 checks passed
@ishaan-berri
ishaan-berri deleted the blog/ramp-style-restyle-with-redis-post branch April 12, 2026 01:11
fzowl pushed a commit to fzowl/litellm that referenced this pull request Jun 24, 2026
…-with-redis-post

blog: restyle docs.litellm.ai/blog to engineering blog aesthetic
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.

3 participants