Aug 24, 2026 · Troubleshooting · About 8 min

v2rayNG Core Won’t Start? Fix Config Errors Using the Logs

Check the client logs for JSON syntax errors, misspelled fields, inbound port conflicts, and missing outbound parameters to pinpoint the faulty config line.

At a glance

This guide is for cases where v2rayNG stops immediately after you tap Start, reports that it couldn’t load the config, or won’t run after importing a custom config. Save a complete startup log first, then check parsing, fields, listeners, and outbound settings in that order. For a regular subscription node, fix fields in the node editor; inspect the JSON directly only for custom configs. Reinstalling the client shouldn’t be your first step.

Open the logs first: distinguish startup failures from connection failures

Open the side menu from the top-left corner of the v2rayNG home screen and select “Logs.” Stop the service, clear the old logs, return to the home screen, select the failing node, and start it once. Then reopen “Logs” and save the complete record from that startup attempt. Menu locations can vary between versions; use the “Logs” item shown in your app. Don’t capture only the final “startup failed” line—the cause is often above it.

  1. Back up the original config

    Note the node name and config type. Save a copy of any JSON you maintain manually. For subscription nodes, note the group they belong to so a later update doesn’t overwrite your temporary changes.

  2. Record your environment

    Note the client version under “About” in the side menu. If the startup log shows the Xray version, save that too. The client version and core version are separate numbers.

  3. Reproduce the issue once

    Stop the service and clear the logs, then start it once. If Android asks for VPN permission, grant it first so a canceled permission prompt isn’t mistaken for a config error.

  4. Follow the error chain

    Read past failed to load config or failed to start. If the error has multiple layers, keep going until you find the specific field, port, or JSON parsing hint.

If the log has reached the stage where it accepts requests and only then shows connection refused, i/o timeout, or a certificate handshake error, the problem is usually with the connection—not core startup. Repeatedly changing JSON punctuation won’t fix an unreachable remote port or a certificate mismatch.

Config parsingBuilding settingsLocal listenerRequest routingRemote connection

If one of the first three stages fails, focus on the config and ports covered here. If either of the last two fails, check routing, DNS, node reachability, and TLS. Log wording varies by Xray version; the examples below are common snippets, not exact full-line matches.

1. JSON syntax errors: check brackets and data types first

If a custom config won’t start right after you paste it, check the JSON first. Object keys and string values must use straight double quotes. Don’t leave a trailing comma after the last item in an object or array. To avoid parser differences while troubleshooting, use standard JSON with no comments.

Error: invalid character '}' looking for beginning of object key string

Cause: There may be an extra comma before the end of an object, where the parser is still expecting another key. Fix: Check the item immediately before the reported position, remove any trailing comma, and make sure there are no extra closing braces.

Error: unexpected EOF

Cause: The content was cut off before an object, array, or string was complete. Fix: Check the copied range and restore the missing content; don’t just add a closing bracket to the end of the file.

Error: cannot unmarshal string into Go struct field

Cause: The field’s type doesn’t match what the core expects. Fix: Read the field path that follows the error and change the value to the required type: a number, boolean, array, or object.

This partial object illustrates JSON syntax; it is not a complete proxy config you can import. port is a number, listen is a string, and the last item has no trailing comma. When you find a type error, fix fields one by one instead of converting every number to a string.

{
  "listen": "127.0.0.1",
  "port": 10808,
  "protocol": "socks"
}

2. Misspelled fields: valid JSON doesn’t guarantee a valid config

Once the syntax is valid, check field names, nesting, and allowed values. The top level usually contains two arrays, inbounds and outbounds, not singular names. Transport settings go under streamSettings, and network must be set to a value supported by the core. Field-name capitalization matters.

Error: unknown transport protocol: websoket

Cause: The transport protocol name isn’t a recognized value. Fix: Set streamSettings.network to match the server. For a WebSocket server, use ws.

Also note that some unknown fields may be ignored instead of triggering a “misspelled field” error. So the absence of syntax errors doesn’t prove that a setting took effect. For a regular node, return to the home screen, open the node editor, and check the address, port, protocol, and transport settings one by one. Don’t convert the entire node to custom JSON just to fix one field.

3. Inbound listener conflicts: check the address and port

If the log shows bind: address already in use, the local listening endpoint is already occupied. This is a port conflict on your device, not a connection refused by the node server. Stop other proxy services first, then check whether your custom config declares the same listening address, port, and transport protocol more than once.

10808
Example: a local TCP port in use
10818
Example: an alternative port to try after confirming it’s free
1–65535
Valid port range; manual local listeners typically use higher-numbered ports

These numbers illustrate the troubleshooting process; they aren’t default values for every version. For a regular config, look for the local SOCKS port under “Settings” in the side menu. After changing it, stop and restart the service; the exact label may vary by version. For custom JSON, check listen and port in the actual inbounds entry. Don’t assume the general settings override a custom config.

Error: listen tcp 127.0.0.1:10808: bind: address already in use

Cause: Another listener is using this TCP endpoint. Fix: Stop the service using it, or switch to a higher-numbered port you’ve confirmed is free. Then update any apps where you manually entered this proxy port.

Bottom line: change the local port, not the node’s port

If the log mentions listen and bind, start by fixing the local inbound. Don’t also change the remote server port to 10818; it must match the port the server actually listens on.

0.0.0.0 means the listener binds to all interfaces, which may conflict with a specific IPv4 address using the same port. Whether two inbounds conflict also depends on TCP versus UDP and the address family—not just the port number. Don’t enable LAN access just to work around the issue; it makes your local proxy accessible to more devices.

4. Missing outbound parameters: check the required fields for the protocol

The outbound determines which server to connect to, which protocol to use, and how to authenticate. Common VMess and VLESS JSON outbounds define the server under settings.vnext and the user under users. Trojan typically uses settings.servers. Mixing fields from different protocols can make outbound creation fail, even when the JSON is valid.

ProtocolConfig path to check firstCommon issues
VMesssettings.vnext[].address / port / users[].idEmpty address, missing port, or invalid user ID
VLESSsettings.vnext[].users[].id / encryptionInvalid UUID; for standard configs, encryption should be none and must meet the current core’s requirements
Trojansettings.servers[].address / port / passwordUsing the wrong vnext structure, or missing the password or server address

Error: invalid UUID

Cause: The user ID can’t be parsed in a format accepted by the core. Fix: Copy the full ID again from the original node details. Check for spaces, truncation, or full-width characters; don’t make up a new ID to replace the account issued by the server.

Error: failed to build outbound handler

Cause: This is a high-level message indicating outbound creation failed; it doesn’t identify the missing parameter on its own. Fix: Read the nested error and check the server list, user settings, and transport settings for the specific protocol.

The connection address, TLS server name, and WebSocket Host serve different purposes; don’t swap them just because they all look like domain names. With VLESS and REALITY, also check the public key, server name, and other parameters against the server configuration. Field names and support depend on the core version in use. Ask the configuration provider about missing values instead of copying them from another node.

Restart after each change and keep a record you can roll back

Change one type of issue at a time, then stop and restart the service and check the new logs. Fix syntax first, then fields and parameters, and finally confirm the listener starts successfully. If you change the port, DNS, protocol, and routing all at once, it’s hard to tell which fix worked—even if the connection comes back.

If the core has started but Android VPN hasn’t been established, check system permissions and other apps currently using a VPN. Android typically allows only one active VPN per user profile. Troubleshoot this as a system VPN issue; there’s no need to keep changing UUIDs or disable certificate verification.

Download clientsv2rayNG / v2rayN