Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/content/advanced/folders-and-templates.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Folders and templates
icon: LuFolderTree
description: Describe a folder with its own properties, and offer reusable templates that give new documents their starting content and properties.
---

Expand Down
1 change: 1 addition & 0 deletions docs/content/features/agent-activity.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Agent activity
icon: LuActivity
description: See every file an agent edits in a session, with per-edit diffs and selective rollback.
---

Expand Down
1 change: 1 addition & 0 deletions docs/content/features/assets-and-embeds.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Assets and embeds
icon: LuPaperclip
description: Drop files into the editor and reference them with wiki-style embeds.
---

Expand Down
1 change: 1 addition & 0 deletions docs/content/features/editor.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Editor
icon: LuPenLine
description: The OpenKnowledge editor. WYSIWYG markdown, source toggle, content blocks, inline frontmatter, and the file sidebar.
---
The editor is where you read, write, and collaborate on your docs, and where AI agents land when they edit. WYSIWYG by default with a source-mode toggle, a frontmatter properties pane, real-time CRDT collaboration, and a file sidebar that organizes the project.
Expand Down
1 change: 1 addition & 0 deletions docs/content/features/github-sync.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: GitHub sync
icon: custom/GitHub
description: Clone repos from GitHub, auto-sync changes with your team, and resolve conflicts.
---
OpenKnowledge can connect a project to a GitHub remote repository and keep it synced over time. When GitHub sync is enabled, OpenKnowledge actively pulls commits from the remote and pushes commits back.
Expand Down
1 change: 1 addition & 0 deletions docs/content/features/ignore-patterns.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Ignore patterns
icon: LuEyeOff
description: Hide files and folders from the editor, search, and your AI agents.
---

Expand Down
1 change: 1 addition & 0 deletions docs/content/features/share.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Share links
icon: LuShare2
description: Copy a link to any doc or folder and send it to a teammate. OpenKnowledge handles the GitHub round-trip, the deep link, and the branch on the other end.
---

Expand Down
1 change: 1 addition & 0 deletions docs/content/features/timeline-and-recovery.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Timeline and recovery
icon: LuHistory
description: Review the edit history for the open document, including agent, human, upstream sync, and file system changes, with inline diffs and version restore.
---

Expand Down
1 change: 1 addition & 0 deletions docs/content/get-started/obsidian.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Using with Obsidian
icon: custom/Obsidian
description: How to open an existing Obsidian vault in OpenKnowledge, which markdown syntax carries over, and where the two differ.
---

Expand Down
1 change: 1 addition & 0 deletions docs/content/get-started/overview.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Overview
icon: LuBookOpen
description: Beautiful, AI-native markdown editor.
footer: false
---
Expand Down
1 change: 1 addition & 0 deletions docs/content/get-started/quickstart.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Quickstart
icon: LuZap
description: Set up your agent-maintained knowledge base in less than five minutes.
---
<Tabs groupId="ok-install" persist className="ok-flush-tabs" items={['macOS app', 'Web app (Linux, Windows, Intel Mac)']}>
Expand Down
1 change: 1 addition & 0 deletions docs/content/integrations/claude-code.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
title: Claude
description: Use OpenKnowledge with Claude Code, in the CLI or the Claude Desktop app.
icon: custom/Claude
---

OpenKnowledge works with Claude Code through MCP plus an installed skill that teaches the agent how to use the tools. Both surfaces are supported:
Expand Down
1 change: 1 addition & 0 deletions docs/content/integrations/codex.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
title: Codex
description: Use OpenKnowledge with OpenAI Codex.
icon: custom/Codex
---

OpenKnowledge plugs into Codex through MCP.
Expand Down
1 change: 1 addition & 0 deletions docs/content/integrations/cursor.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
title: Cursor
description: Use OpenKnowledge with Cursor.
icon: custom/Cursor
---

OpenKnowledge plugs into Cursor through MCP plus an installed skill that teaches the agent how to use the tools.
Expand Down
1 change: 1 addition & 0 deletions docs/content/integrations/opencode.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
title: OpenCode
description: Use OpenKnowledge with OpenCode — including fully local models via Ollama, LM Studio, or any OpenAI-compatible endpoint.
icon: custom/OpenCode
---

OpenKnowledge plugs into [OpenCode](https://opencode.ai) through MCP. OpenCode is a terminal-based coding agent that works with any model — cloud or fully local — so you can run an entirely local edit-your-knowledge-base loop.
Expand Down
1 change: 1 addition & 0 deletions docs/content/reference/cli.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: CLI & web app
icon: LuTerminal
description: Install the ok CLI and run the OpenKnowledge web app in your browser — on Linux or an Intel Mac.
---
On macOS, use the [desktop app](/docs/get-started/quickstart) for the smoothest experience. On **Linux** or an **Intel Mac**, install the `ok` CLI from npm and run the **same editor as a local web app** in your browser.
Expand Down
1 change: 1 addition & 0 deletions docs/content/reference/configuration.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Configuration
icon: LuSettings
description: The .ok/config.yml schema and environment variables.
---

Expand Down
1 change: 1 addition & 0 deletions docs/content/reference/core-concepts.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Core Concepts
icon: LuLightbulb
description: "How OpenKnowledge works: the three-layer model, the file system as the database, links and backlinks, the well-connected knowledge base, and attribution."
---

Expand Down
1 change: 1 addition & 0 deletions docs/content/reference/mcp.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: MCP
icon: custom/MCP
description: Tools the OpenKnowledge MCP server exposes to AI agents.
---

Expand Down
1 change: 1 addition & 0 deletions docs/content/workflows/entity-vault.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Entity vault (GBrain-compatible) workflow
icon: LuBoxes
description: A GBrain-compatible Markdown workflow for people, companies, meetings, and concepts. OpenKnowledge is the cockpit/editor/review layer; Garry Tan's gbrain can import or sync the same vault for indexing and automation.
---

Expand Down
1 change: 1 addition & 0 deletions docs/content/workflows/karpathy-llm-wiki.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Karpathy's LLM wiki workflow
icon: LuBrain
description: Build a source-grounded knowledge base where an LLM agent curates the wiki from the raw material you feed it. Every claim traces back to a preserved source. Maps directly to the Knowledge base starter pack.
---

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
title: Supporting the Open Knowledge Format
icon: LuFileCode
description: Scaffold a knowledge base that is conformant with Google's Open Knowledge Format (OKF) from the first commit — without enforcing anything.
---
Open Knowledge ships a starter pack named **`okf`** that scaffolds a knowledge base **conformant with Google's [Open Knowledge Format (OKF)](https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md) from the first commit** — without enforcing anything. You get a portable, OKF-ready bundle out of the box, and you stay free to author however you like.
Expand Down
7 changes: 4 additions & 3 deletions docs/src/app/(home)/footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ import { GitHubIcon } from '@/components/icons/github';
import { XIcon } from '@/components/icons/x';
import { InkeepLogo } from '@/components/inkeep-logo';
import { SubscribeForm } from '@/components/subscribe-form';
import { DISCORD_URL, GITHUB_URL, X_URL } from '@/lib/site';
import { DotTexture } from './dot-texture';

const socialLinks = [
{ href: 'https://github.com/inkeep/open-knowledge', label: 'GitHub', Icon: GitHubIcon },
{ href: 'https://discord.com/invite/YujKpFN49', label: 'Discord', Icon: DiscordIcon },
{ href: 'https://x.com/OpenKnowledgeAI', label: 'X', Icon: XIcon },
{ href: GITHUB_URL, label: 'GitHub', Icon: GitHubIcon },
{ href: DISCORD_URL, label: 'Discord', Icon: DiscordIcon },
{ href: X_URL, label: 'X', Icon: XIcon },
];

const legalLinks = [
Expand Down
4 changes: 2 additions & 2 deletions docs/src/app/(home)/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { SoftwareApplication, WithContext } from 'schema-dts';
import { JsonLd } from '@/components/seo/json-ld';
import { DOWNLOAD_URL, SITE_DESCRIPTION, SITE_NAME, SITE_URL } from '@/lib/site';
import { DOWNLOAD_URL, GITHUB_URL, SITE_DESCRIPTION, SITE_NAME, SITE_URL } from '@/lib/site';
import { SiteFooter } from './footer';
import { CallToAction } from './sections/call-to-action';
import { Collaboration } from './sections/collaboration';
Expand Down Expand Up @@ -30,7 +30,7 @@ const softwareAppLd = {
name: 'Inkeep',
url: 'https://inkeep.com',
},
sameAs: 'https://github.com/inkeep/open-knowledge',
sameAs: GITHUB_URL,
} satisfies WithContext<SoftwareApplication>;

export default function HomePage() {
Expand Down
8 changes: 4 additions & 4 deletions docs/src/app/(home)/site-nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { GitHubIcon } from '@/components/icons/github';
import { XIcon } from '@/components/icons/x';
import { OkWordmark } from '@/components/ok-wordmark';
import { Sheet, SheetClose, SheetContent, SheetTitle, SheetTrigger } from '@/components/ui/sheet';
import { DOWNLOAD_ROUTE } from '@/lib/site';
import { DISCORD_URL, DOWNLOAD_ROUTE, GITHUB_URL, X_URL } from '@/lib/site';
import { MarketingButton } from './marketing-button';

type NavLink = {
Expand All @@ -32,14 +32,14 @@ const docsLink: NavLink = {

const socialLinks: NavLink[] = [
{
href: 'https://x.com/OpenKnowledgeAI',
href: X_URL,
label: 'X (Twitter)',
external: true,
icon: XIcon,
iconOnly: true,
},
{
href: 'https://discord.com/invite/YujKpFN49',
href: DISCORD_URL,
label: 'Discord',
external: true,
icon: DiscordIcon,
Expand All @@ -48,7 +48,7 @@ const socialLinks: NavLink[] = [
];

const githubLink: NavLink = {
href: 'https://github.com/inkeep/open-knowledge',
href: GITHUB_URL,
label: 'GitHub',
external: true,
icon: GitHubIcon,
Expand Down
10 changes: 9 additions & 1 deletion docs/src/app/docs/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
import { getGitHubStars } from '@inkeep/open-knowledge-core';
import { DocsLayout } from 'fumadocs-ui/layouts/docs';
import { DocsSidebarCta } from '@/components/docs-sidebar-cta';
import { DocsSidebarSeparator } from '@/components/docs-sidebar-separator';
import { baseOptions } from '@/lib/layout.shared';
import { source } from '@/lib/source';

export default function Layout({ children }: LayoutProps<'/docs'>) {
export default async function Layout({ children }: LayoutProps<'/docs'>) {
const stars = await getGitHubStars({ next: { revalidate: 3600 } });
return (
<DocsLayout
tree={source.pageTree}
sidebar={{
banner: <DocsSidebarCta stars={stars} />,
components: { Separator: DocsSidebarSeparator },
}}
{...baseOptions({ wordmarkClassName: 'h-7 w-auto text-(--slide-text)' })}
>
{children}
Expand Down
16 changes: 16 additions & 0 deletions docs/src/app/global.css
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,22 @@
}
}

/* Map Fumadocs' neutral primary/ring onto brand azure so docs links, active
nav, the primary button, and focus rings read on-brand rather than the
preset near-black. Deliberately UNLAYERED: neutral.css defines its dark
values in a plain (unlayered) `.dark {}` rule, and unlayered rules always
win over `@layer` ones — so a `@layer base` override would lose in dark mode
(falls through to the preset's #fafafa). Light hex matches --slide-accent /
azure-blue; dark is the lighter --slide-accent for legibility on the dark bg. */
:root {
--color-fd-primary: #3784ff;
--color-fd-ring: #3784ff;
}
.dark {
--color-fd-primary: #69a3ff;
--color-fd-ring: #69a3ff;
}

.subtle-scrollbar {
@apply scrollbar-thin scrollbar-track-transparent scrollbar-thumb-fd-muted-foreground/30 dark:scrollbar-thumb-fd-muted-foreground/50;
}
Expand Down
4 changes: 3 additions & 1 deletion docs/src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ import { DM_Sans, Inter, JetBrains_Mono } from 'next/font/google';
import type { Organization, WebSite, WithContext } from 'schema-dts';
import { JsonLd } from '@/components/seo/json-ld';
import {
GITHUB_URL,
metaDescription,
SITE_DESCRIPTION,
SITE_HEADLINE,
SITE_NAME,
SITE_URL,
TWITTER_HANDLE,
X_URL,
} from '@/lib/site';
import './global.css';
import { Provider } from './provider';
Expand Down Expand Up @@ -40,7 +42,7 @@ const orgLd = {
description:
'Ship Agent-powered assistants and automations that boost customer experience and 10x your teams.',
foundingDate: '2023',
sameAs: ['https://x.com/OpenKnowledgeAI', 'https://github.com/inkeep/open-knowledge'],
sameAs: [X_URL, GITHUB_URL],
} satisfies WithContext<Organization>;

const siteLd = {
Expand Down
48 changes: 48 additions & 0 deletions docs/src/components/docs-sidebar-cta.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { buttonVariants } from 'fumadocs-ui/components/ui/button';
import { Download } from 'lucide-react';
import { GitHubIcon } from '@/components/icons/github';
import { DOWNLOAD_ROUTE, GITHUB_URL } from '@/lib/site';
import { cn } from '@/lib/utils';

const compactStars = new Intl.NumberFormat('en-US', {
notation: 'compact',
maximumFractionDigits: 1,
});
const fullStars = new Intl.NumberFormat('en-US');

export function DocsSidebarCta({ stars }: { stars: number | null }) {
return (
<div className="flex gap-2">
{/* Raw <a>, not next/link: DOWNLOAD_ROUTE is a 302 redirect handler, so
next/link would prefetch it (firing the redirect, inflating download
counts) and double-fetch on click. Mirrors DownloadButton. */}
<a
href={DOWNLOAD_ROUTE}
target="_blank"
rel="noopener noreferrer"
aria-label="Download for macOS"
title="Download for macOS"
className={cn(buttonVariants({ color: 'primary', size: 'sm' }), 'flex-1 gap-2')}
>
<Download className="size-4" aria-hidden="true" />
Download
</a>
<a
href={GITHUB_URL}
target="_blank"
rel="noopener noreferrer"
aria-label="Star on GitHub"
title={stars != null ? `${fullStars.format(stars)} GitHub stars` : 'Star on GitHub'}
className={cn(buttonVariants({ color: 'secondary', size: 'sm' }), 'flex-1 gap-2')}
>
<GitHubIcon className="size-4" />
Star
{stars != null ? (
<span className="tabular-nums text-fd-muted-foreground">
{compactStars.format(stars)}
</span>
) : null}
</a>
</div>
);
}
12 changes: 12 additions & 0 deletions docs/src/components/docs-sidebar-separator.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
'use client';

import type * as PageTree from 'fumadocs-core/page-tree';

export function DocsSidebarSeparator({ item }: { item: PageTree.Separator }) {
return (
<p className="mb-1.5 mt-6 flex items-center gap-1.5 px-2 text-1sm font-medium uppercase tracking-wider font-mono text-fd-muted-foreground first:mt-0">
{item.icon}
{item.name}
</p>
);
}
20 changes: 20 additions & 0 deletions docs/src/components/icons/brand.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import type { ComponentType, SVGProps } from 'react';
import { ClaudeIcon } from './claude';
import { CodexIcon } from './codex';
import { CursorIcon } from './cursor';
import { GitHubIcon } from './github';
import { McpIcon } from './mcp';
import { ObsidianIcon } from './obsidian';
import { OpenCodeIcon } from './opencode';

export const brandIcons = {
Claude: ClaudeIcon,
Cursor: CursorIcon,
Codex: CodexIcon,
OpenCode: OpenCodeIcon,
GitHub: GitHubIcon,
Obsidian: ObsidianIcon,
MCP: McpIcon,
} as const satisfies Record<string, ComponentType<SVGProps<SVGSVGElement>>>;

export type BrandIconName = keyof typeof brandIcons;
Loading