From bb6eaef682497cee73bd8383079329bffa0e3c87 Mon Sep 17 00:00:00 2001 From: deymosh Date: Sun, 6 Sep 2026 21:58:50 +0200 Subject: [PATCH 1/5] chore: unify all package versions to 0.10.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The six manifests had drifted apart (root 0.1.0, bridge 0.9.3, mobile/tauri/ Cargo 0.9.5, core 0.9.3, protocol 0.9.4, testkit 0.9.3). Set every one to a single number for the first CodeDeck+ release: a minor step over upstream's last release (0.9.5), reflecting the features the fork adds (Tor/SOCKS5, Orbot, NIP-42, monorepo, CI/release automation) while staying in 0.x. - All package.json + apps/mobile/src-tauri/{tauri.conf.json,Cargo.toml}. - Cargo.lock: the codedeck-mobile entry only (third-party 0.9.x crates untouched); `cargo test --locked` in CI verifies Cargo.toml/Cargo.lock agree. - gen/android build.gradle.kts is not touched — Tauri regenerates tauri.properties (versionName/versionCode) from tauri.conf.json at build time. Co-Authored-By: Claude Sonnet 5 --- apps/bridge/package.json | 2 +- apps/mobile/package.json | 2 +- apps/mobile/src-tauri/Cargo.lock | 2 +- apps/mobile/src-tauri/Cargo.toml | 2 +- apps/mobile/src-tauri/tauri.conf.json | 2 +- package.json | 2 +- packages/core/package.json | 2 +- packages/protocol/package.json | 2 +- packages/testkit/package.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/bridge/package.json b/apps/bridge/package.json index a513f99..b2268c5 100644 --- a/apps/bridge/package.json +++ b/apps/bridge/package.json @@ -1,6 +1,6 @@ { "name": "@codedeck/bridge", - "version": "0.9.3", + "version": "0.10.0", "type": "module", "bin": { "codedeck-bridge": "./out/main.js" diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 36ffb82..66b1fde 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -1,6 +1,6 @@ { "name": "@codedeck/mobile", - "version": "0.9.5", + "version": "0.10.0", "private": true, "type": "module", "license": "MIT", diff --git a/apps/mobile/src-tauri/Cargo.lock b/apps/mobile/src-tauri/Cargo.lock index 23e6f88..0ec4cd8 100644 --- a/apps/mobile/src-tauri/Cargo.lock +++ b/apps/mobile/src-tauri/Cargo.lock @@ -665,7 +665,7 @@ dependencies = [ [[package]] name = "codedeck-mobile" -version = "0.9.5" +version = "0.10.0" dependencies = [ "hex", "mdk-core", diff --git a/apps/mobile/src-tauri/Cargo.toml b/apps/mobile/src-tauri/Cargo.toml index 41371a7..1c6590e 100644 --- a/apps/mobile/src-tauri/Cargo.toml +++ b/apps/mobile/src-tauri/Cargo.toml @@ -2,7 +2,7 @@ name = "codedeck-mobile" # Semver per package (plan: the padded/unpadded calendar-version Cargo footgun # is dead). Keep in lockstep with tauri.conf.json `version`. -version = "0.9.5" +version = "0.10.0" description = "CodeDeck — remote-control Claude Code over Nostr (mobile/desktop shell)" edition = "2021" rust-version = "1.77.2" diff --git a/apps/mobile/src-tauri/tauri.conf.json b/apps/mobile/src-tauri/tauri.conf.json index 783b5ca..8be3427 100644 --- a/apps/mobile/src-tauri/tauri.conf.json +++ b/apps/mobile/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "CodeDeck+", - "version": "0.9.5", + "version": "0.10.0", "identifier": "com.codedeck.next", "build": { "frontendDist": "../dist", diff --git a/package.json b/package.json index cde2e7e..9d5d732 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "codedeck-plus", "private": true, - "version": "0.1.0", + "version": "0.10.0", "description": "CodeDeck+ community continuation of CodeDeck Next — unified bridge + mobile monorepo with Tor/SOCKS5 transport and NIP-42 relay auth.", "scripts": { "typecheck": "pnpm -r --no-bail run typecheck", diff --git a/packages/core/package.json b/packages/core/package.json index acb036a..13fabd0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@codedeck/core", - "version": "0.9.3", + "version": "0.10.0", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 750a29a..9b520bf 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -1,6 +1,6 @@ { "name": "@codedeck/protocol", - "version": "0.9.4", + "version": "0.10.0", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/testkit/package.json b/packages/testkit/package.json index fc52c09..552699b 100644 --- a/packages/testkit/package.json +++ b/packages/testkit/package.json @@ -1,6 +1,6 @@ { "name": "@codedeck/testkit", - "version": "0.9.3", + "version": "0.10.0", "private": true, "type": "module", "main": "src/index.ts", From 68c518cc04f554c862ebda4b7cac6e7fe15416bd Mon Sep 17 00:00:00 2001 From: deymosh Date: Sun, 6 Sep 2026 21:59:16 +0200 Subject: [PATCH 2/5] chore: move the Docker entry shim to docker/main.js main.js is a three-line runtime shim (install a WebSocket global, then import the built bridge CLI) that only ever runs inside the container. It belongs next to Dockerfile and entrypoint.sh, not at the repo root. - git mv main.js -> docker/main.js - docker/Dockerfile: COPY source path updated; the destination stays /app/main.js, so entrypoint.sh (`node /app/main.js run`) and the shim's own `import('./apps/bridge/out/main.js')` (resolved at runtime from /app) are unchanged. - .claude/CLAUDE.md: reference updated. Co-Authored-By: Claude Sonnet 5 --- .claude/CLAUDE.md | 5 +++-- docker/Dockerfile | 2 +- main.js => docker/main.js | 0 3 files changed, 4 insertions(+), 3 deletions(-) rename main.js => docker/main.js (100%) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 7382296..79ca8d7 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -171,8 +171,9 @@ packages/protocol wire contract: schemas, codec (total), kinds, chunking, wiped from component state immediately after send. - Do not downgrade Node / TypeScript / Rust / NDK versions to work around a build failure; fix the root cause. -- The root `main.js` shim and `docker/Dockerfile` both assume the bridge builds - to `apps/bridge/out/main.js` — keep them consistent if that changes. +- The `docker/main.js` shim (copied to `/app/main.js` in the image) and + `docker/Dockerfile` both assume the bridge builds to `apps/bridge/out/main.js` + — keep them consistent if that changes. ## Vendored history note diff --git a/docker/Dockerfile b/docker/Dockerfile index fbfd66f..8a3ff36 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -55,7 +55,7 @@ COPY --chown=root:root docker/git-credential-codedeck-secret /usr/local/bin/git- RUN chmod 0755 /usr/local/bin/git-credential-codedeck-secret COPY --chown=root:root docker/gh-codedeck-secret /usr/local/bin/gh RUN chmod 0755 /usr/local/bin/gh -COPY --chown=codedeck:codedeck main.js /app/main.js +COPY --chown=codedeck:codedeck docker/main.js /app/main.js # Switch back to the non-root user for running the application USER codedeck diff --git a/main.js b/docker/main.js similarity index 100% rename from main.js rename to docker/main.js From 085b081712ad43a830e6ebb7b33d273f87fa9641 Mon Sep 17 00:00:00 2001 From: deymosh Date: Sun, 6 Sep 2026 21:59:44 +0200 Subject: [PATCH 3/5] chore(bridge): point npm metadata at the codedeck-plus repo The published bridge package still carried upstream's coordinates: repository.url -> JeroenOnNostr/codedeck-next-bridge, repository.directory -> apps/bridge-cli (a path that no longer exists), and a README install line pointing at upstream's v0.9.3 release asset. Update all three to deymosh/codedeck-plus / apps/bridge and the v0.10.0 tarball name the release workflow produces. Co-Authored-By: Claude Sonnet 5 --- apps/bridge/README.md | 4 ++-- apps/bridge/package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/bridge/README.md b/apps/bridge/README.md index 7e3bfab..030fe60 100644 --- a/apps/bridge/README.md +++ b/apps/bridge/README.md @@ -8,10 +8,10 @@ extension — same engine (`@codedeck/core`), no editor required. ## Quickstart This package is **not on the npm registry** — install it from the release -tarball: +tarball attached to each CodeDeck+ GitHub release: ```sh -npm i -g https://github.com/JeroenOnNostr/codedeck-next-bridge/releases/download/v0.9.3/codedeck-bridge-0.9.3.tgz +npm i -g https://github.com/deymosh/codedeck-plus/releases/download/v0.10.0/codedeck-bridge-0.10.0.tgz codedeck-bridge run # run the bridge, serving pairing (Ctrl-C to stop) codedeck-bridge pair # pairing window only: terminal QR + pairing URL diff --git a/apps/bridge/package.json b/apps/bridge/package.json index b2268c5..7992cf6 100644 --- a/apps/bridge/package.json +++ b/apps/bridge/package.json @@ -28,8 +28,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/JeroenOnNostr/codedeck-next-bridge.git", - "directory": "apps/bridge-cli" + "url": "git+https://github.com/deymosh/codedeck-plus.git", + "directory": "apps/bridge" }, "engines": { "node": ">=20" From 40e01eeb64063d42c462c9925979d91a124d2945 Mon Sep 17 00:00:00 2001 From: deymosh Date: Sun, 6 Sep 2026 22:00:27 +0200 Subject: [PATCH 4/5] docs: refresh the README layout diagram and add a Releases section - Repository layout: add .github/, .claude/, docs/PROTOCOL.md; show docker/main.js in its new home; note that vendor/* carry their own package.json / pnpm-* which are inert (not in the workspace glob); list ./codedeck. - New Releases section: what a vX.Y.Z tag produces (signed APK, bridge npm tarball, GHCR image), the prerelease-on-hyphen rule, workflow_dispatch dry run, and the four signing secrets, linking the cut-release skill. - CI status badge. Co-Authored-By: Claude Sonnet 5 --- README.md | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f4325c6..8c765db 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # CodeDeck+ +[![CI](https://github.com/deymosh/codedeck-plus/actions/workflows/ci.yml/badge.svg)](https://github.com/deymosh/codedeck-plus/actions/workflows/ci.yml) + CodeDeck+ is a community-maintained continuation of CodeDeck Next. The original work belongs to [JeroenOnNostr](https://github.com/JeroenOnNostr), whose two upstream projects are: @@ -30,8 +32,8 @@ patch) but is built separately with its own Android/Rust toolchain. ``` codedeck-plus/ ├── vendor/ # pristine git-subtree mirrors of upstream — never hand-edited -│ ├── bridge/ # codedeck-next-bridge @ main -│ └── mobile/ # codedeck-next-mobile @ main +│ ├── bridge/ # codedeck-next-bridge @ main (carries its own package.json / pnpm-*, +│ └── mobile/ # codedeck-next-mobile @ main inert — not in the workspace glob) ├── packages/ # shared workspace packages (the actual, editable code) │ ├── protocol/ # wire format + NIP-42 signer, used by both apps │ ├── core/ # bridge engine (Node-only: Tor/SOCKS5 transport lives here) @@ -41,9 +43,15 @@ codedeck-plus/ │ └── mobile/ # Tauri v2 + React Android app (not built by Docker) ├── docker/ │ ├── Dockerfile -│ └── entrypoint.sh +│ ├── entrypoint.sh +│ └── main.js # container entry shim (WebSocket global → built bridge CLI) +├── docs/ +│ └── PROTOCOL.md # the wire contract (packages/protocol/src/ is authoritative) ├── scripts/ │ └── sync-upstream.sh # pulls upstream into vendor/*, for hand-merging +├── .github/workflows/ # ci.yml (typecheck + test + build + cargo) · release.yml (tag → release) +├── .claude/ # CLAUDE.md + skills for Claude Code +├── codedeck # ./codedeck — bridge / Tor / APK / test wrapper (Docker, no host toolchain) ├── docker-compose.yml ├── pnpm-workspace.yaml └── data/ # runtime volume (bridge identity, paired phones, sessions) @@ -124,6 +132,26 @@ docker compose --profile tor up -d --build docker compose logs -f codedeck-bridge ``` +## Releases + +Pushing a `vMAJOR.MINOR.PATCH` tag runs [`.github/workflows/release.yml`](.github/workflows/release.yml), +which publishes one GitHub Release with every artifact of that version: + +| Component | Artifact | +|---|---| +| Android app | `codedeck-vX.Y.Z.apk` — release aarch64 build, signed | +| Bridge CLI (`npx` / global install) | `codedeck-bridge-X.Y.Z.tgz` | +| Bridge container image | `ghcr.io/deymosh/codedeck-plus-bridge:vX.Y.Z` (and `:latest`) | + +A tag with a hyphen (`v1.2.3-rc1`) is published as a prerelease and does not move +`:latest`. The tag's version is stamped into the bridge and mobile manifests at +build time. `workflow_dispatch` runs the same pipeline for a dry run. + +APK signing needs four repository secrets — `SIGNING_KEY` (base64 keystore), +`KEY_ALIAS`, `KEY_STORE_PASSWORD`, `KEY_PASSWORD`. See +[`.claude/skills/cut-release/SKILL.md`](.claude/skills/cut-release/SKILL.md) for +the full runbook. + ## Related repos - [codedeck-next-mobile](https://github.com/JeroenOnNostr/codedeck-next-mobile) — upstream Android app From 6e4958aae1e6e39465eaf8aaf5cd43fdc60d3014 Mon Sep 17 00:00:00 2001 From: deymosh Date: Sun, 6 Sep 2026 22:07:33 +0200 Subject: [PATCH 5/5] fix(mobile): add the missing tauri-plugin-tor-proxy entry to Cargo.lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cargo.lock never got regenerated when tauri-plugin-tor-proxy was added to src-tauri/Cargo.toml (the Orbot work): the crate was declared as a dependency but had no [[package]] entry and no edge in codedeck-mobile's dependency list. `cargo * --locked` fails on it ("cannot update the lock file"). It went unnoticed because the CI cargo job is path-filtered to src-tauri/** and no PR had touched that tree until the 0.10.0 version bump did. Verified with `cargo metadata --locked` (Rust 1.98) for both the host and the aarch64-linux-android target — clean, +11 lines, no other churn. Co-Authored-By: Claude Sonnet 5 --- apps/mobile/src-tauri/Cargo.lock | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/apps/mobile/src-tauri/Cargo.lock b/apps/mobile/src-tauri/Cargo.lock index 0ec4cd8..ad1eea7 100644 --- a/apps/mobile/src-tauri/Cargo.lock +++ b/apps/mobile/src-tauri/Cargo.lock @@ -685,6 +685,7 @@ dependencies = [ "tauri-plugin-http", "tauri-plugin-mesh", "tauri-plugin-notification", + "tauri-plugin-tor-proxy", "tempfile", "tokio", ] @@ -5520,6 +5521,16 @@ dependencies = [ "url", ] +[[package]] +name = "tauri-plugin-tor-proxy" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-plugin", +] + [[package]] name = "tauri-runtime" version = "2.11.3"