Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
6e35914
Added the new docs homepage with sidenav
Debanitrkl Dec 14, 2025
9384e7b
Added the ingestion flow
Debanitrkl Dec 16, 2025
d025c30
Added the copy page integration
Debanitrkl Dec 17, 2025
68c10df
Fixed the failure
Debanitrkl Dec 17, 2025
cf944d4
Fixed the telemetry router
Debanitrkl Dec 17, 2025
9321f83
Revamped the side nav
Debanitrkl Dec 18, 2025
cc85e65
Added integrations
Debanitrkl Dec 18, 2025
1e2c4be
Added datadog like integrations page
Debanitrkl Dec 18, 2025
5eccdca
Added AI based search
Debanitrkl Dec 19, 2025
0dff14e
updated the side-nav for integrations
Debanitrkl Dec 19, 2025
3ae1dc0
Added the docs and added executable blocks
Debanitrkl Dec 19, 2025
12d2b58
Added security guardrails
Debanitrkl Dec 19, 2025
f1f3542
Updated features and user-guide
Debanitrkl Dec 22, 2025
f329a08
Fix ESLint errors
Debanitrkl Dec 22, 2025
3e1c70f
Added examples for prometheus
Debanitrkl Dec 22, 2025
6789e1d
Updated the sidenav structure
Debanitrkl Dec 22, 2025
4332f86
Added homepage content in root path
Debanitrkl Dec 22, 2025
7004f11
Fixed URL redirects
Debanitrkl Dec 22, 2025
6e76300
Fix mainPage.tsx JSX syntax errors
Debanitrkl Dec 22, 2025
ac78542
fix: Remove 404 links from documentation_pages.csv
Debanitrkl Dec 29, 2025
f581378
feat: add Ask AI chat, deployment mode switcher, and LLM endpoints
Debanitrkl Dec 31, 2025
1e7b1c1
fix: remove conflicting /docs/* redirect that breaks production deplo…
Debanitrkl Dec 31, 2025
8d360c3
fix: revert to assetPrefix instead of basePath to match main branch
Debanitrkl Dec 31, 2025
dbf0798
Reorganise
Debanitrkl Jan 2, 2026
44a06f3
Restructure docs: remove top-level links, add introduction/benchmarks…
Debanitrkl Jan 4, 2026
d3d507a
Add clerk style TOC for hierarchical table of contents
Debanitrkl Jan 5, 2026
fb9e08e
Restructure docs: move cloud content to root, flatten sidebar, add pa…
Debanitrkl Jan 5, 2026
139fe1c
update home page content
nitisht Jan 7, 2026
6e97270
update docs
nitisht Jan 7, 2026
80a190c
update docs
nitisht Jan 7, 2026
4206caa
update text
nitisht Jan 10, 2026
a8c4850
update text:
nitisht Jan 11, 2026
c07defd
update
nitisht Jan 12, 2026
c397c94
Updated ingestion
Debanitrkl Jan 12, 2026
1fa3e18
Merge origin/main - resolve conflicts
Debanitrkl Jan 12, 2026
8cd413b
Reorganize ingest-data: move cicd/cloud/llm-agents/security from inte…
Debanitrkl Jan 12, 2026
7e9d67b
Move storage pages (AWS S3, Azure Blob, GCS, DigitalOcean Spaces) bac…
Debanitrkl Jan 12, 2026
5b4d45f
Move storage pages from integrations to self-hosted/storage-targets
Debanitrkl Jan 12, 2026
0f4b9e2
Merge duplicate AWS S3 docs into single comprehensive file
Debanitrkl Jan 12, 2026
5f547bf
Add feedback component with PostHog integration
Debanitrkl Jan 12, 2026
efb672f
Add PostHog feedback tracking with client-side capture
Debanitrkl Jan 12, 2026
ee0e6d1
update text
nitisht Jan 13, 2026
f0d7f73
update
nitisht Jan 13, 2026
1a12537
Fix security docs: broken links, Splunk HEC format, credential notes,…
Debanitrkl Jan 13, 2026
2ff8cc7
Add LLM Observability section with dedicated landing page and OTel co…
Debanitrkl Jan 13, 2026
7edcc7b
Fix broken links: update paths for llm-observability, user-guide, sel…
Debanitrkl Jan 13, 2026
ce9df0e
Fix all broken links and add index pages for logging-agents and progr…
Debanitrkl Jan 13, 2026
b58dcfe
update
nitisht Jan 15, 2026
5f14586
Add feature comparison pages for OSS, Pro, and Enterprise tiers with …
Debanitrkl Jan 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 4 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@ NEXT_PUBLIC_GA_MEASUREMENT_ID=G-XXXXXXXXXX
NEXT_PUBLIC_ENV=development/production

# Koala Analytics
NEXT_PUBLIC_KOALA_PUBLIC_API_KEY=pk_xxxxxxxxxxxxxxxxxxxxxxxx
NEXT_PUBLIC_KOALA_PUBLIC_API_KEY=pk_xxxxxxxxxxxxxxxxxxxxxxxx

# Tavily AI Search API Key (get from https://tavily.com)
TAVILY_API_KEY=tvly-XXXXXXXXXX
13 changes: 13 additions & 0 deletions .source/browser.ts

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions .source/dynamic.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// @ts-nocheck
import { dynamic } from 'fumadocs-mdx/runtime/dynamic';
import * as Config from '../source.config';

const create = await dynamic<typeof Config, import("fumadocs-mdx/runtime/types").InternalTypeConfig & {
DocData: {
}
}>(Config, {"configPath":"source.config.ts","environment":"next","outDir":".source"}, {"doc":{"passthroughs":["extractedReferences"]}});
87 changes: 0 additions & 87 deletions .source/index.ts

This file was deleted.

266 changes: 266 additions & 0 deletions .source/server.ts

Large diffs are not rendered by default.

10 changes: 9 additions & 1 deletion .source/source.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,19 @@ import {
metaSchema
} from "fumadocs-mdx/config";
import { remarkAdmonition } from "fumadocs-core/mdx-plugins";
import { z } from "zod";
var extendedFrontmatterSchema = frontmatterSchema.extend({
full: z.boolean().default(false)
});
var docs = defineDocs({
// The root directory for all documentation
dir: "content/docs",
docs: {
schema: frontmatterSchema
schema: extendedFrontmatterSchema,
postprocess: {
// Only include processed markdown in production (for LLM endpoints)
includeProcessedMarkdown: process.env.NODE_ENV === "production"
}
},
meta: {
schema: metaSchema
Expand Down
7 changes: 0 additions & 7 deletions app/(docs)/[[...slug]]/homepage.client.tsx

This file was deleted.

44 changes: 27 additions & 17 deletions app/(docs)/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,42 +5,42 @@ import {
DocsDescription,
DocsTitle,
} from 'fumadocs-ui/page';
import { notFound } from 'next/navigation';
import { notFound, redirect } from 'next/navigation';
import { createRelativeLink } from 'fumadocs-ui/mdx';
import { getMDXComponents } from '@/mdx-components';
import { EditOnGitHub } from './page.client';

const owner = 'parseablehq';
const repo = 'developer-hub';

import { HomepageContent } from './homepage.client';
import { CopyPageDropdown } from '@/components/CopyPageDropdown';
import { Feedback } from '@/components/feedback/client';
import { onPageFeedbackAction } from '@/components/feedback/actions';

export default async function Page(props: {
params: Promise<{ slug?: string[] }>;
}) {
const params = await props.params;

// If we're at the root /docs path, show the homepage content
if (!params.slug || params.slug.length === 0) {
return <HomepageContent />;
}
// If we're at the root path, show the index page (Get Started)
// No redirect needed - the index page will be shown

// Otherwise, show the regular docs page
const page = source.getPage(params.slug);
if (!page) notFound();
const path = `content/docs/${page.file.path}`;

const MDXContent = page.data.body;

return (
<DocsPage toc={page.data.toc} full={page.data.full}>
<DocsPage
toc={page.data.toc}
full={page.data.full}
tableOfContent={{
style: 'clerk',
}}
tableOfContentPopover={{
style: 'clerk',
}}
>
<DocsTitle>{page.data.title}</DocsTitle>
<DocsDescription>{page.data.description}</DocsDescription>
<div className="flex flex-row gap-2 items-center mb-4">
{/* <LLMCopyButton slug={params.slug} /> */}
<EditOnGitHub
url={`https://github.com/${owner}/${repo}/tree/main/${path}`}
/>
<CopyPageDropdown slug={params.slug ?? []} filePath={`${params.slug?.join('/') || 'index'}.mdx`} />
</div>
<hr/>
<DocsBody>
Expand All @@ -51,6 +51,7 @@ export default async function Page(props: {
})}
/>
</DocsBody>
<Feedback onSendAction={onPageFeedbackAction} />
</DocsPage>
);
}
Expand All @@ -65,6 +66,15 @@ export async function generateMetadata(props: {
params: Promise<{ slug?: string[] }>;
}) {
const params = await props.params;

// Handle root /docs path - will redirect, but provide metadata just in case
if (!params.slug || params.slug.length === 0) {
return {
title: 'Parseable Documentation',
description: 'Welcome to the Parseable documentation',
};
}

const page = source.getPage(params.slug);
if (!page) notFound();

Expand Down
37 changes: 33 additions & 4 deletions app/(docs)/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,46 @@ import { DocsLayout } from 'fumadocs-ui/layouts/docs';
import type { ReactNode } from 'react';
import { baseOptions } from '@/app/layout.config';
import { source } from '@/lib/source';
import SearchButton from '@/components/SearchButton';
import { AskAITrigger } from '@/components/AskAI';

export default function Layout({ children }: { children: ReactNode }) {
return (
<DocsLayout
tree={source.pageTree}
tree={source.getPageTree()}
{...baseOptions}
// sidebar={{
// enabled: false
// }}
searchToggle={{
components: {
sm: <SearchButton />,
lg: <SearchButton />,
},
}}
sidebar={{
tabs: {
transform(option, node) {
if (!node.icon) return option;
const color = `var(--${node.name?.toString().toLowerCase().replace(/[- ]/g, '-')}-color, var(--color-fd-foreground))`;

return {
...option,
icon: (
<div
className="[&_svg]:size-full rounded-lg size-full max-md:bg-[var(--tab-color)]/10 max-md:border max-md:p-1.5"
style={{
'--tab-color': color,
color: color,
} as React.CSSProperties}
>
{node.icon}
</div>
),
};
},
},
}}
>
{children}
<AskAITrigger />
</DocsLayout>
);
}
71 changes: 71 additions & 0 deletions app/api/ai-search/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import { NextRequest, NextResponse } from 'next/server';

export async function POST(request: NextRequest) {
try {
const { query } = await request.json();

if (!query || typeof query !== 'string') {
return NextResponse.json(
{ error: 'Query is required' },
{ status: 400 }
);
}

const apiKey = process.env.TAVILY_API_KEY;
if (!apiKey) {
return NextResponse.json(
{ error: 'Tavily API key not configured' },
{ status: 500 }
);
}

// Search specifically within Parseable documentation
const response = await fetch('https://api.tavily.com/search', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
api_key: apiKey,
query: `${query} site:parseable.com OR site:parseable.io`,
search_depth: 'advanced',
include_answer: true,
include_raw_content: false,
max_results: 5,
include_domains: ['parseable.com', 'parseable.io', 'docs.parseable.com'],
}),
});

if (!response.ok) {
const errorText = await response.text();
console.error('Tavily API error:', errorText);
return NextResponse.json(
{ error: 'Failed to fetch AI search results' },
{ status: response.status }
);
}

const data = await response.json();

return NextResponse.json({
answer: data.answer || null,
results: data.results?.map((result: {
title: string;
url: string;
content: string;
score?: number;
}) => ({
title: result.title,
url: result.url,
content: result.content,
score: result.score,
})) || [],
});
} catch (error) {
console.error('AI search error:', error);
return NextResponse.json(
{ error: 'Internal server error' },
{ status: 500 }
);
}
}
Loading