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
9 changes: 9 additions & 0 deletions .changeset/rename-openknowledge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@inkeep/open-knowledge": patch
---

Rename the product brand from "Open Knowledge" to "OpenKnowledge" (one word) across the desktop app, CLI output, MCP/skill copy, and docs.

The macOS app, its helper bundle, the DMG artifact, and the userData directory are renamed. A one-time, identity-verified migration runs on the first launch of a renamed build: it relocates an existing user's app state (recent projects, window restore, auto-update cache) from `~/Library/Application Support/Open Knowledge/` to `.../OpenKnowledge/`, but only after verifying the legacy directory is ours (its `state.json` parses as our schema), so another vendor's identically-named directory is never touched. It copies, verifies, then removes the legacy directory; any failure degrades to a clean first run.

Technical identifiers are unchanged: the npm package `@inkeep/open-knowledge`, the macOS appId `com.inkeep.open-knowledge`, the `openknowledge://` deep-link scheme, the `openknowledge.ai` domain, and the `open-knowledge` MCP server name. "Open Knowledge Format" (Google's external standard) is also preserved.
8 changes: 4 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# Open Knowledge Agent Guide
# OpenKnowledge Agent Guide

This is the public mirror of Open Knowledge. Keep changes compatible with the internal source path `public/open-knowledge/` in `inkeep/agents-private`.
This is the public mirror of OpenKnowledge. Keep changes compatible with the internal source path `public/open-knowledge/` in `inkeep/agents-private`.

## Start Here

- Read [README.md](./README.md) for the project overview.
- Read [CONTRIBUTING.md](./CONTRIBUTING.md) before changing public PR flow, dependencies, or exported docs.
- Use Bun 1.3.13 or newer and Node.js 24 or newer.

For maintainers working inside `inkeep/agents-private`, start Open Knowledge agent sessions from `public/open-knowledge/` when possible. If launched at the monorepo root, first read `public/open-knowledge/AGENTS.md`, then run Bun/build/test commands with cwd set to `public/open-knowledge`.
For maintainers working inside `inkeep/agents-private`, start OpenKnowledge agent sessions from `public/open-knowledge/` when possible. If launched at the monorepo root, first read `public/open-knowledge/AGENTS.md`, then run Bun/build/test commands with cwd set to `public/open-knowledge`.

## Commands

Expand Down Expand Up @@ -59,7 +59,7 @@ bun run dev
Every behavior-changing PR ships a `.changeset/<kebab-name>.md` file. The body becomes the user-facing entry on the next beta's GitHub Release and on the aggregated stable Release notes — that's how npm consumers and DMG auto-update users learn what changed. Write release-note copy, not a commit-message reprise.

- Create one with `bun run changeset`, or hand-write a file named `.changeset/<descriptive-kebab-slug>.md`.
- Front-matter: at minimum `'@inkeep/open-knowledge': patch`. Open Knowledge follows semver with a **pre-1.0 shift-down**: while we're below `1.0.0`, what semver would call a major (breaking API change) is encoded as `minor`, and what semver would call a minor (new feature) is encoded as `patch`. Most changesets are `patch`. `minor` is rare — reserve it for large API contract changes or large feature additions. **Never declare `major` pre-1.0** (see the `"//"` line in `.changeset/config.json`).
- Front-matter: at minimum `'@inkeep/open-knowledge': patch`. OpenKnowledge follows semver with a **pre-1.0 shift-down**: while we're below `1.0.0`, what semver would call a major (breaking API change) is encoded as `minor`, and what semver would call a minor (new feature) is encoded as `patch`. Most changesets are `patch`. `minor` is rare — reserve it for large API contract changes or large feature additions. **Never declare `major` pre-1.0** (see the `"//"` line in `.changeset/config.json`).
- Body should lead with the user-visible verb, name the affected command or surface in a code-span, and (if relevant) show before/after. Skip internal references like spec IDs or story numbers — those rot and aren't visible to readers of the public release notes.
- Don't write inline references to sibling-package versions (e.g. `@inkeep/open-knowledge-core@0.5.0-beta.6`) — the fixed-group lock-step bumps are computed at release time and any number you'd write would be wrong.
- Skip changesets for docs-only edits, test-only edits, or CI-only edits that don't change runtime behavior.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Docs for general usage: <https://openknowledge.ai/docs>.

## Install

**macOS:** download the desktop app — open the DMG, drag **Open Knowledge** to **Applications**, and launch it. [Latest release](https://github.com/inkeep/open-knowledge/releases/latest).
**macOS:** download the desktop app — open the DMG, drag **OpenKnowledge** to **Applications**, and launch it. [Latest release](https://github.com/inkeep/open-knowledge/releases/latest).

**Linux, Windows, Intel Mac:** run the same editor as a local web app via the CLI ([Node.js 24+](https://nodejs.org) required):

Expand Down
8 changes: 4 additions & 4 deletions docs/content/features/editor.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,11 @@ On very large trees the disk walk is capped per level, and the sidebar shows a n

| Scope | Triggered from | Prompt template |
| --- | --- | --- |
| Project | Empty-space menu (no doc / folder active) | `Let's work on this project using Open Knowledge. Open the OK editor in web view.` |
| Folder | Folder row menu (folder view active) | ``Let's work on the `<folder>` folder using Open Knowledge. Open the OK editor in web view.`` |
| File | File row menu (doc active) | ``Let's work on `<path>` using Open Knowledge. Open the OK editor in web view.`` |
| Project | Empty-space menu (no doc / folder active) | `Let's work on this project using OpenKnowledge. Open the OK editor in web view.` |
| Folder | Folder row menu (folder view active) | ``Let's work on the `<folder>` folder using OpenKnowledge. Open the OK editor in web view.`` |
| File | File row menu (doc active) | ``Let's work on `<path>` using OpenKnowledge. Open the OK editor in web view.`` |

The trailing `Open the OK editor in web view.` directive is dropped when the [`appearance.preview.autoOpen`](/docs/reference/configuration) preference is off, so the receiving agent honors the same "leave my preview alone" choice on its first turn; only the `Let's work on … using Open Knowledge.` opener is sent.
The trailing `Open the OK editor in web view.` directive is dropped when the [`appearance.preview.autoOpen`](/docs/reference/configuration) preference is off, so the receiving agent honors the same "leave my preview alone" choice on its first turn; only the `Let's work on … using OpenKnowledge.` opener is sent.

To send your own freetext instruction along with the handoff, use the bottom [Ask AI](#ask-ai) composer (or the empty-state create composer on a fresh project) rather than these one-click submenus.

Expand Down
2 changes: 1 addition & 1 deletion docs/content/get-started/quickstart.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ description: Set up your agent-maintained knowledge base in less than five minut

Download the latest version of the OpenKnowledge desktop app for macOS.

<DownloadButton href="https://github.com/inkeep/open-knowledge/releases/latest/download/Open-Knowledge-arm64.dmg" label="Download for macOS" />
<DownloadButton label="Download for macOS" />

</Step>

Expand Down
2 changes: 1 addition & 1 deletion docs/src/app/(home)/sections/hero-preview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ function ToolCallCard({
}

/* ---------------------------------------------------------------------------
* Editor panel (right) — Open Knowledge editor
* Editor panel (right) — OpenKnowledge editor
* --------------------------------------------------------------------------- */

function EditorPanel({
Expand Down
2 changes: 1 addition & 1 deletion docs/src/app/d/[encoded]/splash-share-view.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ function SplashChrome() {
<div className="container mx-auto flex pt-8 md:pt-10">
<Link href="/" aria-label="OpenKnowledge home" className="inline-flex items-center">
{/* Link already names the control; hide the wordmark's own label to
avoid a doubled "Open Knowledge" announcement. */}
avoid a doubled "OpenKnowledge" announcement. */}
<OkWordmark aria-hidden="true" className="h-8 w-auto text-slide-text" />
</Link>
</div>
Expand Down
4 changes: 2 additions & 2 deletions docs/src/app/download/beta/route.test.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { describe, expect, mock, test } from 'bun:test';
import {
type BetaRedirect,
DMG_ASSET_NAME,
FALLBACK_CACHE_CONTROL,
RELEASES_PAGE_URL,
SUCCESS_CACHE_CONTROL,
} from '../../../lib/download-links.ts';

const TEST_DMG_URL =
'https://github.com/inkeep/open-knowledge/releases/download/v0.1.0-beta.1/Open-Knowledge-arm64.dmg';
const TEST_DMG_URL = `https://github.com/inkeep/open-knowledge/releases/download/v0.1.0-beta.1/${DMG_ASSET_NAME}`;

let _redirect: BetaRedirect = { kind: 'fresh', url: TEST_DMG_URL };

Expand Down
8 changes: 6 additions & 2 deletions docs/src/components/download-button.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import { DownloadIcon } from 'lucide-react';
import Link from 'next/link';
import { STABLE_DMG_URL } from '@/lib/download-links';

type DownloadButtonProps = {
href: string;
href?: string;
label?: string;
};

export function DownloadButton({ href, label = 'Download for macOS' }: DownloadButtonProps) {
export function DownloadButton({
href = STABLE_DMG_URL,
label = 'Download for macOS',
}: DownloadButtonProps) {
return (
<Link
href={href}
Expand Down
5 changes: 2 additions & 3 deletions docs/src/lib/share-splash.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { describe, expect, test } from 'bun:test';
import { encodeShareUrl } from '@inkeep/open-knowledge-core';
import { STABLE_DMG_URL } from './download-links.ts';
import {
buildCloneCommand,
buildCustomSchemeUrl,
Expand Down Expand Up @@ -344,9 +345,7 @@ describe('buildCustomSchemeUrl', () => {

describe('SPLASH_DOWNLOAD_URL', () => {
test('points at the open-knowledge releases latest DMG asset', () => {
expect(SPLASH_DOWNLOAD_URL).toBe(
'https://github.com/inkeep/open-knowledge/releases/latest/download/Open-Knowledge-arm64.dmg',
);
expect(SPLASH_DOWNLOAD_URL).toBe(STABLE_DMG_URL);
});
});

Expand Down
5 changes: 3 additions & 2 deletions docs/src/lib/site.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { STABLE_DMG_URL } from './download-links';

export const SITE_URL = 'https://openknowledge.ai';
export const SITE_NAME = 'OpenKnowledge';
export const TWITTER_HANDLE = '@OpenKnowledgeAI';
Expand All @@ -21,8 +23,7 @@ export function metaDescription(
return `${cut.trimEnd()}…`;
}

export const DOWNLOAD_URL =
'https://github.com/inkeep/open-knowledge/releases/latest/download/Open-Knowledge-arm64.dmg';
export const DOWNLOAD_URL = STABLE_DMG_URL;

export const EXAMPLE_KB_SHARE_URL =
'https://openknowledge.ai/d/AWh0dHBzOi8vZ2l0aHViLmNvbS9pbmtlZXAvdGVjaC1pcG9zL2Jsb2IvbWFpbi9SRUFETUUubWQ';
2 changes: 1 addition & 1 deletion packages/app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<title>Open Knowledge</title>
<title>OpenKnowledge</title>
<!--
Editor-mode FOUC prevention. Reads the persisted mode synchronously
before React mounts so the first painted frame shows the user's
Expand Down
2 changes: 1 addition & 1 deletion packages/app/scripts/audit-strings/check-casing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ const PROPER_NOUNS = new Set([
]);

const BRAND_PHRASES: string[] = [
'Open Knowledge',
'OpenKnowledge',
'Claude Code',
'Claude Desktop',
'Claude Skill',
Expand Down
2 changes: 1 addition & 1 deletion packages/app/scripts/audit-strings/viewer-template.html
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@
</head>
<body>
<header>
<h1>Open Knowledge — static strings audit</h1>
<h1>OpenKnowledge — static strings audit</h1>
<div class="meta" id="meta">loading…</div>
<div class="stats" id="stats"></div>
</header>
Expand Down
5 changes: 2 additions & 3 deletions packages/app/src/components/AutoSyncEnableWarning.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,8 @@ export function AutoSyncEnableWarning() {
</p>
<p className="text-muted-foreground">
<Trans>
Open Knowledge will create commits and push them to your remote automatically. If
you do not want automatic commits in your git history, you should not enable
auto-sync.
OpenKnowledge will create commits and push them to your remote automatically. If you
do not want automatic commits in your git history, you should not enable auto-sync.
</Trans>
</p>
</div>
Expand Down
6 changes: 3 additions & 3 deletions packages/app/src/components/ClaudeReadinessBanner.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export function ClaudeReadinessBanner({
const isClaudeMissing = kind === 'claude-missing';
const message = isClaudeMissing
? t`Claude Code (claude) isn't installed or on your PATH.`
: t`Claude Code is installed, but Open Knowledge tools aren't connected to it yet.`;
: t`Claude Code is installed, but OpenKnowledge tools aren't connected to it yet.`;
const actionLabel = isClaudeMissing ? t`Get Claude Code` : t`Connect tools`;

function handleAction() {
Expand All @@ -46,14 +46,14 @@ export function ClaudeReadinessBanner({
.rewireClaudeMcp()
.then((result) => {
if (result.rewireError != null) {
toast.error(t`Couldn't connect Open Knowledge tools to Claude Code. Please try again.`);
toast.error(t`Couldn't connect OpenKnowledge tools to Claude Code. Please try again.`);
return;
}
onDismiss();
})
.catch((err) => {
console.warn('[terminal] rewireClaudeMcp failed:', err);
toast.error(t`Couldn't connect Open Knowledge tools to Claude Code. Please try again.`);
toast.error(t`Couldn't connect OpenKnowledge tools to Claude Code. Please try again.`);
});
}

Expand Down
14 changes: 7 additions & 7 deletions packages/app/src/components/ConsentDialogBody.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@ const PROBE_THROTTLE_MS = 750;

const WARNING_COPY: Record<OkOnboardingWarningKind, MessageDescriptor> = {
root: msg`You picked the filesystem root (/). Scaffolding here will scan every file on this machine — make sure that's what you want.`,
home: msg`You picked your home directory. Open Knowledge will index everything in your home tree — large and may surface personal files.`,
'home-documents': msg`You picked ~/Documents. Open Knowledge will index every markdown file under it. If you only want to manage a sub-folder, choose a smaller scope.`,
'home-desktop': msg`You picked ~/Desktop. Open Knowledge will index everything on your desktop.`,
home: msg`You picked your home directory. OpenKnowledge will index everything in your home tree — large and may surface personal files.`,
'home-documents': msg`You picked ~/Documents. OpenKnowledge will index every markdown file under it. If you only want to manage a sub-folder, choose a smaller scope.`,
'home-desktop': msg`You picked ~/Desktop. OpenKnowledge will index everything on your desktop.`,
'home-downloads': msg`You picked ~/Downloads. Files there are usually transient — consider a stable folder instead.`,
'volumes-mount': msg`This path is on an external volume (/Volumes/...). Open Knowledge will lose track of files when the drive ejects.`,
'volumes-mount': msg`This path is on an external volume (/Volumes/...). OpenKnowledge will lose track of files when the drive ejects.`,
'drive-root': msg`This looks like a drive root (e.g., C:\\). Scaffolding here will scan an entire drive.`,
};

Expand Down Expand Up @@ -197,11 +197,11 @@ function ConsentDialogForm({ payload, store, toast }: ConsentDialogFormProps) {
>
<DialogHeader>
<DialogTitle>
<Trans>Setup Open Knowledge in this folder?</Trans>
<Trans>Setup OpenKnowledge in this folder?</Trans>
</DialogTitle>
<DialogDescription>
<Trans>
Open Knowledge stores its configuration and internal files inside a newly created{' '}
OpenKnowledge stores its configuration and internal files inside a newly created{' '}
<code>.ok</code> directory in your project root folder.
</Trans>
</DialogDescription>
Expand All @@ -211,7 +211,7 @@ function ConsentDialogForm({ payload, store, toast }: ConsentDialogFormProps) {
{payload.gitRootPromoted ? (
<p className="text-1sm text-muted-foreground">
<Trans>
Open Knowledge initializes at <code>{projectDir}</code> — the parent of{' '}
OpenKnowledge initializes at <code>{projectDir}</code> — the parent of{' '}
<code>{pickedRelative}</code> because it contains a <code>.git</code> folder (one
.ok/ per git repo). <code>Content directory</code> defaults to <code>.</code> (the
whole repo); type a sub-folder to narrow it.
Expand Down
8 changes: 4 additions & 4 deletions packages/app/src/components/CreateProjectDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,7 @@ export function CreateProjectDialog({ open, onOpenChange, bridge }: CreateProjec
<Trans>Create new project</Trans>
</DialogTitle>
<DialogDescription>
<Trans>Create a new Open Knowledge project in the folder of your choice.</Trans>
<Trans>Create a new OpenKnowledge project in the folder of your choice.</Trans>
</DialogDescription>
</DialogHeader>

Expand Down Expand Up @@ -577,7 +577,7 @@ export function CreateProjectDialog({ open, onOpenChange, bridge }: CreateProjec
<Trans>Connect to AI tools</Trans>
</legend>
<p className="text-1sm text-muted-foreground">
<Trans>Each selected tool gets an Open Knowledge MCP entry.</Trans>
<Trans>Each selected tool gets an OpenKnowledge MCP entry.</Trans>
</p>
{ALL_EDITOR_IDS.map((id) => {
const inputId = `create-editor-${id}`;
Expand Down Expand Up @@ -669,7 +669,7 @@ function CascadeBanner({
>
<p className="mb-2">
<Trans>
Can't nest projects. An Open Knowledge project already exists at{' '}
Can't nest projects. An OpenKnowledge project already exists at{' '}
<code className="font-mono break-all">{rootPath}</code>. Choose a location outside it,
or open that project instead.
</Trans>
Expand Down Expand Up @@ -699,7 +699,7 @@ function CascadeBanner({
>
<p>
<Trans>
Open Knowledge will be initialized at <code>{gitRoot}</code> — the parent of your new
OpenKnowledge will be initialized at <code>{gitRoot}</code> — the parent of your new
folder, because it contains a <code>.git</code> folder (one project per git repo).
</Trans>
</p>
Expand Down
2 changes: 1 addition & 1 deletion packages/app/src/components/DocumentErrorBoundary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ export function errorCopy(error: unknown): ErrorCopy {
if (error instanceof ServerCapabilityMismatchError) {
return {
title: t`Server can't open documents`,
summary: t`This project's running server doesn't support live editing. Restart Open Knowledge to fix.`,
summary: t`This project's running server doesn't support live editing. Restart OpenKnowledge to fix.`,
};
}
if (error instanceof MountAbortError) {
Expand Down
2 changes: 1 addition & 1 deletion packages/app/src/components/HelpPopover.dom.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ describe('HelpPopover runtime behavior', () => {
hasIcon: true,
},
{
label: 'Open Knowledge',
label: 'OpenKnowledge',
href: 'https://openknowledge.ai/',
target: '_blank',
rel: 'noopener noreferrer',
Expand Down
2 changes: 1 addition & 1 deletion packages/app/src/components/HelpPopover.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const links: Array<{
{ label: 'Discord', href: 'https://discord.com/invite/YujKpFN49', icon: DiscordIcon },
{ label: 'X', href: 'https://x.com/OpenKnowledgeAI', icon: XTwitterIcon },
{
label: 'Open Knowledge',
label: 'OpenKnowledge',
href: 'https://openknowledge.ai/',
icon: OkIcon,
iconClassName: 'scale-125 grayscale transition-[filter] group-hover:grayscale-0',
Expand Down
6 changes: 3 additions & 3 deletions packages/app/src/components/InstallInClaudeDesktopDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -187,18 +187,18 @@ export function InstallInClaudeDesktopDialog({
<DialogTitle className="flex items-center gap-2">
<Download aria-hidden="true" className="h-4 w-4" />
{reinstall ? (
<Trans comment="Dialog title — installing the Open Knowledge skill into the Claude Desktop App">
<Trans comment="Dialog title — installing the OpenKnowledge skill into the Claude Desktop App">
Reinstall for Claude Chat & Cowork
</Trans>
) : (
<Trans comment="Dialog title — installing the Open Knowledge skill into the Claude Desktop App">
<Trans comment="Dialog title — installing the OpenKnowledge skill into the Claude Desktop App">
Install for Claude Chat & Cowork
</Trans>
)}
</DialogTitle>
<DialogDescription>
<Trans>
Adds the Open Knowledge skill to the{' '}
Adds the OpenKnowledge skill to the{' '}
<strong className="font-medium text-foreground">Claude Desktop App</strong> so it's
available in Chat and Cowork sessions.
</Trans>
Expand Down
Loading