Skip to content

Add deterministic dev port runner for multi-instance local workflows - #20

Merged
juliusmarminge merged 1 commit into
mainfrom
codething/6df7db48
Feb 13, 2026
Merged

Add deterministic dev port runner for multi-instance local workflows#20
juliusmarminge merged 1 commit into
mainfrom
codething/6df7db48

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Feb 13, 2026

Copy link
Copy Markdown
Member

Summary

  • add scripts/dev-runner.mjs to centralize dev script startup and compute coordinated server/web port offsets
  • support deterministic multi-instance setup via T3CODE_DEV_INSTANCE (hashed or numeric) and explicit override via T3CODE_PORT_OFFSET
  • propagate computed ports to all relevant env vars (T3CODE_PORT, PORT, VITE_WS_URL, VITE_DEV_SERVER_URL, ELECTRON_RENDERER_PORT)
  • update root package.json dev scripts to route through the new runner
  • make server dev URL configurable in apps/server/package.json instead of hardcoding http://localhost:5173
  • document isolated desktop/dev-instance usage and port-offset behavior in README.md
  • include ELECTRON_RENDERER_PORT in Turbo global env passthrough

Testing

  • Not run (no test or lint output included in the provided changes)
  • manual validation path available via bun run scripts/dev-runner.mjs <mode> --dry-run to confirm computed ports/env wiring

Open with Devin

Summary by CodeRabbit

  • New Features

    • Support for running multiple development instances simultaneously with automatic port management.
  • Documentation

    • Added guidance for launching isolated development environments using environment variables.
  • Chores

    • Updated development scripts infrastructure to support multi-instance orchestration with configurable port offsetting.

- Route `dev*` scripts through `scripts/dev-runner.mjs` to compute shared server/web port offsets
- Support `T3CODE_DEV_INSTANCE` (hashed or numeric) and explicit `T3CODE_PORT_OFFSET`
- Document multi-instance usage and allow server `VITE_DEV_SERVER_URL` override
@coderabbitai

coderabbitai Bot commented Feb 13, 2026

Copy link
Copy Markdown

Walkthrough

This change introduces support for running multiple development instances with deterministic port shifting. A new dev-runner script orchestrates Turbo-based development workflows, calculating port offsets from environment variables. Development scripts are updated to delegate to this runner, and documentation is added explaining the feature with example usage.

Changes

Cohort / File(s) Summary
Documentation
README.md
Added guidance on running multiple dev instances using T3CODE_DEV_INSTANCE to shift ports deterministically, with examples of base ports and offset calculation.
Dev Runner Implementation
scripts/dev-runner.mjs
New Node.js script that coordinates Turbo-based dev workflows with automatic port offset resolution from environment variables, port validation, child process spawning with inherited I/O, and error handling.
Script Updates
package.json, apps/server/package.json
Updated dev scripts to invoke new dev-runner script instead of direct Turbo commands; apps/server now reads VITE_DEV_SERVER_URL from environment with fallback default.
Turbo Configuration
turbo.json
Added ELECTRON_RENDERER_PORT to global environment variables for Turbo task consumption.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: adding a deterministic dev port runner to support multi-instance local development workflows, which is the core purpose of the new scripts/dev-runner.mjs and associated configuration updates.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch codething/6df7db48

Comment @coderabbitai help to get the list of available commands and usage tips.

@macroscopeapp

macroscopeapp Bot commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

Add a dev-runner to shift server and web dev ports deterministically for multi-instance local workflows via scripts/dev-runner.mjs and environment-controlled offsets

Introduce a Bun-based scripts/dev-runner.mjs that sets T3CODE_PORT, PORT, ELECTRON_RENDERER_PORT, VITE_WS_URL, and VITE_DEV_SERVER_URL using T3CODE_PORT_OFFSET or T3CODE_DEV_INSTANCE, route dev scripts through this runner, and make the server respect VITE_DEV_SERVER_URL. Update docs on instance-based port selection.

📍Where to Start

Start with the mode handling and offset calculation in scripts/dev-runner.mjs.


Macroscope summarized f4df41a.

@greptile-apps

greptile-apps Bot commented Feb 13, 2026

Copy link
Copy Markdown

Greptile Overview

Greptile Summary

Adds a centralized dev script runner (scripts/dev-runner.mjs) to coordinate port allocation across server, web, and desktop packages, enabling deterministic multi-instance local development workflows. The runner computes port offsets using either an explicit numeric value (T3CODE_PORT_OFFSET) or by hashing a string identifier (T3CODE_DEV_INSTANCE), then propagates coordinated ports to all relevant environment variables before spawning Turbo.

Key changes:

  • Created dev-runner.mjs with FNV-1a hashing for deterministic port offsets (1-3000 range)
  • Updated root package.json dev scripts to route through the runner
  • Made server dev URL configurable via VITE_DEV_SERVER_URL with fallback
  • Added ELECTRON_RENDERER_PORT to Turbo's global env passthrough
  • Documented multi-instance usage patterns in README

The implementation correctly propagates environment variables and validates port ranges, though numeric T3CODE_DEV_INSTANCE values lack upfront validation and may produce confusing errors for large offsets.

Confidence Score: 4/5

  • Safe to merge with one validation issue that should be fixed to prevent confusing runtime errors
  • Well-structured implementation with proper error handling and documentation. The core logic for port coordination is sound, using a proven hash function and proper environment variable propagation. One logical issue exists where numeric T3CODE_DEV_INSTANCE values aren't validated upfront, which could lead to confusing port-range errors later. The change is additive and maintains backward compatibility (default behavior unchanged).
  • scripts/dev-runner.mjs needs validation fix for numeric instance values

Important Files Changed

Filename Overview
scripts/dev-runner.mjs New script centralizes dev mode startup with deterministic port offset calculation via hashing or explicit env vars; has validation gap for numeric instance values
package.json Routes all dev scripts through new dev-runner wrapper, replacing inline env var definitions
apps/server/package.json Makes dev server URL configurable via VITE_DEV_SERVER_URL env var with fallback to default localhost:5173

Sequence Diagram

sequenceDiagram
    participant Dev as Developer
    participant Runner as dev-runner.mjs
    participant Turbo as Turbo Build System
    participant Server as apps/server
    participant Web as apps/web
    participant Desktop as apps/desktop

    Dev->>Runner: bun run dev (or dev:desktop)
    Runner->>Runner: Resolve port offset<br/>(T3CODE_PORT_OFFSET or<br/>T3CODE_DEV_INSTANCE hash)
    Runner->>Runner: Compute ports<br/>server=3773+offset<br/>web=5173+offset
    Runner->>Runner: Set env vars:<br/>T3CODE_PORT, PORT,<br/>ELECTRON_RENDERER_PORT,<br/>VITE_WS_URL, VITE_DEV_SERVER_URL
    Runner->>Turbo: spawn turbo with computed env
    Turbo->>Server: Start with T3CODE_PORT
    Turbo->>Web: Start with PORT & VITE_WS_URL
    opt Desktop Mode
        Turbo->>Desktop: Start with ELECTRON_RENDERER_PORT
        Desktop->>Desktop: Wait for web server on port
        Desktop->>Desktop: Launch Electron with VITE_DEV_SERVER_URL
    end
    Server->>Web: WebSocket connection on coordinated ports
Loading

Last reviewed commit: f4df41a

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

Comment thread scripts/dev-runner.mjs
Comment on lines +53 to +54
if (/^\d+$/.test(seed)) {
return { offset: Number(seed), source: `numeric T3CODE_DEV_INSTANCE=${seed}` };

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

numeric T3CODE_DEV_INSTANCE values aren't validated before use - large numbers like "70000" will pass through but fail port validation later with a confusing error

Suggested change
if (/^\d+$/.test(seed)) {
return { offset: Number(seed), source: `numeric T3CODE_DEV_INSTANCE=${seed}` };
if (/^\d+$/.test(seed)) {
const offset = Number(seed);
if (offset < 0 || offset > 65535 - Math.max(BASE_SERVER_PORT, BASE_WEB_PORT)) {
throw new Error(`T3CODE_DEV_INSTANCE numeric offset ${offset} would exceed valid port range`);
}
return { offset, source: `numeric T3CODE_DEV_INSTANCE=${seed}` };
}

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@scripts/dev-runner.mjs`:
- Around line 61-67: The usage string thrown in main() is misleading because the
script is invoked via "bun run"; update the thrown Error message inside the mode
validation (the block that checks mode and MODE_ARGS) to reflect the actual
invocation (e.g., include "bun run" and mention optional flags like --dry-run)
so the message matches how users run this script; locate the error creation in
function main() where MODE_ARGS is referenced and replace the existing Usage
text with the corrected invocation text.

Comment thread scripts/dev-runner.mjs
Comment on lines +61 to +67
function main() {
const mode = process.argv[2];
const isDryRun = process.argv.includes("--dry-run");
if (!mode || !(mode in MODE_ARGS)) {
const supportedModes = Object.keys(MODE_ARGS).join(", ");
throw new Error(`Usage: bun scripts/dev-runner.mjs <mode>. Supported modes: ${supportedModes}`);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Align usage message with actual invocation.
The scripts call this via bun run, so the error text is slightly misleading.

✏️ Suggested tweak
-    throw new Error(`Usage: bun scripts/dev-runner.mjs <mode>. Supported modes: ${supportedModes}`);
+    throw new Error(`Usage: bun run scripts/dev-runner.mjs <mode>. Supported modes: ${supportedModes}`);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function main() {
const mode = process.argv[2];
const isDryRun = process.argv.includes("--dry-run");
if (!mode || !(mode in MODE_ARGS)) {
const supportedModes = Object.keys(MODE_ARGS).join(", ");
throw new Error(`Usage: bun scripts/dev-runner.mjs <mode>. Supported modes: ${supportedModes}`);
}
function main() {
const mode = process.argv[2];
const isDryRun = process.argv.includes("--dry-run");
if (!mode || !(mode in MODE_ARGS)) {
const supportedModes = Object.keys(MODE_ARGS).join(", ");
throw new Error(`Usage: bun run scripts/dev-runner.mjs <mode>. Supported modes: ${supportedModes}`);
}
🤖 Prompt for AI Agents
In `@scripts/dev-runner.mjs` around lines 61 - 67, The usage string thrown in
main() is misleading because the script is invoked via "bun run"; update the
thrown Error message inside the mode validation (the block that checks mode and
MODE_ARGS) to reflect the actual invocation (e.g., include "bun run" and mention
optional flags like --dry-run) so the message matches how users run this script;
locate the error creation in function main() where MODE_ARGS is referenced and
replace the existing Usage text with the corrected invocation text.

@juliusmarminge
juliusmarminge merged commit 15380f2 into main Feb 13, 2026
4 checks passed
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.

1 participant