Skip to main content

Debugging Tips

Essential debugging techniques, tools, and workflows for JetStart development. Learn how to diagnose issues quickly and keep your development momentum.

Debug Workflow Overview​

Issue Detected
│
▼
┌─────────────────┐
│ Check Logs │ ← jetstart logs
└────────┬────────┘
│
▼
┌─────────────────┐
│ Identify Source │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Apply Fix │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Verify Hot │ ← instant update
│ Reload Works │
└─────────────────┘

Using JetStart Logs​

Stream All Logs​

# Terminal 1: Run dev server
jetstart dev

# Terminal 2: Stream logs
jetstart logs

Output:

12:34:56 INFO [CLI] [Command] Starting dev server
12:34:57 INFO [CORE] [Server] HTTP server started on :8765
12:34:58 INFO [CORE] [WebSocket] WebSocket server ready on :8766
12:35:00 INFO [CLIENT] [Connection] Connected to server
12:35:01 DEBUG [CLIENT] [UI] MainActivity rendered in 45ms

Filter by Log Level​

# Errors only
jetstart logs --level error

# Warnings and errors
jetstart logs --level warn

# Everything (verbose)
jetstart logs --level verbose

Filter by Source​

# Client logs only
jetstart logs --source client

# Core server logs
jetstart logs --source core

# Build system logs
jetstart logs --source build

Combine Filters​

# Client errors only
jetstart logs --source client --level error

# Core warnings and errors
jetstart logs --source core --level warn

# Last 50 build logs
jetstart logs --source build --lines 50

Common Issues & Solutions​

Issue: Hot Reload Not Working​

Symptoms:

  • Save file, no update appears
  • Or full Gradle build triggers (20s) instead of hot reload (\instant)

Diagnosis:

jetstart logs --source core

# Look for:
# ✓ "🔥 Hot reload starting for: MainActivity.kt" = hot reload working
# ✗ "📦 Non-UI changes detected" = Full build (not hot reload)

Solution 1: Separate UI and logic

// ✗ BAD: Logic and UI mixed
@Composable
fun MyScreen() {
var count by remember { mutableStateOf(0) } // State = full build
Text("Count: $count")
}

// ✓ GOOD: Pure UI only
@Composable
fun MyScreen() {
Text("Hello World") // hot reload works!
}

Solution 2: Check file is in watched directories

✓ app/src/main/java/MainActivity.kt
✓ app/src/main/java/screens/HomeScreen.kt
✗ src/utils/Helper.kt (outside watched path)

Issue: Connection Failed​

Symptoms:

  • QR code scans, but "Connecting..." times out
  • Manual connection fails
  • Dev server shows no connection

Diagnosis:

# Check dev server running
jetstart dev
# Should show: "✓ JetStart dev server is running!"

# Check network
ipconfig # Windows
ifconfig # macOS/Linux
# Phone and computer IPs must match first 3 octets:
# Computer: 192.168.1.100 ✓
# Phone: 192.168.1.101 ✓

Solutions:

1. Same network:

# Connect both to SAME WiFi
# Or create mobile hotspot

2. Firewall:

# Windows
netsh advfirewall firewall add rule name="JetStart" dir=in action=allow protocol=TCP localport=8765-8767

# macOS
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/local/bin/node

# Linux
sudo ufw allow 8765:8767/tcp

3. Restart dev server:

# Ctrl+C to stop
jetstart dev

Issue: Build Errors​

Symptoms:

✗ Build failed: Compilation error in MainActivity.kt

Diagnosis:

jetstart logs --source build --level error

# Shows detailed Gradle/Kotlin errors:
# MainActivity.kt:42: Unresolved reference: Text

Solutions:

1. Check imports:

import androidx.compose.material3.Text  // ← Add if missing

2. Clean build:

cd my-app
./gradlew clean
jetstart build

3. Check Gradle syntax:

// app/build.gradle
dependencies {
implementation "androidx.compose.material3:material3:1.1.0" // ← Ensure present
}

Issue: Emulator Not Detected​

Symptoms:

jetstart dev --emulator
✗ Error: No emulators detected

Diagnosis:

adb devices
# Should show: emulator-5554 device
# If empty, emulator not running

Solutions:

1. Start emulator:

jetstart android-emulator
# → Start emulator → Choose emulator

2. Restart ADB:

adb kill-server
adb start-server
adb devices

3. Check emulator actually booted:

  • Emulator window should show Android home screen
  • Wait 30-60 seconds after launching

Issue: Hot Reload Compilation Fails​

Symptoms:

WARN [CORE] [HotReload] Compilation failed: Unresolved reference: SomeClass
INFO [CORE] Falling back to full Gradle build...

Cause: The changed .kt file references a class that kotlinc cannot resolve from the cached classpath. This usually means a new dependency was added, or a class from another module changed.

Solutions:

  1. Run a full Gradle build to refresh the classpath cache:

    ./gradlew assembleDebug

    After the Gradle build, jetstart dev will pick up any new JARs automatically.

  2. If using a recently added dependency, make sure it was compiled into the Gradle cache first:

    ./gradlew dependencies
  3. If you see consistent kotlinc failures on a file that should compile fine, check KOTLIN_HOME points to a compatible version:

    kotlinc -version
    # Should match or be compatible with your project's Kotlin version in build.gradle

Debugging Tools​

ADB (Android Debug Bridge)​

Check connected devices:

adb devices

View logcat (Android system logs):

adb logcat

# Filter by tag
adb logcat -s JetStart

# Clear logs
adb logcat -c

Inspect app state:

# Check if app installed
adb shell pm list packages | grep jetstart

# Check app permissions
adb shell dumpsys package com.jetstart.myapp | grep permission

# Force stop app
adb shell am force-stop com.jetstart.myapp

File system access:

# List app files
adb shell run-as com.jetstart.myapp ls /data/data/com.jetstart.myapp

# Pull file from device
adb pull /sdcard/Download/app.apk ./

Chrome DevTools (WebSocket Debugging)​

Inspect WebSocket traffic:

  1. Open Chrome: chrome://inspect
  2. Find your device/emulator
  3. Click "Inspect"
  4. Go to Network tab
  5. Filter: WS (WebSocket)
  6. See real-time messages:
    • build-start
    • core:dex-reload (compiled DEX bytecode)
    • build-complete

Useful for:

  • Debugging connection issues
  • Inspecting core:dex-reload DEX payloads and core:js-update messages
  • Monitoring hot reload messages
  • Checking session tokens

Android Studio Logcat​

If you have Android Studio:

  1. View → Tool Windows → Logcat
  2. Filter by package: com.jetstart.myapp
  3. See app crashes, exceptions, logs

Useful for:

  • Runtime exceptions
  • Native crashes
  • System-level errors

JetStart CLI Verbosity​

Environment variable for debug logs:

# Windows
set DEBUG=jetstart:*
jetstart dev

# macOS/Linux
DEBUG=jetstart:* jetstart dev

Shows internal operations:

jetstart:cli Starting dev command +0ms
jetstart:core Creating session +10ms
jetstart:core Starting HTTP server +5ms
jetstart:websocket Client connected +2s
jetstart:build File change detected +5s
jetstart:build Hot reload starting for: MainActivity.kt +2ms

Debug Strategies​

Strategy 1: Isolate the Problem​

Narrow down scope:

  1. Does it work in a new project?

    npx jetstart create test-app
    cd test-app
    jetstart dev
    • Works → Issue is in your project code
    • Fails → Issue is in JetStart setup/environment
  2. Does it work with minimal code?

    • Comment out all code
    • Add back piece by piece
    • Find which code triggers issue
  3. Does it work on different device?

    • Physical device vs emulator
    • Different Android version
    • Different network

For large codebases:

  1. Comment out 50% of code
  2. Test if issue persists
  3. If persists → Issue in remaining 50%
  4. If gone → Issue in commented code
  5. Repeat until found

Example:

@Composable
fun MyScreen() {
Column {
// Half 1
Text("A")
Text("B")

// Half 2 (comment this out first)
// Text("C")
// Text("D")
}
}

Strategy 3: Check Git Diff​

What changed since it last worked?

# See recent changes
git diff HEAD~5

# Checkout previous commit
git checkout HEAD~1

# Test if works
jetstart dev

# If works, issue introduced in last commit

Strategy 4: Clean Slate​

Reset everything:

# Stop dev server
# Ctrl+C

# Clean build
./gradlew clean

# Delete build artifacts
rm -rf build/
rm -rf app/build/
rm -rf .gradle/

# Clear JetStart cache
rm -rf .jetstart/

# Restart dev server
jetstart dev

Best Practices​

✓ DO:​

Logging:

  • Use jetstart logs in separate terminal
  • Filter logs by source/level for focus
  • Save error logs for issue reports

Development:

  • Test changes incrementally
  • Keep UI code separate from logic
  • Use Git commits frequently (easy rollback)
  • Test on both emulator and physical device

Debugging:

  • Read error messages carefully
  • Check documentation first
  • Search GitHub issues
  • Ask for help with complete error logs

✗ DON'T:​

Avoid:

  • Ignoring warnings (they become errors later)
  • Making 10 changes before testing
  • Debugging without logs
  • Assuming network "just works"

Don't:

  • Edit Gradle files without backing up
  • Force push to main branch
  • Delete .gradle folder while build running
  • Test on single device only

Debugging Checklist​

When stuck, go through this checklist:

Environment:

  • Node.js 18+ installed
  • Java 17+ installed
  • Android SDK installed
  • Emulator/device available

Network:

  • Dev server running (jetstart dev)
  • Phone and computer on same WiFi
  • Firewall allows ports 8765-8767
  • IP address hasn't changed

Project:

  • jetstart.config.json exists
  • app/build.gradle has applicationId
  • No syntax errors in code
  • Dependencies installed (npm install)

Logs:

  • No errors in jetstart logs
  • No build failures
  • Hot reload working (check logs)

Connection:

  • QR code displays correctly
  • Client shows "Connected"
  • WebSocket connection established

Getting Help​

1. Check Documentation​

2. Search GitHub Issues​

https://github.com/phantom/jetstart/issues

Search for error message or symptoms

3. Create Issue Report​

Include:

  • JetStart version: jetstart --version
  • Node version: node --version
  • OS: Windows/macOS/Linux
  • Complete error logs from jetstart logs
  • Steps to reproduce
  • Expected vs actual behavior

Example:

## Bug Report

**Environment:**
- JetStart: 0.1.0
- Node: 18.17.0
- OS: Windows 11

**Issue:**
Hot reload not working - always triggers full build

**Steps to reproduce:**
1. `jetstart create my-app`
2. `jetstart dev`
3. Edit MainActivity.kt
4. Save file
5. See full build instead of hot reload

**Logs:**

12:34:56 INFO [CORE] [FileWatcher] Change detected: MainActivity.kt 12:34:56 INFO [CORE] 📦 Non-UI changes detected, triggering full Gradle build


**Expected:** Hot reload (instant)
**Actual:** Full Gradle build (20s)

Learn more:

Troubleshooting:

CLI Reference: