Compare commits

...
Author SHA1 Message Date
Nicolò Boschi 0ac7a4c957 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ò
2026-03-10 10:51:57 +01:00
Nicolò Boschi cc374efbe5 doc: add Hindsight Team title to nicoloboschi author 2026-03-10 10:48:51 +01:00
Nicolò Boschi 528a15db00 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.
2026-03-10 10:48:08 +01:00
Nicolò Boschi a8926d5749 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
2026-03-10 10:37:46 +01:00
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 -1
View File
@@ -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
---
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+18
View File
@@ -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;
@@ -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>
);
}