Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
42a5228
Let a message reach a running Claude turn (steer), and keep one proce…
aivsomkar Aug 18, 2026
11f7f4c
feat: let people turn usage analytics off
koeseo Aug 18, 2026
8fec1c4
chore: measure the palette against WCAG AA
koeseo Aug 18, 2026
22761aa
Fold the chat header chips to icon bubbles when the column is narrow
aivsomkar Aug 19, 2026
0bce8d7
merge: upstream main — the settings import block, both sides kept
koeseo Aug 19, 2026
7558ad7
fix: address review — comment stripping, floors for known pairs, count
koeseo Aug 19, 2026
cdd1833
fix: address review — hold the choice in memory, make the guard test …
koeseo Aug 19, 2026
5b3077f
Let Kimi run a local model without a Kimi login.
Aug 18, 2026
fc111ef
Patch existing Kimi aliases with protocol and context size.
Aug 18, 2026
e20c1ff
Parse Kimi config.toml with a string-aware scanner.
Aug 18, 2026
ee79549
Let Droid run a local model without a Factory login.
Aug 18, 2026
fadce23
Drop the unused tomlTableHasKey helper so typecheck passes.
Aug 18, 2026
8497c31
Don't crash the UI when older tasks have no costUsd.
Aug 18, 2026
974a348
Read Unsloth Studio's minted API token from the servers map.
Aug 18, 2026
4d194ec
Honor remaining review notes for Droid, Unsloth, usage, and Kimi TOML.
Aug 19, 2026
37aa31b
Harden the Kimi TOML scanner around comments and array tables.
Aug 20, 2026
848fea8
Allow Auto mode on this Mac's computer after a warning.
Aug 20, 2026
1a2cd0c
Decode TOML basic-string unicode escapes in Kimi headings.
Aug 20, 2026
61a8b48
Decode TOML basic-string unicode escapes in Kimi headings.
Aug 20, 2026
4a1cb62
Address CodeRabbit notes on the Mac local-computer Auto commit.
Aug 20, 2026
4f59e7c
Tighten CodeRabbit follow-ups: invalid TOML escapes, empty CUA arches…
Aug 20, 2026
69b7f67
feat: import a team as a project — one room, on a folder
koeseo Aug 20, 2026
a143c47
fix(build): extract Android Platform Tools on Windows (git-bash)
Ansygroup Aug 20, 2026
795ee65
docs(plan): plan fix for #211 zombie permission cards on turn teardown
Aug 18, 2026
cdd9004
fix(claude): kill the child process tree on every turn teardown
Aug 18, 2026
a5bcbcc
fix(claude): drop permission asks that arrive after broker close
Aug 18, 2026
98ccf9a
refactor(claude): extract systemEndedReply, shared by close() and the…
Aug 18, 2026
e687cad
test(claude): cover the question-kind branch of the late-ask reply
Aug 18, 2026
137bba6
fix(claude): integrate teardown with current main
lightcloud00 Aug 20, 2026
2b3aba8
feat: add pi coding agent as a native RPC engine
Aug 21, 2026
f3047e3
fix: harden pi engine process handling
Aug 21, 2026
3bfa27b
fix: replay history when a pi turn has no resume cursor
Aug 21, 2026
8af4b64
Give the Local VM panel a way to actually drive it (#321)
milind-soni Aug 21, 2026
a50a26d
Merge pull request #319 from lightcloud00/fix/claude-turn-teardown-cu…
milind-soni Aug 21, 2026
e53ff8d
Scrub provider and workspace credentials from the pi child env
milind-soni Aug 21, 2026
103d6b0
Name System32 bsdtar absolutely instead of juggling extractors
milind-soni Aug 21, 2026
25f43a9
Merge main into feat/team-import-project
milind-soni Aug 21, 2026
d76959e
feat(computer): open live desktop in app modal
milind-soni Aug 21, 2026
99cfc9f
Merge pull request #320 from cjpraia/feat/pi-native-engine
milind-soni Aug 21, 2026
95296b1
Merge pull request #317 from Ansygroup/fix/win-android-tools-extract
milind-soni Aug 21, 2026
ca4b9e7
Merge pull request #316 from koeseo/feat/team-import-project
milind-soni Aug 21, 2026
f06c414
Clear PostHog's persisted opt-out before the session's first capture
milind-soni Aug 21, 2026
dc56a62
Merge pull request #250 from koeseo/feat/analytics-opt-out
milind-soni Aug 21, 2026
30343a9
Merge pull request #322 from milind-soni/codex/in-app-vnc-control
milind-soni Aug 21, 2026
5b8511b
feat(local-vm): support isolated per-bot desktops
lightcloud00 Aug 21, 2026
02586f8
fix(local-vm): harden Windows Podman runtime checks
lightcloud00 Aug 21, 2026
54564f7
fix(codex): settle web search activity
08820048 Aug 21, 2026
89aa022
Merge branch 'main' into feat/compact-chat-header
milind-soni Aug 21, 2026
af42bae
Merge pull request #314 from maxkongerskov/feat/kimi-droid-local-no-l…
milind-soni Aug 21, 2026
49833b6
feat(profile): add paired-safe agent profiles and avatars
willsigmon Aug 21, 2026
f3201f6
Merge pull request #333 from 08820048/codex/fix-codex-web-search-status
milind-soni Aug 21, 2026
a4eee84
feat(profile): add persistent desktop profiles and avatar roster
willsigmon Aug 21, 2026
a170cd0
feat(routines): clarify scheduled tasks and exact notifications
willsigmon Aug 21, 2026
77a37a9
Merge pull request #248 from milind-soni/feat/compact-chat-header
milind-soni Aug 21, 2026
aee6065
Merge remote-tracking branch 'origin/main' into review/pr-315
milind-soni Aug 21, 2026
c1ec0a5
Merge pull request #332 from lightcloud00/feature/per-bot-local-vm
milind-soni Aug 21, 2026
341e7b1
fix(ios): follow active tasks and approval choices (#334)
milind-soni Aug 21, 2026
e6c8529
fix(codex): preserve full shell commands (#335)
milind-soni Aug 21, 2026
6601c5d
Merge remote-tracking branch 'origin/main' into review/pr-315
milind-soni Aug 21, 2026
0564fb6
Make the local-auto warning a server-side boundary, and scope Codex h…
milind-soni Aug 21, 2026
7e6ed78
Merge remote-tracking branch 'origin/main' into review/pr-315
milind-soni Aug 21, 2026
983b821
Merge pull request #315 from maxkongerskov/feat/mac-local-computer-auto
milind-soni Aug 21, 2026
9aa28bd
feat(composio): manage multiple connected accounts
willsigmon Aug 21, 2026
9ce214a
Merge pull request #249 from koeseo/chore/contrast-check
milind-soni Aug 21, 2026
9224343
Land review fixes for multi-account: churn guard, budgets, fallbacks
milind-soni Aug 21, 2026
084f594
Merge pull request #330 from willsigmon/codex/composio-multi-account
milind-soni Aug 21, 2026
3426fac
Merge main and harden Claude session steering
milind-soni Aug 21, 2026
f6cd588
Merge pull request #219 from milind-soni/feat/harness-3.2-steering
milind-soni Aug 21, 2026
e6a4630
Merge main into profiles; review fixes: paired test, existence check,…
milind-soni Aug 21, 2026
4f9fe8c
Merge profiles base; StrictMode-proof the patch queue; thread the con…
milind-soni Aug 21, 2026
840665e
Align the tts no-key test with the reworded Settings guidance
milind-soni Aug 21, 2026
db1d5ac
Merge branch 'review/pr-327' into review/pr-328
milind-soni Aug 21, 2026
e13ccd0
Merge pull request #327 from willsigmon/codex/agent-profile-contract-ios
milind-soni Aug 21, 2026
340d1f2
Route room notifications to the room; pin the done-dedup with real pa…
milind-soni Aug 21, 2026
b1e5326
Merge pull request #328 from willsigmon/codex/agent-profile-desktop
milind-soni Aug 21, 2026
279af59
Merge pull request #329 from willsigmon/codex/tasks-routines-notifica…
milind-soni Aug 21, 2026
8c95d11
docs: launch OpenMausBot documentation site (#336)
milind-soni Aug 21, 2026
89d25dd
feat(rooms): add rename action (#343)
08820048 Aug 21, 2026
a3d3683
feat(local-vm): add secure two-up workspace
lightcloud00 Aug 22, 2026
10efdb9
test: keep Chief capsule checks fail-closed on Windows
lightcloud00 Aug 22, 2026
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 .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,4 @@ release
.dev.vars.*
cloudflare/composio-broker/worker-configuration.d.ts
.claude/worktrees/
.vercel/
17 changes: 17 additions & 0 deletions apps/docs/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/node_modules
/.source
/coverage
/.next
/.open-next
/out
/build
/public/app-icon.svg
/public/screenshots
*.tsbuildinfo
.DS_Store
*.pem
.env*.local
.vercel
next-env.d.ts
cloudflare-env.d.ts
.env*
4 changes: 4 additions & 0 deletions apps/docs/.oxlintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"$schema": "../../node_modules/oxlint/configuration_schema.json",
"ignorePatterns": [".next/**", ".open-next/**", ".source/**"]
}
9 changes: 9 additions & 0 deletions apps/docs/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<!-- BEGIN:nextjs-agent-rules -->

# This is NOT the Next.js you know

This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.

This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.

<!-- END:nextjs-agent-rules -->
1 change: 1 addition & 0 deletions apps/docs/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@AGENTS.md
36 changes: 36 additions & 0 deletions apps/docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# OpenMausBot documentation

The public documentation site is a Next.js 16 + Fumadocs app. User-facing content lives in `content/docs`; the repository's top-level `docs` folder remains available for implementation notes and detailed platform records.

## Develop

From the repository root:

```bash
pnpm install
pnpm docs:dev
```

The site opens at `http://localhost:3000`.

## Verify

```bash
pnpm docs:build
pnpm --filter @openmausbot/docs types:check
pnpm --filter @openmausbot/docs lint
```

## Deploy to Vercel

This is a fully static site. Deploying it does not deploy the Electron app, local harness, credentials, agents, or user data.

Create a second Vercel project beside the existing `openmausbot.com` project:

1. Import the `milind-soni/OpenMausBot` repository.
2. Set **Root Directory** to `apps/docs`.
3. Keep the detected **Next.js** framework settings.
4. Set the production branch to `main` and deploy.
5. Add `docs.openmausbot.com` under **Settings → Domains**.

Vercel will build the static `out` directory, publish every push to `main`, and create preview URLs for documentation pull requests. Keep `openmausbot.com` on the existing marketing project and add a Docs link there after the new domain is live.
8 changes: 8 additions & 0 deletions apps/docs/app/api/search/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { source } from '@/lib/source';
import { createFromSource } from 'fumadocs-core/search/server';

export const revalidate = false;

export const { staticGET: GET } = createFromSource(source, {
language: 'english',
});
56 changes: 56 additions & 0 deletions apps/docs/app/docs/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { getPageImageUrl, getPageMarkdownUrl, source } from '@/lib/source';
import {
DocsBody,
DocsDescription,
DocsPage,
DocsTitle,
MarkdownCopyButton,
ViewOptionsPopover,
} from 'fumadocs-ui/layouts/docs/page';
import { notFound } from 'next/navigation';
import { getMDXComponents } from '@/components/mdx';
import type { Metadata } from 'next';
import { createRelativeLink } from 'fumadocs-ui/mdx';
import { gitConfig } from '@/lib/shared';

export default async function Page(props: PageProps<'/docs/[[...slug]]'>) {
const params = await props.params;
const page = source.getPage(params.slug);
if (!page) notFound();

const MDX = page.data.body;
const markdownUrl = getPageMarkdownUrl(page).url;

return (
<DocsPage toc={page.data.toc} full={page.data.full}>
<DocsTitle>{page.data.title}</DocsTitle>
<DocsDescription className="mb-0">{page.data.description}</DocsDescription>
<div className="flex items-center gap-2 border-b pb-6">
<MarkdownCopyButton markdownUrl={markdownUrl} />
<ViewOptionsPopover
markdownUrl={markdownUrl}
githubUrl={`https://github.com/${gitConfig.user}/${gitConfig.repo}/blob/${gitConfig.branch}/apps/docs/content/docs/${page.path}`}
/>
</div>
<DocsBody>
<MDX components={getMDXComponents({ a: createRelativeLink(source, page) })} />
</DocsBody>
</DocsPage>
);
}

export async function generateStaticParams() {
return source.generateParams();
}

export async function generateMetadata(props: PageProps<'/docs/[[...slug]]'>): Promise<Metadata> {
const params = await props.params;
const page = source.getPage(params.slug);
if (!page) notFound();

return {
title: page.data.title,
description: page.data.description,
openGraph: { images: getPageImageUrl(page).url },
};
}
11 changes: 11 additions & 0 deletions apps/docs/app/docs/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { source } from '@/lib/source';
import { DocsLayout } from 'fumadocs-ui/layouts/docs';
import { baseOptions } from '@/lib/layout.shared';

export default function Layout({ children }: LayoutProps<'/docs'>) {
return (
<DocsLayout tree={source.getPageTree()} {...baseOptions()}>
{children}
</DocsLayout>
);
}
200 changes: 200 additions & 0 deletions apps/docs/app/global.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
@import 'tailwindcss';
@import 'fumadocs-ui/css/neutral.css';
@import 'fumadocs-ui/css/preset.css';

:root {
--omb-bg: #ffffff;
--omb-raised: #f7f8f8;
--omb-ink: #0a0a0b;
--omb-muted: #5f6570;
--omb-line: #e5e7ea;
--omb-accent: #009957;
--omb-accent-soft: #eaf8f1;

--color-fd-background: var(--omb-bg);
--color-fd-foreground: var(--omb-ink);
--color-fd-muted: var(--omb-raised);
--color-fd-muted-foreground: var(--omb-muted);
--color-fd-border: var(--omb-line);
--color-fd-primary: var(--omb-accent);
--color-fd-primary-foreground: #ffffff;
--color-fd-card: var(--omb-bg);
--color-fd-card-foreground: var(--omb-ink);
--color-fd-secondary: var(--omb-raised);
--color-fd-secondary-foreground: var(--omb-ink);
--color-fd-accent: var(--omb-accent-soft);
--color-fd-accent-foreground: #006b3d;
}

.dark {
--omb-bg: #070708;
--omb-raised: #131315;
--omb-ink: #f4f4f5;
--omb-muted: #9a9aa4;
--omb-line: #232327;
--omb-accent: #3fae6e;
--omb-accent-soft: #10271a;

--color-fd-primary-foreground: #07130c;
--color-fd-accent-foreground: #7bd69e;
}

html {
scrollbar-gutter: stable;
background: var(--omb-bg);
}

html > body[data-scroll-locked] {
margin-right: 0 !important;
--removed-body-scroll-bar-size: 0px !important;
}

body {
background:
radial-gradient(circle at 75% -20%, color-mix(in srgb, var(--omb-accent) 8%, transparent), transparent 32rem),
var(--omb-bg);
color: var(--omb-ink);
letter-spacing: -0.012em;
}

::selection {
background: color-mix(in srgb, var(--omb-accent) 24%, transparent);
}

.omb-brand {
display: flex;
align-items: center;
gap: 0.65rem;
font-size: 0.9rem;
font-weight: 660;
letter-spacing: -0.02em;
}

.omb-brand img {
width: 1.65rem;
height: 1.65rem;
border-radius: 0.5rem;
}

.omb-brand-docs {
border-left: 1px solid var(--omb-line);
color: var(--omb-muted);
font-size: 0.78rem;
font-weight: 520;
letter-spacing: 0;
margin-left: 0.1rem;
padding-left: 0.7rem;
}

.omb-product-shot {
margin: 2rem 0;
}

.omb-product-shot-frame {
overflow: hidden;
border: 1px solid color-mix(in srgb, var(--omb-line) 88%, transparent);
border-radius: 1.25rem;
background: #0a0a0b;
box-shadow:
0 1px 1px color-mix(in srgb, var(--omb-ink) 5%, transparent),
0 22px 60px color-mix(in srgb, var(--omb-ink) 10%, transparent);
}

.omb-product-shot img {
display: block;
width: 100%;
max-height: 38rem;
object-fit: cover;
}

.omb-product-shot figcaption {
color: var(--omb-muted);
font-size: 0.78rem;
line-height: 1.5;
margin-top: 0.65rem;
text-align: center;
}

.omb-kicker {
color: var(--omb-accent);
font-size: 0.72rem;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
}

.omb-lede {
color: var(--omb-muted);
font-size: 1.08rem;
line-height: 1.75;
max-width: 44rem;
}

.omb-stat-row {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.75rem;
margin: 1.75rem 0;
}

.omb-stat {
border: 1px solid var(--omb-line);
border-radius: 1rem;
background: color-mix(in srgb, var(--omb-raised) 78%, transparent);
padding: 1rem;
}

.omb-stat strong,
.omb-stat span {
display: block;
}

.omb-stat strong {
font-size: 1rem;
letter-spacing: -0.02em;
}

.omb-stat span {
color: var(--omb-muted);
font-size: 0.78rem;
margin-top: 0.2rem;
}

#nd-sidebar,
#nd-subnav {
background: color-mix(in srgb, var(--omb-bg) 92%, transparent);
backdrop-filter: blur(18px);
}

#nd-sidebar {
border-right-color: var(--omb-line);
}

#nd-subnav {
border-bottom-color: var(--omb-line);
}

.prose :where(h2, h3, h4) {
letter-spacing: -0.035em;
}

.prose :where(a:not([data-card])) {
text-decoration-color: color-mix(in srgb, var(--omb-accent) 45%, transparent);
text-underline-offset: 0.2em;
}

.prose :where(table) {
overflow: hidden;
border: 1px solid var(--omb-line);
border-radius: 0.9rem;
}

@media (max-width: 640px) {
.omb-stat-row {
grid-template-columns: 1fr;
}

.omb-product-shot-frame {
border-radius: 0.9rem;
}
}
34 changes: 34 additions & 0 deletions apps/docs/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import type { Metadata } from 'next';
import { Inter } from 'next/font/google';
import { Provider } from '@/components/provider';
import './global.css';

const inter = Inter({ subsets: ['latin'] });

export const metadata: Metadata = {
metadataBase: new URL('https://docs.openmausbot.com'),
title: {
default: 'OpenMausBot Docs',
template: '%s · OpenMausBot Docs',
},
description: 'Install, configure, and extend your local-first team of AI agents.',
openGraph: {
title: 'OpenMausBot Docs',
description: 'Your own team of AI agents, in a chat app.',
type: 'website',
},
icons: {
icon: '/app-icon.svg',
apple: '/app-icon.svg',
},
};

export default function Layout({ children }: LayoutProps<'/'>) {
return (
<html lang="en" className={inter.className} suppressHydrationWarning>
<body className="flex min-h-screen flex-col">
<Provider>{children}</Provider>
</body>
</html>
);
}
8 changes: 8 additions & 0 deletions apps/docs/app/llms-full.txt/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { getLLMText, source } from '@/lib/source';

export const revalidate = false;

export async function GET() {
const scanned = await Promise.all(source.getPages().map(getLLMText));
return new Response(scanned.join('\n\n'));
}
Loading
Loading