Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
ac9ab99
feat(windows): build native desktop and managed daemon
mrinaldi2 Oct 1, 2026
e74d9e0
fix(windows): use platform-neutral setup and folder labels
mrinaldi2 Oct 1, 2026
93e88f5
docs(windows): show verified native first-run setup
mrinaldi2 Oct 1, 2026
9076772
feat(runtime): choose Codex CLI or Claude Code per bot
mrinaldi2 Oct 1, 2026
f098695
fix(windows): stop native sessions and normalize trust paths
mrinaldi2 Oct 1, 2026
9704a69
fix(runtime): discover Windows Codex and surface startup failures
mrinaldi2 Oct 1, 2026
f085596
feat(runtime): embed the native Codex terminal
mrinaldi2 Oct 1, 2026
52ee60f
fix(mcp): expose bot runtime selection and verification
mrinaldi2 Oct 1, 2026
3bbfb78
fix(windows): install the daemon with the desktop installer
mrinaldi2 Oct 1, 2026
b464e02
fix(windows): clarify unavailable daemon ports
mrinaldi2 Oct 1, 2026
3bd59d9
fix(windows): tolerate stale daemon process IDs
mrinaldi2 Oct 1, 2026
bd633ad
fix(supervisor): start each bot's runtime only once at a time
mrinaldi2 Oct 1, 2026
205e4a4
docs: design peer bots across two daemons
mrinaldi2 Oct 1, 2026
b9da294
feat(peer): link bots across two daemons
mrinaldi2 Oct 1, 2026
c402609
docs: design the chat pane as the default bot surface
mrinaldi2 Oct 1, 2026
6ca3cea
feat(chat): serve bots' transcripts as chat turns
mrinaldi2 Oct 1, 2026
8538571
feat(desktop): open bots on a chat of their turns
mrinaldi2 Oct 1, 2026
8545803
feat(permissions): answer bots' permission prompts from the app
mrinaldi2 Oct 1, 2026
d61fac1
feat(tasks): add a Tasks tab to the bot's side panel
mrinaldi2 Oct 1, 2026
886af27
feat(codex): read Codex bots in the chat and answer their approvals
mrinaldi2 Oct 1, 2026
97fdd40
feat(peer): read a linked bot's real chat across the peer link
mrinaldi2 Oct 1, 2026
3d357da
feat(chat): answer decisions, attach files, run slash commands, search
mrinaldi2 Oct 1, 2026
f52d47d
fix(chat): find in the chat, read more on tasks, true image shapes
mrinaldi2 Oct 1, 2026
358afee
fix(tasks): show the whole task, not the list's preview
mrinaldi2 Oct 1, 2026
64e74eb
feat(desktop): dictate into the chat composer, on the device
mrinaldi2 Oct 1, 2026
1ed8f5a
fix(chat): show screenshots whole in a lightbox
mrinaldi2 Oct 1, 2026
fec6522
feat(desktop): dictate on Windows with the on-device SAPI recognizer
mrinaldi2 Oct 1, 2026
41e9ecf
chore(notices): record the desktop manifest changes from Windows dict…
mrinaldi2 Oct 1, 2026
715f6bd
test(desktop): add visual baselines for the chat pane stories
mrinaldi2 Oct 1, 2026
c40c7eb
fix(peer): free a revoked peer's name so the machines can pair again
mrinaldi2 Oct 1, 2026
8770441
feat(peer): link projects across peer daemons
mrinaldi2 Oct 1, 2026
f759438
docs: describe linked projects in the protocol and peer-bot docs
mrinaldi2 Oct 1, 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
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
* text=auto eol=lf
*.png binary
*.ico binary
*.icns binary
*.woff2 binary
67 changes: 67 additions & 0 deletions .github/workflows/windows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
name: Windows

on:
push:
branches: [main]
pull_request:
workflow_dispatch:

permissions:
contents: read

concurrency:
group: windows-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
runs-on: windows-2022
env:
CARGO_BUILD_JOBS: 2
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
with:
workspaces: |
. -> target
apps/desktop/src-tauri -> target
- uses: pnpm/action-setup@v4
with:
version: 11
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
cache-dependency-path: apps/desktop/pnpm-lock.yaml
- name: Install frontend dependencies
run: pnpm --dir apps/desktop install --frozen-lockfile
- name: Check daemon
run: |
cargo fmt --all --check
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
cargo clippy --locked --workspace --all-targets -- -D warnings
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
cargo test --locked --workspace --all-targets
- name: Check frontend
run: pnpm --dir apps/desktop check
- name: Stage daemon sidecar
run: ./scripts/prepare-sidecar.ps1
- name: Check native shell
run: |
cargo fmt --manifest-path apps/desktop/src-tauri/Cargo.toml --check
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
cargo clippy --locked --manifest-path apps/desktop/src-tauri/Cargo.toml --all-targets -- -D warnings
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
cargo test --locked --manifest-path apps/desktop/src-tauri/Cargo.toml
- name: Build installer
run: pnpm --dir apps/desktop tauri build --bundles nsis
- name: Check installer lifecycle
run: ./scripts/test-windows-installer.ps1 -Installer (Get-ChildItem apps/desktop/src-tauri/target/release/bundle/nsis/*-setup.exe).FullName
- uses: actions/upload-artifact@v4
with:
name: gravity-windows-x64
path: apps/desktop/src-tauri/target/release/bundle/nsis/*-setup.exe
if-no-files-found: error
8 changes: 5 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ to public issues. Security reports belong in the private channel described in

Use a current stable Rust toolchain, Node.js 22, and pnpm 11. Building the native
macOS app requires Xcode Command Line Tools. Official binaries target Apple
Silicon macOS; other platforms are not currently distributed. Docker is required
Silicon macOS; Windows x64 builds are available as CI artifacts. See
[Windows setup](docs/windows.md) for native prerequisites and PowerShell commands. Docker is required
for the visual regression suite.

```sh
Expand All @@ -35,7 +36,7 @@ cargo build --workspace
./scripts/dev.sh
```

Real bots require your own Claude Code installation and authentication. Use
Real bots require your own Claude Code or Codex CLI installation and authentication. Use
`GRAVITY_RUNTIME=double ./scripts/dev.sh` to run the deterministic test runtime
without Claude credentials. Development state stays under `.dev/`.

Expand All @@ -55,7 +56,8 @@ pnpm run verify

This runs Rust and native-shell checks, desktop and marketing typechecking,
linting, tests and builds, the file-length check, and visual regression tests.
It stops on the first failure. Full verification requires macOS and running Docker.
It stops on the first failure. Native-shell checks run on the host platform;
visual verification requires running Docker with Linux containers.

Visual baselines must be generated in the pinned CI container; use the
repository's visual regression workflow when accepting
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 8 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
# Gravity

Always-on, multi-bot desktop app with Claude Code as the agent runtime. A Rust
daemon (`gravityd`) runs on a Mac mini; the Tauri desktop client attaches
Always-on, multi-bot desktop app with Claude Code or Codex CLI as the agent runtime.
A Rust daemon (`gravityd`) runs on macOS or Windows; the Tauri desktop client attaches
from any machine. See the [architecture](docs/architecture.md) for the system
design and the [control-plane protocol](docs/protocol.md) for client APIs.
Native Windows x64 builds and local-daemon setup are described in
[Windows build instructions](docs/windows.md).

Builds and tests require no Linear, PostHog, or Cloudflare account. Running real
bots requires your own Claude Code installation and authentication; the test
bots requires your own installation and authentication for the chosen CLI; the test
runtime works without it. See [public-build configuration](docs/public-builds.md)
for telemetry, releases, and secret scanning.

Choose each bot's CLI in **Bot info → Bot runtime**. See
[bot runtimes](docs/bot-runtimes.md) for setup, configuration and the native Codex terminal.

## Layout

```
Expand Down
94 changes: 94 additions & 0 deletions apps/desktop/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions apps/desktop/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,15 @@ serde_json = "1"
semver = "1"
ureq = { version = "2", features = ["json"] }
toml = "0.8"

# On-device dictation for the chat composer (Apple's Speech framework).
[target.'cfg(target_os = "macos")'.dependencies]
objc2 = "0.6"
block2 = "0.6"
objc2-foundation = "0.3"
objc2-speech = "0.3"
objc2-avf-audio = "0.3"

# On-device dictation on Windows (SAPI's in-process recognizer).
[target.'cfg(windows)'.dependencies]
windows = { version = "0.61", features = ["Win32_Foundation", "Win32_Media_Speech", "Win32_System_Com"] }
10 changes: 10 additions & 0 deletions apps/desktop/src-tauri/Entitlements.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- Signed releases run with the hardened runtime, which blocks the
microphone unless the app declares it. Used only for dictation. -->
<key>com.apple.security.device.audio-input</key>
<true/>
</dict>
</plist>
11 changes: 11 additions & 0 deletions apps/desktop/src-tauri/Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- Dictation in the chat composer. Merged into the app's Info.plist by the Tauri bundler. -->
<key>NSMicrophoneUsageDescription</key>
<string>Gravity listens while you dictate a message to a bot in the chat.</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>Gravity turns your dictation into text on this Mac, for messages to your bots.</string>
</dict>
</plist>
Loading