mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-04-25 00:36:31 +02:00
feat: released 0.0.9 changelog
This commit is contained in:
parent
b4b7059035
commit
2603db74eb
7 changed files with 207 additions and 2 deletions
116
surfsense_web/app/(home)/changelog/page.tsx
Normal file
116
surfsense_web/app/(home)/changelog/page.tsx
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
import { loader } from "fumadocs-core/source";
|
||||
import { changelog } from "@/.source/server";
|
||||
import { formatDate } from "@/lib/utils";
|
||||
import { getMDXComponents } from "@/mdx-components";
|
||||
|
||||
const source = loader({
|
||||
baseUrl: "/changelog",
|
||||
source: changelog.toFumadocsSource(),
|
||||
});
|
||||
|
||||
interface ChangelogData {
|
||||
title: string;
|
||||
date: string;
|
||||
version?: string;
|
||||
tags?: string[];
|
||||
body: React.ComponentType<{ components?: Record<string, React.ComponentType> }>;
|
||||
}
|
||||
|
||||
interface ChangelogPageItem {
|
||||
url: string;
|
||||
data: ChangelogData;
|
||||
}
|
||||
|
||||
export default async function ChangelogPage() {
|
||||
const allPages = source.getPages() as ChangelogPageItem[];
|
||||
const sortedChangelogs = allPages.sort((a, b) => {
|
||||
const dateA = new Date(a.data.date).getTime();
|
||||
const dateB = new Date(b.data.date).getTime();
|
||||
return dateB - dateA;
|
||||
});
|
||||
|
||||
return (
|
||||
<div className="min-h-screen relative pt-20">
|
||||
{/* Header */}
|
||||
<div className="border-b border-border/50">
|
||||
<div className="max-w-5xl mx-auto relative">
|
||||
<div className="p-6 flex items-center justify-between">
|
||||
<div>
|
||||
<h1 className="text-4xl font-bold tracking-tight bg-gradient-to-r from-gray-900 to-gray-600 dark:from-white dark:to-gray-400 bg-clip-text text-transparent">
|
||||
Changelog
|
||||
</h1>
|
||||
<p className="text-muted-foreground mt-2">
|
||||
Stay up to date with the latest updates and improvements to SurfSense.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Timeline */}
|
||||
<div className="max-w-5xl mx-auto px-6 lg:px-10 pt-10 pb-20">
|
||||
<div className="relative">
|
||||
{sortedChangelogs.map((changelog) => {
|
||||
const MDX = changelog.data.body;
|
||||
const date = new Date(changelog.data.date);
|
||||
const formattedDate = formatDate(date);
|
||||
|
||||
return (
|
||||
<div key={changelog.url} className="relative">
|
||||
<div className="flex flex-col md:flex-row gap-y-6">
|
||||
<div className="md:w-48 flex-shrink-0">
|
||||
<div className="md:sticky md:top-24 pb-10">
|
||||
<time className="text-sm font-medium text-muted-foreground block mb-3">
|
||||
{formattedDate}
|
||||
</time>
|
||||
|
||||
{changelog.data.version && (
|
||||
<div className="inline-flex relative z-10 items-center justify-center w-12 h-12 text-foreground border border-border rounded-xl text-sm font-bold bg-card shadow-sm">
|
||||
{changelog.data.version}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Right side - Content */}
|
||||
<div className="flex-1 md:pl-8 relative pb-10">
|
||||
{/* Vertical timeline line */}
|
||||
<div className="hidden md:block absolute top-2 left-0 w-px h-full bg-border">
|
||||
{/* Timeline dot */}
|
||||
<div className="hidden md:block absolute -translate-x-1/2 size-3 bg-primary rounded-full z-10" />
|
||||
</div>
|
||||
|
||||
<div className="space-y-6">
|
||||
<div className="relative z-10 flex flex-col gap-2">
|
||||
<h2 className="text-2xl font-semibold tracking-tight text-balance">
|
||||
{changelog.data.title}
|
||||
</h2>
|
||||
|
||||
{/* Tags */}
|
||||
{changelog.data.tags && changelog.data.tags.length > 0 && (
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{changelog.data.tags.map((tag: string) => (
|
||||
<span
|
||||
key={tag}
|
||||
className="h-6 w-fit px-2.5 text-xs font-medium bg-muted text-muted-foreground rounded-full border flex items-center justify-center"
|
||||
>
|
||||
{tag}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="prose dark:prose-invert max-w-none prose-headings:scroll-mt-8 prose-headings:font-semibold prose-a:no-underline prose-headings:tracking-tight prose-headings:text-balance prose-p:tracking-tight prose-p:text-balance prose-img:rounded-xl prose-img:shadow-lg">
|
||||
<MDX components={getMDXComponents()} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
44
surfsense_web/changelog/content/2025-12-24.mdx
Normal file
44
surfsense_web/changelog/content/2025-12-24.mdx
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
---
|
||||
title: "SurfSense v0.0.9 - Introducing the Agentic Architecture"
|
||||
description: "SurfSense v0.0.9 introduces a new agentic architecture with intelligent source selection, temporal query understanding, and MCP compatibility."
|
||||
date: "2025-12-24"
|
||||
tags: ["Agentic", "Agent", "MCP"]
|
||||
version: "0.0.9"
|
||||
---
|
||||
|
||||
<Video src="/demo.mp4" />
|
||||
|
||||
## What's New in v0.0.9
|
||||
|
||||
This release introduces the **SurfSense Agent**, a shift from pre-determined workflows (DAG) to dynamic, LLM-driven decision making.
|
||||
|
||||
- **Smarter Source Selection**: Intelligently searches all connected sources based on your query, not just the ones you specify
|
||||
- **Temporal Queries**: Understands time-based questions like *"Slack messages from last week"*
|
||||
- **Reasoning & Refinement**: Iteratively refines answers for better accuracy
|
||||
- **Better Prompt Handling**: Knows when to respond in chat vs generate a podcast
|
||||
- **Faster Indexing**: Improved speed when syncing connected sources
|
||||
- **MCP Compatibility**: Extensible architecture supporting Model Context Protocol servers
|
||||
|
||||
<Accordion type="multiple" className="w-full not-prose">
|
||||
<AccordionItem value="item-1">
|
||||
<AccordionTrigger>For Developers</AccordionTrigger>
|
||||
<AccordionContent className="flex flex-col gap-4 text-balance">
|
||||
<ul className="list-disc space-y-2 pl-4">
|
||||
<li>More extensible architecture for adding connectors and tools</li>
|
||||
<li>Supports long-running agents for complex tasks</li>
|
||||
<li>Cleaner codebase enables faster contributions</li>
|
||||
</ul>
|
||||
</AccordionContent>
|
||||
</AccordionItem>
|
||||
<AccordionItem value="item-2">
|
||||
<AccordionTrigger>Notes</AccordionTrigger>
|
||||
<AccordionContent className="flex flex-col gap-4 text-balance">
|
||||
<ul className="list-disc space-y-2 pl-4">
|
||||
<li>May increase API costs due to dynamic LLM calls</li>
|
||||
<li>Users with small local models may see varied performance</li>
|
||||
</ul>
|
||||
</AccordionContent>
|
||||
</AccordionItem>
|
||||
</Accordion>
|
||||
|
||||
SurfSense is an AI-powered federated search solution that connects all your knowledge sources in one place.
|
||||
|
|
@ -14,6 +14,7 @@ export const Navbar = () => {
|
|||
const navItems = [
|
||||
// { name: "Home", link: "/" },
|
||||
{ name: "Pricing", link: "/pricing" },
|
||||
{ name: "Changelog", link: "/changelog" },
|
||||
// { name: "Sign In", link: "/login" },
|
||||
{ name: "Docs", link: "/docs" },
|
||||
];
|
||||
|
|
|
|||
|
|
@ -11,3 +11,11 @@ export function getChatTitleFromMessages(messages: Message[]) {
|
|||
if (userMessages.length === 0) return "Untitled Chat";
|
||||
return userMessages[0].content;
|
||||
}
|
||||
|
||||
export const formatDate = (date: Date): string => {
|
||||
return date.toLocaleDateString("en-US", {
|
||||
year: "numeric",
|
||||
month: "long",
|
||||
day: "numeric",
|
||||
});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,9 +1,28 @@
|
|||
import defaultMdxComponents from "fumadocs-ui/mdx";
|
||||
import type { MDXComponents } from "mdx/types";
|
||||
import {
|
||||
Accordion,
|
||||
AccordionContent,
|
||||
AccordionItem,
|
||||
AccordionTrigger,
|
||||
} from "@/components/ui/accordion";
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
export function getMDXComponents(components?: MDXComponents): MDXComponents {
|
||||
return {
|
||||
...defaultMdxComponents,
|
||||
img: ({ className, ...props }: React.ComponentProps<"img">) => (
|
||||
<img className={cn("rounded-md border", className)} {...props} />
|
||||
),
|
||||
Video: ({ className, ...props }: React.ComponentProps<"video">) => (
|
||||
<video className={cn("rounded-md border", className)} controls loop {...props} />
|
||||
),
|
||||
Accordion,
|
||||
AccordionItem,
|
||||
AccordionTrigger,
|
||||
AccordionContent,
|
||||
...components,
|
||||
};
|
||||
}
|
||||
|
||||
export const useMDXComponents = getMDXComponents;
|
||||
|
|
|
|||
BIN
surfsense_web/public/demo.mp4
Normal file
BIN
surfsense_web/public/demo.mp4
Normal file
Binary file not shown.
|
|
@ -1,7 +1,24 @@
|
|||
import { defineConfig, defineDocs } from "fumadocs-mdx/config";
|
||||
import { defineConfig, defineDocs, frontmatterSchema } from "fumadocs-mdx/config";
|
||||
import { z } from "zod";
|
||||
|
||||
export const docs = defineDocs({
|
||||
dir: "content/docs",
|
||||
});
|
||||
|
||||
export default defineConfig();
|
||||
export const changelog = defineDocs({
|
||||
dir: "changelog/content",
|
||||
docs: {
|
||||
schema: frontmatterSchema.extend({
|
||||
date: z.string(),
|
||||
tags: z.array(z.string()).optional(),
|
||||
version: z.string().optional(),
|
||||
}),
|
||||
},
|
||||
});
|
||||
|
||||
export default defineConfig({
|
||||
lastModifiedTime: "git",
|
||||
mdxOptions: {
|
||||
providerImportSource: "@/mdx-components",
|
||||
},
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue