doc: split blog index into Hindsight and Hindsight Cloud sections (#534)
* doc: split blog index into Hindsight and Hindsight Cloud sections - Tag the document upload post with `hindsight-cloud` - BlogListPage renders two sections, capping Cloud at 3 posts with a "View all →" link - Swizzle BlogTagsPostsPage so /blog/tags/hindsight-cloud uses the custom grid layout * doc: attribute blog posts to Nicolò Boschi with GitHub profile image Replace the generic "Hindsight Team" author with the real author entry (nicoloboschi) across all 15 blog posts. GitHub profile image is loaded from https://github.com/nicoloboschi.png. * doc: add Hindsight Team title to nicoloboschi author * doc: assign blog posts to correct authors based on git blame - Add benfrank241 (Ben Bartholomew) and chrislatimer (Chris Latimer) to authors.yml - Assign 7 posts to Ben, 1 post to Chris, remainder stay with Nicolò
This commit is contained in:
parent
fc71664b5f
commit
28308a14d6
19 changed files with 221 additions and 21 deletions
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
slug: learning-capabilities
|
||||
title: "Agent memory that learns: observations and mental models"
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
image: /img/reflect-operation.webp
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
---
|
||||
title: How We Solved Memory Conflicts in Hindsight
|
||||
description: Learn how Hindsight handles contradictory information by tracking temporal evolution and preserving history in its memory consolidation system.
|
||||
authors: [hindsight]
|
||||
authors: [chrislatimer]
|
||||
|
||||
image: /img/blog/2026-02-09/consolidation-pipeline.png
|
||||
date: 2026-02-09
|
||||
hide_table_of_contents: true
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
title: "What's new in Hindsight 0.4.11"
|
||||
description: New features and improvements in Hindsight 0.4.11
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-02-13
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
title: "What's new in Hindsight 0.4.12"
|
||||
description: New features and improvements in Hindsight 0.4.12
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-02-18
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
title: "Your Vercel Chat SDK bot forgets everything. Hindsight fixes that."
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-02-26
|
||||
tags: [chat-sdk, slack, discord, typescript, memory]
|
||||
image: /img/blog/vercel-chat.png
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
title: "What's new in Hindsight 0.4.13 and 0.4.14"
|
||||
description: New features and improvements in Hindsight 0.4.13 and 0.4.14
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-02-27
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Your CrewAI Agents Forget Everything Between Runs. Here's the Fix."
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
|
||||
date: 2026-03-02
|
||||
tags: [crewai, agents, python, memory, tutorial]
|
||||
image: /img/blog/crewai-memory.png
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "I Gave 100+ LLMs a Permanent Memory With One Python Package"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
|
||||
date: 2026-03-03
|
||||
tags: [litellm, python, memory, openai, anthropic, tutorial]
|
||||
image: /img/blog/litellm-memory.png
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
title: "What's new in Hindsight 0.4.15"
|
||||
description: New features and improvements in Hindsight 0.4.15
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-03-03
|
||||
hide_table_of_contents: true
|
||||
image: /img/blog/release0415.png
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "The Open-Source MCP Memory Server Your AI Agent Is Missing"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
|
||||
date: 2026-03-04
|
||||
tags: [mcp, memory, agents, docker, tutorial]
|
||||
image: /img/blog/mcp-agent-memory.png
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
title: "Give Your OpenAI App a Memory in 5 Minutes"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
date: 2026-03-05
|
||||
tags: [memory, openai, python, docker, rag, llm, vector, embedding]
|
||||
image: /img/blog/add-memory-to-openai-application.png
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
title: "What's new in Hindsight 0.4.16"
|
||||
description: New features and improvements in Hindsight 0.4.16
|
||||
authors: [hindsight]
|
||||
authors: [nicoloboschi]
|
||||
date: 2026-03-05
|
||||
hide_table_of_contents: true
|
||||
image: /img/blog/release0416.png
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
title: "The Memory Upgrade Every OpenClaw User Needs"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
date: 2026-03-06
|
||||
tags: [openclaw]
|
||||
image: /img/blog/adding-memory-to-openclaw-with-hindsight.png
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
---
|
||||
title: "What's New in Hindsight Cloud: Document File Upload"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
date: 2026-03-09
|
||||
tags: [release, memory]
|
||||
tags: [hindsight-cloud, release, memory]
|
||||
hide_table_of_contents: true
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
title: "Pydantic AI Persistent Memory: Add It in 5 Lines of Code"
|
||||
authors: [hindsight]
|
||||
authors: [benfrank241]
|
||||
date: 2026-03-09
|
||||
tags: [memory, openai, anthropic, gemini, python, rust, agents, rag, vector, pydantic-ai, knowledge-graph]
|
||||
image: /img/blog/pydantic-ai-persistent-memory.png
|
||||
|
|
|
|||
|
|
@ -1,3 +1,21 @@
|
|||
hindsight:
|
||||
name: Hindsight Team
|
||||
url: https://github.com/vectorize-io/hindsight
|
||||
|
||||
nicoloboschi:
|
||||
name: Nicolò Boschi
|
||||
title: Hindsight Team
|
||||
url: https://github.com/nicoloboschi
|
||||
image_url: https://github.com/nicoloboschi.png
|
||||
|
||||
benfrank241:
|
||||
name: Ben Bartholomew
|
||||
title: Hindsight Team
|
||||
url: https://github.com/benfrank241
|
||||
image_url: https://github.com/benfrank241.png
|
||||
|
||||
chrislatimer:
|
||||
name: Chris Latimer
|
||||
title: Hindsight Team
|
||||
url: https://github.com/chrislatimer
|
||||
image_url: https://github.com/chrislatimer.png
|
||||
|
|
|
|||
|
|
@ -5,6 +5,9 @@ import type {Props} from '@theme/BlogListPage';
|
|||
import type {PropBlogPostContent} from '@docusaurus/plugin-content-blog';
|
||||
import styles from './styles.module.css';
|
||||
|
||||
const CLOUD_TAG = 'hindsight-cloud';
|
||||
const CLOUD_PREVIEW_COUNT = 3;
|
||||
|
||||
function formatDate(dateString: string): string {
|
||||
const date = new Date(dateString);
|
||||
return date.toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric'});
|
||||
|
|
@ -38,9 +41,32 @@ function BlogCard({content}: {content: PropBlogPostContent}) {
|
|||
);
|
||||
}
|
||||
|
||||
function SectionHeader({title, subtitle, viewAllHref}: {title: string; subtitle?: string; viewAllHref?: string}) {
|
||||
return (
|
||||
<div className={styles.sectionHeader}>
|
||||
<div className={styles.sectionHeaderRow}>
|
||||
<h2 className={styles.sectionTitle}>{title}</h2>
|
||||
{viewAllHref && (
|
||||
<Link to={viewAllHref} className={styles.sectionViewAll}>
|
||||
View all →
|
||||
</Link>
|
||||
)}
|
||||
</div>
|
||||
{subtitle && <p className={styles.sectionSubtitle}>{subtitle}</p>}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default function BlogListPage({items, metadata}: Props): React.ReactElement {
|
||||
const {blogTitle, blogDescription, totalPages, page, nextPage, previousPage} = metadata;
|
||||
|
||||
const cloudPosts = items.filter(({content}) =>
|
||||
(content.metadata.tags ?? []).some((t) => t.label === CLOUD_TAG),
|
||||
);
|
||||
const hindsightPosts = items.filter(({content}) =>
|
||||
!(content.metadata.tags ?? []).some((t) => t.label === CLOUD_TAG),
|
||||
);
|
||||
|
||||
return (
|
||||
<Layout title={blogTitle} description={blogDescription}>
|
||||
<main className={styles.blogPage}>
|
||||
|
|
@ -49,11 +75,34 @@ export default function BlogListPage({items, metadata}: Props): React.ReactEleme
|
|||
{blogDescription && <p className={styles.headerSubtitle}>{blogDescription}</p>}
|
||||
</header>
|
||||
|
||||
<div className={styles.grid}>
|
||||
{items.map(({content: BlogPostContent}) => (
|
||||
<BlogCard key={BlogPostContent.metadata.permalink} content={BlogPostContent} />
|
||||
))}
|
||||
</div>
|
||||
{cloudPosts.length > 0 && (
|
||||
<section className={styles.section}>
|
||||
<SectionHeader
|
||||
title="Hindsight Cloud"
|
||||
subtitle="News and updates from Hindsight Cloud"
|
||||
viewAllHref={cloudPosts.length > CLOUD_PREVIEW_COUNT ? `/blog/tags/${CLOUD_TAG}` : undefined}
|
||||
/>
|
||||
<div className={styles.grid}>
|
||||
{cloudPosts.slice(0, CLOUD_PREVIEW_COUNT).map(({content: BlogPostContent}) => (
|
||||
<BlogCard key={BlogPostContent.metadata.permalink} content={BlogPostContent} />
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
|
||||
{hindsightPosts.length > 0 && (
|
||||
<section className={styles.section}>
|
||||
<SectionHeader
|
||||
title="Hindsight"
|
||||
subtitle="Releases, guides, and deep dives into agent memory"
|
||||
/>
|
||||
<div className={styles.grid}>
|
||||
{hindsightPosts.map(({content: BlogPostContent}) => (
|
||||
<BlogCard key={BlogPostContent.metadata.permalink} content={BlogPostContent} />
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
|
||||
{totalPages > 1 && (
|
||||
<nav className={styles.pagination}>
|
||||
|
|
|
|||
|
|
@ -30,6 +30,49 @@
|
|||
line-height: 1.7;
|
||||
}
|
||||
|
||||
/* ── Section ─────────────────────────────────────── */
|
||||
.section {
|
||||
margin-bottom: 4rem;
|
||||
}
|
||||
|
||||
.sectionHeader {
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.sectionHeaderRow {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 1rem;
|
||||
margin-bottom: 0.4rem;
|
||||
}
|
||||
|
||||
.sectionTitle {
|
||||
font-size: 1.6rem;
|
||||
font-weight: 700;
|
||||
margin: 0;
|
||||
color: var(--ifm-heading-color);
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
|
||||
.sectionViewAll {
|
||||
font-size: 0.9rem;
|
||||
font-weight: 500;
|
||||
color: var(--ifm-color-primary);
|
||||
text-decoration: none !important;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.sectionViewAll:hover {
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
|
||||
.sectionSubtitle {
|
||||
font-size: 0.95rem;
|
||||
color: var(--ifm-color-emphasis-600);
|
||||
margin: 0;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* ── Grid ────────────────────────────────────────── */
|
||||
.grid {
|
||||
display: grid;
|
||||
|
|
|
|||
86
hindsight-docs/src/theme/BlogTagsPostsPage/index.tsx
Normal file
86
hindsight-docs/src/theme/BlogTagsPostsPage/index.tsx
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
import React from 'react';
|
||||
import Link from '@docusaurus/Link';
|
||||
import Layout from '@theme/Layout';
|
||||
import type {Props} from '@theme/BlogTagsPostsPage';
|
||||
import type {PropBlogPostContent} from '@docusaurus/plugin-content-blog';
|
||||
import styles from '../BlogListPage/styles.module.css';
|
||||
|
||||
function formatDate(dateString: string): string {
|
||||
const date = new Date(dateString);
|
||||
return date.toLocaleDateString('en-US', {month: 'short', day: 'numeric', year: 'numeric'});
|
||||
}
|
||||
|
||||
function BlogCard({content}: {content: PropBlogPostContent}) {
|
||||
const {metadata, assets} = content;
|
||||
const {title, description, date, readingTime, permalink, frontMatter} = metadata;
|
||||
const image = assets.image ?? frontMatter.image ?? '/img/blog-default.jpg';
|
||||
|
||||
return (
|
||||
<Link to={permalink} className={styles.card}>
|
||||
<div className={styles.cardImageWrapper}>
|
||||
{image ? (
|
||||
<img src={image} alt={title} className={styles.cardImage} />
|
||||
) : (
|
||||
<div className={styles.cardImagePlaceholder} />
|
||||
)}
|
||||
</div>
|
||||
<div className={styles.cardBody}>
|
||||
<h2 className={styles.cardTitle}>{title}</h2>
|
||||
{description && <p className={styles.cardDescription}>{description}</p>}
|
||||
<div className={styles.cardFooter}>
|
||||
<span className={styles.cardDate}>{formatDate(date)}</span>
|
||||
{readingTime !== undefined && (
|
||||
<span className={styles.cardReadTime}>{Math.ceil(readingTime)} min read</span>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</Link>
|
||||
);
|
||||
}
|
||||
|
||||
const TAG_LABELS: Record<string, {title: string; subtitle: string}> = {
|
||||
'hindsight-cloud': {
|
||||
title: 'Hindsight Cloud',
|
||||
subtitle: 'News and updates from Hindsight Cloud',
|
||||
},
|
||||
};
|
||||
|
||||
export default function BlogTagsPostsPage({tag, items, listMetadata}: Props): React.ReactElement {
|
||||
const {totalPages, page, nextPage, previousPage} = listMetadata;
|
||||
const tagInfo = TAG_LABELS[tag.label] ?? {title: tag.label, subtitle: undefined};
|
||||
|
||||
return (
|
||||
<Layout title={tagInfo.title} description={tagInfo.subtitle}>
|
||||
<main className={styles.blogPage}>
|
||||
<header className={styles.header}>
|
||||
<h1 className={styles.headerTitle}>{tagInfo.title}</h1>
|
||||
{tagInfo.subtitle && <p className={styles.headerSubtitle}>{tagInfo.subtitle}</p>}
|
||||
</header>
|
||||
|
||||
<div className={styles.grid}>
|
||||
{items.map(({content: BlogPostContent}) => (
|
||||
<BlogCard key={BlogPostContent.metadata.permalink} content={BlogPostContent} />
|
||||
))}
|
||||
</div>
|
||||
|
||||
{totalPages > 1 && (
|
||||
<nav className={styles.pagination}>
|
||||
{previousPage && (
|
||||
<Link to={previousPage} className={styles.paginationButton}>
|
||||
← Previous
|
||||
</Link>
|
||||
)}
|
||||
<span className={styles.paginationInfo}>
|
||||
Page {page} of {totalPages}
|
||||
</span>
|
||||
{nextPage && (
|
||||
<Link to={nextPage} className={styles.paginationButton}>
|
||||
Next →
|
||||
</Link>
|
||||
)}
|
||||
</nav>
|
||||
)}
|
||||
</main>
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
Loading…
Reference in a new issue