Skip to content

Conversation

@bfulton
Copy link
Owner

@bfulton bfulton commented Dec 26, 2025

Summary

  • Fix proxy concurrency limitation: Allow up to max-parallelism (N) jobs per target by registering N proxies for each configured target. Github doesn't send more than 1 job to a runner at a time.
  • Fix runner state sync bug: When targets were added via the Targets page, the runner showed "Not configured" because React state wasn't updated. Now refreshTargets() properly syncs isConfigured state and auto-starts the runner when the first target is added.
  • Restructure SECURITY.md: Lead with security policy (vulnerability reporting, response timeline, scope) followed by architecture details.
  • Security hardening: Set restrictive umask (077), ensure app data directory has 700 permissions, validate GitHub URLs before opening in browser.
  • Update roadmap: Remove completed items (multi-target, notifications, deep links), add reactive state management as future work.

Test plan

  • Fresh install: download runner, add target via Targets page → runner should auto-start
  • Verify Status page shows correct state after adding first target
  • Verify CLI localmost status matches UI state
  • Check ~/.localmost directory permissions are 700

🤖 Generated with Claude Code

bfulton and others added 4 commits December 25, 2025 21:43
- Fix refreshTargets to update isConfigured state when targets change
- Auto-start runner when first target is added and runner is offline
- Restructure SECURITY.md: lead with security policy, then architecture
- Update README roadmap: remove completed items, add reactive state management

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Set restrictive umask (077) at app startup for user-only file access
- Add ensureAppDataDir() to create ~/.localmost with 700 permissions
- Validate GitHub URLs before opening in browser to prevent phishing
- Remove unused attestation checking code from runner downloader

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The RUNNER_START IPC handler was missing critical initialization that
the auto-start code in index.ts had:

- Initialize broker proxy with target credentials
- Start the broker proxy server
- Send state machine START/INITIALIZED events
- Update tray menu after start/stop

Without these, jobs weren't being picked up and tray wasn't updated
when starting the runner via IPC (e.g., after adding first target).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add webpack splitChunks to separate vendor code (React, FontAwesome)
  into separate bundles, reducing main.js from 251 KiB to 37.7 KiB
- Use [name] pattern for CSS chunk filenames to avoid conflicts
- Remove unused catch parameter in runner-manager.ts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
bfulton and others added 3 commits December 25, 2025 22:24
Two issues caused "Mixed (1/3 connected)":

1. TARGETS_ADD IPC handler didn't notify broker proxy about new targets
2. brokerProxyService.addTarget() didn't create sessions if already running

Now:
- TARGETS_ADD loads credentials and adds target to running broker proxy
- TARGETS_REMOVE cleans up target from broker proxy
- addTarget() creates session immediately if proxy is already running

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
runner-manager.ts used raw os.hostname() which includes .local on macOS,
but ipc-handlers/app.ts getHostname() stripped it. This caused mismatch
between config default (localmost.blue-243) and display name
(localmost.blue-243.local.1-4).

Added getCleanHostname() helper and use it consistently.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1. Runner display name now shows:
   - Single target: the proxy runner name (e.g., localmost.blue-243.owner-repo)
   - Multiple targets: prefix with wildcard (e.g., localmost.blue-243.*)

2. Runner name link now opens all registered runner settings pages,
   not just the first one. Shows tooltip indicating count when multiple.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@bfulton bfulton changed the title Security updates and runner state sync fix Security updates, runner state sync + proxy concurrency fixes Dec 26, 2025
- Register N runners per target (default 4) for parallel job execution
- Store credentials in numbered subdirectories: proxies/<target-id>/1/, /2/, etc.
- Update broker proxy to manage multiple sessions per target
- Persist session IDs to disk for crash recovery
- Clean up stale sessions on startup before creating new ones
- Wait for session deletions on shutdown to prevent orphaned sessions
- Add settings change logging

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@bfulton bfulton merged commit adfbc41 into main Dec 26, 2025
4 checks passed
@bfulton bfulton deleted the update-security branch December 26, 2025 05:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants