Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
7eb4bb0
fix(sync): preserve optimistic entries for stale loads
btriapitsyn Jul 11, 2026
2d880d7
fix(sync): defer incomplete assistant-only pages
btriapitsyn Jul 11, 2026
15be4eb
fix(auth): reject spoofed local host headers
btriapitsyn Jul 11, 2026
f19d02d
fix(sidebar): avoid duplicate refresh loads
btriapitsyn Jul 11, 2026
3a22204
fix(chat): retain latest overlapping message data
btriapitsyn Jul 11, 2026
c2bf96b
fix(worktree): refresh changed discovery metadata
btriapitsyn Jul 11, 2026
c8850a4
fix(sidebar): preserve pins after partial session loads
btriapitsyn Jul 11, 2026
e250fca
fix(session): do not block draft creation on auto-accept
btriapitsyn Jul 11, 2026
c387fb2
fix(queue): back off failed queued auto-sends
btriapitsyn Jul 11, 2026
56cf5e2
feat: session goals - server-driven goal loop with independent small-…
btriapitsyn Jul 11, 2026
0501e78
fix(sidebar): keep recent project ids referentially stable
btriapitsyn Jul 11, 2026
7533c7a
feat: file-backed goal objectives + compaction accounting fixes
btriapitsyn Jul 11, 2026
3d5dfa3
fix(mobile): eliminate >10s sidebar open delay by always mounting Ses…
tomzx Jul 11, 2026
6e93f58
feat: add craft-goal session starter and command
btriapitsyn Jul 12, 2026
395fd45
fix(notifications): handle subagents and session errors (#2156)
btriapitsyn Jul 12, 2026
04d7c6d
feat(quota): add OpenCode Go usage tracking (#2155)
btriapitsyn Jul 12, 2026
6231375
feat: persist permission auto-accept on server (#2158)
btriapitsyn Jul 12, 2026
642facc
feat: add sort-desc icon for sidebar project sorting
btriapitsyn Jul 12, 2026
0b84a72
refactor: simplify sidebar project sorting
btriapitsyn Jul 12, 2026
49616c8
refactor(quota): secure managed provider credentials (#2160)
btriapitsyn Jul 12, 2026
78f3ac2
feat: distill oversized plan goals into audit criteria
btriapitsyn Jul 12, 2026
d11704d
feat: distill any oversized goal objective, not just plans
btriapitsyn Jul 12, 2026
9c4c53b
fix: mobile goal UX — bottom-sheet dialog, keyboard-safe target butto…
btriapitsyn Jul 12, 2026
af34f22
feat: connection candidates refresh + relay identity hardening
btriapitsyn Jul 12, 2026
a324bd0
fix(quota): derive Codex windows from duration
btriapitsyn Jul 12, 2026
79e4592
fix: single relay host per machine via cooperative claim lock
btriapitsyn Jul 12, 2026
1cb7787
feat(chat): allow prompting subagent sessions
btriapitsyn Jul 12, 2026
7ae7287
fix(chat): sync subagent prompting in context panel
btriapitsyn Jul 12, 2026
07ddaec
perf: fast relay connect on mobile and desktop + connect splash + edi…
btriapitsyn Jul 12, 2026
8bf153d
feat: group chat visual settings into labeled sections
btriapitsyn Jul 12, 2026
39c4bbd
fix(ui,server): normalize Windows drive letter casing for consistent …
bashrusakh Jul 12, 2026
7ab06f1
feat(files): expose markdown preview toggle (#2152)
greghaynes Jul 12, 2026
0d60e45
fix(files): scope preview defaults to previewable files
btriapitsyn Jul 12, 2026
c876195
feat: add VS Code Insiders to open-in-apps
btriapitsyn Jul 12, 2026
cf5b254
fix: hide craft-goal starter in VS Code runtime
btriapitsyn Jul 12, 2026
e1e5bf6
release v1.16.0
btriapitsyn Jul 12, 2026
4c69ca6
fix(chat): enable in-place subtask navigation in embedded session-cha…
ameshkov Jul 13, 2026
51f168b
Fix: small model dispatch fails for custom OpenAI-compatible provider…
ameshkov Jul 13, 2026
484325a
feat(desktop): Linux AppImage polish — window controls, updater UX, d…
makeittech Jul 13, 2026
0d22c57
feat(chat): desktop prompt navigator rail (#2054)
makeittech Jul 13, 2026
406a03e
feat: localize quota credentials saved toast
btriapitsyn Jul 13, 2026
6c4c15a
fix(chat): rework prompt navigator rail into sliding tape with hover …
btriapitsyn Jul 13, 2026
fa0a0a8
fix(quota): Ollama Cloud credential validation and UI decoupling (#2187)
bashrusakh Jul 13, 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
7 changes: 7 additions & 0 deletions .github/workflows/oc-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,10 @@ jobs:

- name: Lint
run: bun run lint

- name: Electron Linux packaging unit tests
working-directory: packages/electron
run: |
bun run test:architecture
bun run test:updater
bun run type-check
179 changes: 178 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,148 @@ jobs:
path: packages/electron/dist/latest.yml
retention-days: 1

build-desktop-electron-linux:
needs: create-release
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-24.04
arch: x64
host_arch: x86_64
artifact_arch: x86_64
manifest: latest-linux.yml
- runner: ubuntu-24.04-arm
arch: arm64
host_arch: aarch64
artifact_arch: arm64
manifest: latest-linux-arm64.yml
runs-on: ${{ matrix.runner }}
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

- name: Setup bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0

- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: '22'

- name: Verify native Linux architecture
env:
EXPECTED_HOST_ARCH: ${{ matrix.host_arch }}
OPENCHAMBER_TARGET_ARCH: ${{ matrix.arch }}
run: |
set -euo pipefail
test "$(uname -m)" = "$EXPECTED_HOST_ARCH"
test "$(node -p 'process.arch')" = "$OPENCHAMBER_TARGET_ARCH"

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Get bundled OpenCode CLI version
id: opencode_cli_version
shell: bash
run: |
VERSION=$(node -p "require('./package.json').dependencies['@opencode-ai/sdk']")
echo "version=$VERSION" >> "$GITHUB_OUTPUT"

- name: Cache bundled OpenCode CLI artifact
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
with:
path: packages/electron/.cache/opencode-cli
key: opencode-cli-${{ runner.os }}-${{ matrix.arch }}-${{ steps.opencode_cli_version.outputs.version }}
restore-keys: |
opencode-cli-${{ runner.os }}-${{ matrix.arch }}-

- name: Run focused Electron release tests
working-directory: packages/electron
run: |
bun run test:architecture
bun run test:updater

- name: Build and package Linux AppImage
working-directory: packages/electron
env:
OPENCHAMBER_TARGET_ARCH: ${{ matrix.arch }}
run: |
set -euo pipefail
bun run build:web-assets
bun run prepare:opencode-cli
bun run verify:opencode-cli
bun run bundle:main
bun run rebuild:native
node ./scripts/package.mjs --linux --${{ matrix.arch }} --publish=never
bun run verify:opencode-cli:packaged
bun run verify:linux-appimage

- name: Validate Linux update manifest
working-directory: packages/electron
env:
VERSION: ${{ needs.create-release.outputs.version }}
ARTIFACT_ARCH: ${{ matrix.artifact_arch }}
MANIFEST: ${{ matrix.manifest }}
run: |
set -euo pipefail
APPIMAGE="dist/OpenChamber-${VERSION}-linux-${ARTIFACT_ARCH}.AppImage"
node ./scripts/verify-update-manifest.mjs "dist/${MANIFEST}" "$APPIMAGE" "$VERSION"

- name: Upload validated Linux release files
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: linux-release-${{ matrix.arch }}
path: |
packages/electron/dist/OpenChamber-${{ needs.create-release.outputs.version }}-linux-${{ matrix.artifact_arch }}.AppImage
packages/electron/dist/${{ matrix.manifest }}
if-no-files-found: error
retention-days: 1

publish-electron-linux:
needs: [create-release, build-desktop-electron-linux]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

- name: Download x64 Linux release files
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: linux-release-x64
path: artifacts/x64

- name: Download arm64 Linux release files
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: linux-release-arm64
path: artifacts/arm64

- name: Revalidate separate Linux manifests
env:
VERSION: ${{ needs.create-release.outputs.version }}
run: |
set -euo pipefail
node packages/electron/scripts/verify-update-manifest.mjs \
artifacts/x64/latest-linux.yml \
"artifacts/x64/OpenChamber-${VERSION}-linux-x86_64.AppImage" \
"$VERSION"
node packages/electron/scripts/verify-update-manifest.mjs \
artifacts/arm64/latest-linux-arm64.yml \
"artifacts/arm64/OpenChamber-${VERSION}-linux-arm64.AppImage" \
"$VERSION"

- name: Upload Linux AppImages and manifests to release
if: ${{ github.event.inputs.dry_run != 'true' }}
uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2.6.2
with:
tag_name: v${{ needs.create-release.outputs.version }}
files: |
artifacts/x64/OpenChamber-${{ needs.create-release.outputs.version }}-linux-x86_64.AppImage
artifacts/x64/latest-linux.yml
artifacts/arm64/OpenChamber-${{ needs.create-release.outputs.version }}-linux-arm64.AppImage
artifacts/arm64/latest-linux-arm64.yml
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

combine-electron-manifests:
needs: [create-release, build-desktop-electron-macos]
runs-on: ubuntu-latest
Expand Down Expand Up @@ -404,12 +546,47 @@ jobs:
secrets: inherit

finalize-release:
needs: [create-release, build-desktop-electron-macos, build-desktop-electron-windows, publish-npm, combine-electron-manifests, mobile-release]
needs: [create-release, build-desktop-electron-macos, build-desktop-electron-windows, build-desktop-electron-linux, publish-electron-linux, publish-npm, combine-electron-manifests, mobile-release]
runs-on: ubuntu-latest
env:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
DISCORD_UPDATE_ROLE_ID: ${{ secrets.DISCORD_UPDATE_ROLE_ID }}
steps:
- name: Verify final Linux release asset inventory
if: ${{ github.event.inputs.dry_run != 'true' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPOSITORY: ${{ github.repository }}
VERSION: ${{ needs.create-release.outputs.version }}
run: |
node - <<'NODE'
(async () => {
const { REPOSITORY: repo, VERSION: version, GITHUB_TOKEN: token } = process.env;
const expected = [
`OpenChamber-${version}-linux-x86_64.AppImage`,
'latest-linux.yml',
`OpenChamber-${version}-linux-arm64.AppImage`,
'latest-linux-arm64.yml',
];
const response = await fetch(`https://api.github.com/repos/${repo}/releases/tags/v${version}`, {
headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' },
});
if (!response.ok) throw new Error(`Failed to inspect release assets: ${response.status} ${await response.text()}`);
const release = await response.json();
for (const name of expected) {
const matches = release.assets.filter((asset) => asset.name === name);
if (matches.length !== 1) throw new Error(`Expected exactly one ${name} release asset, found ${matches.length}`);
if (!Number.isSafeInteger(matches[0].size) || matches[0].size <= 0) {
throw new Error(`Release asset ${name} has invalid size ${matches[0].size}`);
}
}
console.log(`Verified ${expected.length} Linux release assets and both architecture manifests.`);
})().catch((error) => {
console.error(error);
process.exit(1);
});
NODE

- name: Publish release
uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2.6.2
with:
Expand Down
6 changes: 6 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,12 @@ Notification message preparation utilities for system notifications, including t

- Module docs: `packages/web/server/lib/notifications/DOCUMENTATION.md`

##### permission-auto-accept

Persistent server-owned permission auto-accept policy, subagent inheritance, retries, and reconnect reconciliation.

- Module docs: `packages/web/server/lib/permission-auto-accept/DOCUMENTATION.md`

##### scheduled-tasks

Scheduled task persistence, execution, and event fanout for recurring sessions.
Expand Down
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,31 @@ All notable changes to this project will be documented in this file.

## [Unreleased]

- **Desktop/Linux:** official AppImage releases for x86_64 and arm64, with in-app window controls (position follows OS defaults or Settings → Sessions), writable-AppImage auto-update, and clearer updater errors when the AppImage is missing or read-only. Linux does not yet include system tray or launch-at-login.

## [1.16.0] - 2026-07-13

- **Session goals:** arm the new target button in the composer and your next prompt becomes a [goal](https://docs.openchamber.dev/session-goals/) — the session keeps working toward it on its own, with an independent small-model audit checking each finished turn, until the objective is verifiably complete, blocked, or over its optional token budget. The loop runs on the server, so it continues with the app closed and survives restarts. A goal strip above the composer shows progress with pause/resume; goals can also start from the plan-implement dialog, from scheduled tasks ("Run as goal"), or with the new "Craft a Goal" starter and `/craft-goal` command. While a goal runs, per-turn "ready" notifications are replaced by a single notification when it settles.
- **Usage:** OpenCode Go usage tracking is here, and Codex quota windows now show the correct reset times.
- **Remote access:** connecting over the relay got much faster — the app no longer waits for a stale local address to time out before trying the relay (previously up to ~20 seconds on a phone away from home). When your computer gets a new local IP, paired devices now learn the new address over the relay and quietly move back to the local network on their own — no re-pairing. The phone's launch screen shows which device it is connecting to.
- Remote access: running several OpenChamber instances on the same machine no longer makes paired devices land on a random one of them — only one process per machine serves the relay now. This was behind intermittent "Unable to reach server" errors on paired phones.
- Permissions: per-session auto-accept now lives on the server — sessions keep auto-accepting tool calls while the app is closed and after a server restart, subagent sessions inherit the setting, and it can be enabled on a draft before the first message (thanks to @bashrusakh for the draft fix).
- Chat: subagent sessions can now be prompted directly — open a subagent from the context panel and send it follow-up messages (off by default, available in settings).
- Chat: queued messages now send when the session is already idle instead of waiting forever in some cases, pending agent questions stay answerable after a server restart, and session renames no longer flicker back to the old title (thanks to @bashrusakh).
- Files: the file viewer has a markdown preview toggle (thanks to @greghaynes).
- Sidebar: projects can be sorted by different modes with a direction toggle, pinned sessions survive refreshes, and the file tree stays expanded while it refreshes (thanks to @bashrusakh).
- Command palette: projects are included in the fuzzy search alongside sessions and files (thanks to @bashrusakh).
- Settings: chat visual settings are grouped into labeled sections, and a new editor font size setting for the code editor (thanks to @bashrusakh).
- GitHub: PR and issue context now resolves against the source repository in fork workflows (thanks to @bashrusakh).
- Agents: saving agent settings from the UI no longer drops custom YAML frontmatter fields (thanks to @bashrusakh).
- Notifications: session errors and subagent completions now notify reliably across desktop, web, and mobile.
- Editor: "Open in" now recognizes VS Code Insiders.
- Windows: paths no longer mismatch on drive letter casing, which could split one project into duplicates (thanks to @bashrusakh).
- Mobile: the sessions sidebar opens instantly instead of taking many seconds on some devices (thanks to @tomzx).
- Mobile: renaming a saved instance no longer breaks its connection — the stored access token was getting lost on edit.
- Mobile: on Android 15 the app no longer draws under the status bar.
- Security: requests that spoof local host headers to look like same-machine traffic are rejected.

## [1.15.0] - 2026-07-10

- **Remote access:** a new [private relay](https://docs.openchamber.dev/private-relay/) lets you reach your instance from anywhere — no open ports and no third-party tunnel, over an end-to-end-encrypted tunnel. It turns on by itself when you pair a device over it and turns off once no paired device uses it (thanks to @yulia-ivashko).
Expand Down
20 changes: 16 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
## Getting Started

```bash
git clone https://github.com/btriapitsyn/openchamber.git
git clone https://github.com/openchamber/openchamber.git
cd openchamber
bun install
```
Expand Down Expand Up @@ -31,12 +31,14 @@ bun run electron:dev:bundled # Electron shell using built web assets
bun run electron:build # Package desktop app for the current platform
```

Desktop supports macOS and Windows. The build output is written to `packages/electron/dist`.
Desktop supports macOS, Windows, and Linux. The build output is written to `packages/electron/dist`.

macOS builds create `dmg` and `zip` files. You need Xcode/build tools for notarized packaging and icon asset work.

Windows builds create an NSIS installer. If signing env vars are not set, the build script makes an unsigned installer.

Linux builds produce an AppImage for the native x64 or arm64 host.

For desktop-specific details, see [`packages/electron/README.md`](./packages/electron/README.md).

### VS Code Extension
Expand Down Expand Up @@ -94,7 +96,17 @@ Windows:
bun run electron:build
```

Linux is supported for web/CLI development. A Linux desktop app is still planned, so Electron packaging is mainly macOS and Windows right now.
Linux x64 and arm64 AppImages are packaged natively on the matching host architecture. Use Bun for dependency installation and packaging orchestration:

```bash
OPENCHAMBER_TARGET_ARCH=x64 bun run electron:build
# On an arm64 host:
OPENCHAMBER_TARGET_ARCH=arm64 bun run electron:build

bun run --cwd packages/electron verify:linux-appimage
```

The final AppImage verifier checks desktop identity and the architecture of Electron, the bundled OpenCode CLI, and packaged native modules.

## Before Submitting

Expand Down Expand Up @@ -149,4 +161,4 @@ You can still help:

## Questions?

Open an [issue](https://github.com/btriapitsyn/openchamber/issues) or ask in [Discord](https://discord.gg/ZYRSdnwwKA).
Open an [issue](https://github.com/openchamber/openchamber/issues) or ask in [Discord](https://discord.gg/ZYRSdnwwKA).
Loading
Loading