Skip to content

Commit 2aa280e

Browse files
committed
Launch readiness: CI, security policy, screenshots, Node guard, package metadata
CI on windows-latest (the only platform the safety properties have been verified on), SECURITY.md with private-reporting instructions and an honest scope, real UI screenshots embedded in the README (captured from the running app in headless Edge), a friendly Node>=22.5 check in the launcher instead of a node:sqlite stack trace, and public package metadata (coderelay, MIT, repository/bugs/keywords).
1 parent 27dee76 commit 2aa280e

9 files changed

Lines changed: 104 additions & 4 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
8+
jobs:
9+
test:
10+
# Windows only, deliberately: it is the platform every safety property has
11+
# been verified on (cmd.exe quoting, CreateProcess CWD search, path
12+
# semantics). A green Linux run would imply support this project has not
13+
# earned yet.
14+
runs-on: windows-latest
15+
steps:
16+
- uses: actions/checkout@v4
17+
- uses: actions/setup-node@v4
18+
with:
19+
node-version: 24
20+
cache: npm
21+
- run: npm ci
22+
# lint (strict tsc) + build + 378 tests. Uses a mock agent CLI — no AI
23+
# calls, no credits, no secrets required.
24+
- run: npm test

‎README.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ Your personal remote coding agent. Send a coding task from your phone — your h
1414
- **Two ways in.** Telegram bot, an installable web app, or both — same tasks, same history, either one is optional.
1515
- **Built paranoid.** Your uncommitted work is snapshotted before every task, nothing is pushed without your approval, and secrets never leave the machine.
1616

17+
<p align="center">
18+
<img src="docs/assets/web-desktop-dark.png" alt="CodeRelay web interface, dark theme" width="72%" />
19+
<img src="docs/assets/web-mobile-dark.png" alt="CodeRelay on a phone" width="20.5%" />
20+
</p>
21+
<p align="center"><sub>The web interface — desktop and phone. Light theme included. Every screenshot is the real app.</sub></p>
22+
1723
## Get started in five minutes
1824

1925
On the PC that has your code (needs [Node 22.5+](https://nodejs.org), git, and a GitHub Copilot subscription):

‎SECURITY.md‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Security Policy
2+
3+
CodeRelay is an AI agent that runs unattended on a personal computer with the
4+
operator's own permissions. Security reports are taken seriously and handled
5+
with priority over feature work.
6+
7+
## Reporting a vulnerability
8+
9+
Please **do not** open a public issue for security problems. Instead, use
10+
GitHub's private reporting: **Security → Report a vulnerability** on this
11+
repository. Include what you found, how to reproduce it, and what an attacker
12+
gains.
13+
14+
You can expect an acknowledgement within a few days. There is no bounty — this
15+
is a free, self-hosted personal tool — but real findings get fixed, credited,
16+
and added to the red-team regression suite so they stay fixed.
17+
18+
## Scope — what counts
19+
20+
The threat model treats the **target repository as hostile input** and the
21+
operator as trusted. In scope, roughly in order of severity:
22+
23+
1. Escaping the deny-lists or the child-environment allow-list (e.g. reaching
24+
the Telegram bot token or the operator's credentials from a task, a test
25+
run, or repository content).
26+
2. Making the agent execute repository-supplied configuration (git hooks,
27+
filter/diff drivers, planted binaries, agent-instruction files, MCP/LSP
28+
config) despite the existing detections.
29+
3. Web interface: authentication bypass, CSRF, XSS via agent output or
30+
repository content, path traversal, session weaknesses, the service worker
31+
caching anything from `/api/`.
32+
4. Destroying the operator's uncommitted work, or bypassing an approval gate
33+
(protected branch, push, dirty tree, manifest tamper).
34+
5. Unbounded spend: defeating the credit budgets or the unreported-usage guard.
35+
36+
Out of scope: attacks requiring an already-compromised operator account or
37+
machine, the inherent fact that running a project's tests executes that
38+
project's code (documented as a known limitation), and denial-of-service
39+
against your own instance.
40+
41+
## What already exists
42+
43+
The design assumptions and verified attack history are documented in
44+
[project-analysis.md](project-analysis.md) §7, and every previously working
45+
exploit has a regression test in `tests/redteam.test.ts`. Reading those two
46+
first will tell you what has already been tried.

‎bin/remote-agent.js‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ import { existsSync } from 'node:fs';
44
import path from 'node:path';
55
import { fileURLToPath, pathToFileURL } from 'node:url';
66

7+
// Checked here, before anything touches node:sqlite, so an old Node gets one
8+
// clear sentence instead of a module-not-found stack trace.
9+
const [major, minor] = process.versions.node.split('.').map(Number);
10+
if (major < 22 || (major === 22 && minor < 5)) {
11+
console.error(`\nCodeRelay needs Node.js 22.5 or newer (for the built-in SQLite module).\nYou are running ${process.versions.node}. Get a current version from https://nodejs.org\n`);
12+
process.exit(1);
13+
}
14+
715
const here = path.dirname(fileURLToPath(import.meta.url));
816
const built = path.join(here, '..', 'dist', 'src', 'cli.js');
917

‎docs/assets/web-desktop-dark.png‎

75.4 KB
Loading

‎docs/assets/web-desktop-light.png‎

79.1 KB
Loading

‎docs/assets/web-mobile-dark.png‎

64.7 KB
Loading

‎package-lock.json‎

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json‎

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,23 @@
11
{
2-
"name": "remote-personal-coding-agent",
2+
"name": "coderelay",
33
"version": "1.0.0",
44
"private": true,
5-
"description": "Self-hosted remote coding agent: Telegram -> home PC -> GitHub Copilot CLI -> local repository.",
5+
"description": "Your personal remote coding agent: send a task from your phone, your home PC runs GitHub Copilot against your local repo, tests it, and reports back. Telegram + installable web app, zero recurring cost.",
6+
"license": "MIT",
7+
"repository": {
8+
"type": "git",
9+
"url": "https://github.com/Tayebbb/Mobile-agent-controller.git"
10+
},
11+
"homepage": "https://github.com/Tayebbb/Mobile-agent-controller#readme",
12+
"bugs": "https://github.com/Tayebbb/Mobile-agent-controller/issues",
13+
"keywords": [
14+
"coding-agent",
15+
"github-copilot",
16+
"telegram-bot",
17+
"pwa",
18+
"self-hosted",
19+
"remote-development"
20+
],
621
"type": "module",
722
"engines": {
823
"node": ">=22.5.0"

0 commit comments

Comments
 (0)