NVIDIA Sync macOS 0.97.6: SSH works, but Sync daemon says “no Hostname defined”

Hi all,

I’m trying to debug a NVIDIA Sync issue after updating to NVIDIA Sync macOS 0.97.6.

Posting here in case anyone else has hit this or knows which config path the Sync daemon actually reads during Connect.

Summary:

  • DGX Spark is reachable over LAN.

  • Terminal SSH works.

  • SSH works using NVIDIA Sync’s own private key.

  • SSH works using NVIDIA Sync’s own ssh_config.

  • NVIDIA Sync state-store.json contains the hostname.

  • NVIDIA Sync ssh_config contains the hostname.

  • But when I click Connect, NVIDIA Sync fails with:

Unexpected Error: no Hostname defined for 'SparkLAN'

The same issue also happens with my original profile:

Unexpected Error: no Hostname defined for 'RawDGXSpark'

I have redacted usernames/IPs below.

Environment:

Client: macOS
App: NVIDIA Sync
NVIDIA Sync version: 0.97.6
NVIDIA Sync build: 0.97.6.2466
Device: DGX Spark
DGX hostname: spark-xxxx.local
LAN IP: 192.168.x.x
DGX user: <dgx-user>
Sync config path: ~/Library/Application Support/NVIDIA/Sync/config/

The issue started after updating NVIDIA Sync to 0.97.6. I did not intentionally change the DGX Spark SSH server configuration at the same time.

Initial recovery attempt:

rm -rf ~/Library/Application\ Support/NVIDIA/Sync/config/*
ssh-keygen -R 192.168.x.x
ssh <dgx-user>@192.168.x.x

This restored normal Terminal SSH, but NVIDIA Sync still failed.

I then verified SSH using NVIDIA Sync’s own private key:

ssh -i "$HOME/Library/Application Support/NVIDIA/Sync/config/nvsync.key" \
  -o IdentitiesOnly=yes \
  -o BatchMode=yes \
  -o ConnectTimeout=5 \
  <dgx-user>@192.168.x.x 'hostname && whoami'

Output:

spark-xxxx
<dgx-user>

I also verified SSH through NVIDIA Sync’s own ssh_config:

ssh -F "$HOME/Library/Application Support/NVIDIA/Sync/config/ssh_config" SparkLAN \
  'hostname && whoami'

Output:

spark-xxxx
<dgx-user>

For the fresh LAN-IP profile, NVIDIA Sync’s state-store.json contains:

alias: SparkLAN
hostname: 192.168.x.x
status: disconnected
error: Unexpected Error: no Hostname defined for 'SparkLAN'

NVIDIA Sync’s ssh_config contains:

Host SparkLAN
  ### CreatedBy: NVIDIA Sync
  ### UsedBy: NVIDIA Sync
  HostName 192.168.x.x
  IdentityFile "~/Library/Application Support/NVIDIA/Sync/config/nvsync.key"
  Port 22
  User <dgx-user>

But after clicking Connect, NVIDIA Sync’s log repeatedly shows:

timeout exceeded: connection refused
url: /status

Then the per-device daemon reports:

{
  "message": "daemon left an error message",
  "hostname": "SparkLAN",
  "details": "no Hostname defined for 'SparkLAN'"
}

followed by:

{
  "message": "could not verify that started daemon is up, stopping daemon",
  "error": "Unexpected Error: no Hostname defined for 'SparkLAN'",
  "alias": "SparkLAN"
}

Things checked/tried:

  • Verified direct SSH to LAN IP works.

  • Verified direct SSH to mDNS hostname works.

  • Verified SSH works with NVIDIA Sync’s private key.

  • Verified OpenSSH can use NVIDIA Sync’s own ssh_config.

  • Verified known_hosts contains the LAN hostname/IP.

  • Verified state-store.json contains the device hostname.

  • Verified Sync ssh_config contains HostName, IdentityFile, Port, and User.

  • Created a fresh manual LAN-IP profile called SparkLAN.

  • Tried both the original profile and the fresh LAN-IP profile.

  • Tried changing ssh_config field casing from Hostname to HostName.

  • Cleared only the cached error field in state-store.json and restarted Sync.

Additional note:

I found related forum posts about NVIDIA Sync, ssh_config, known_hosts, hostname/IP mismatch, and macOS daemon startup issues, but I could not find this exact “no Hostname defined” case.

Current conclusion:

This does not look like a DGX Spark reachability or SSH server issue, because SSH works with the same host/user/key outside the Sync UI.

It looks like the NVIDIA Sync per-device daemon is either not reading the same config that the UI writes, or is failing to parse/resolve the host alias during Connect.

Question for the community:

Has anyone seen NVIDIA Sync on macOS 0.97.6 report:

no Hostname defined for '<device alias>'

even though both state-store.json and NVIDIA Sync’s ssh_config contain the hostname?

Also, does anyone know whether the per-device Sync daemon reads:

~/Library/Application Support/NVIDIA/Sync/config/ssh_config

or normal:

~/.ssh/config

or state-store.json directly?

Any workaround would be appreciated before I try a full Sync reset.

The screenshot below shows the fresh LAN-IP profile “SparkLAN” failing with the same “no Hostname defined” error after clicking Connect.

Update: I found a workaround.

Workaround: create a fresh LAN-IP device in NVIDIA Sync, then make sure the same alias resolves correctly via normal ~/.ssh/config, not only via NVIDIA Sync’s generated ssh_config.

In my case, before the fix:

ssh -G SparkLAN

resolved incorrectly as:

user <mac-user>
hostname sparklan

Even though NVIDIA Sync’s generated ssh_config had the correct HostName.

I added this directly to ~/.ssh/config:

Host SparkLAN
  HostName 192.168.x.x
  User <dgx-user>
  Port 22
  IdentityFile "~/Library/Application Support/NVIDIA/Sync/config/nvsync.key"
  IdentitiesOnly yes

Then verified:

ssh -G SparkLAN
ssh SparkLAN 'hostname && whoami'

After that, NVIDIA Sync connected successfully.

state-store.json now shows:

alias: SparkLAN
hostname: 192.168.x.x
status: connected
homeDirectory: /home/<dgx-user>
error: None

So it looks like the Sync daemon may depend on normal ~/.ssh/config alias resolution during Connect, even when NVIDIA Sync’s own generated ssh_config contains the correct host entry.

Additional update on the Tailscale side:

This was working before the NVIDIA Sync 0.97.6 update on my setup.

The “Add to Tailscale” flow got past the SSH auth failure after I authorized NVIDIA Sync’s nvsync.key on the Spark.

In my case, nvsync.key.pub did not exist locally, and the Spark was not accepting nvsync.key for public-key SSH.

I generated the public key:

ssh-keygen -y \
  -f "$HOME/Library/Application Support/NVIDIA/Sync/config/nvsync.key" \
  > "$HOME/Library/Application Support/NVIDIA/Sync/config/nvsync.key.pub"

Then installed it on the Spark:

cat "$HOME/Library/Application Support/NVIDIA/Sync/config/nvsync.key.pub" | \
ssh <dgx-user>@192.168.x.x \
'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'

After that, key-based SSH worked:

ssh -i "$HOME/Library/Application Support/NVIDIA/Sync/config/nvsync.key" \
  -o IdentitiesOnly=yes \
  -o BatchMode=yes \
  <dgx-user>@192.168.x.x 'hostname && whoami'

Output:

spark-xxxx
<dgx-user>

Then NVIDIA Sync’s Add to Tailscale script completed with:

Confirmed: 192.168.x.x joined tailnet <tailnet-account>.
Setup complete.

However, NVIDIA Sync local state still shows:

tailscaleEnrolled: False

and the Tailscale tab remains blank.

Current state:

  • LAN connection via NVIDIA Sync works.
  • DGX Dashboard tunnel works.
  • Spark-side Tailscale enrollment script reports success.
  • NVIDIA Sync UI/local state still does not reflect the device as Tailscale-enrolled.

This looks like either a local Sync state refresh issue or a UI/state bug after successful enrollment.

Hello airawatraj,

I’m going to try to address all of you comments here. There are a couple of questions I have, especially about the order of operations (ordering of what you wrote vs order of actual execution)

To start with, NVIDIA Sync maintains its own “ssh_config” file, so that we can add, update, and remove without worry of interfering with any other SSH configurations. We do update “~/.ssh/config” to include an “Include” directive at the top that points to the NVIDIA Sync “ssh_config” file. Most of the NVIDIA Sync operations load the “~/.ssh/config” file (and follow the “Include” directives) so NVIDIA Sync can use user defined SSH configuration entries. The “state-store.json” file is used only by the NVIDIA Sync UI and has no direct effect on SSH connections.

Based on the initial error message “no Hostname defined” it looks like the “Include” directive in “~/.ssh/config” is missing, incorrect, malformed, etc. Can you please verify that there is an “Include /Users//Library/Application Support/NVIDIA/Sync/config/ssh_config” (or similar) line in “~/.ssh/config”. NVIDIA Sync should always ensure that it is there when it runs commands and this code path was updated in the latest release.

In your initial post you include some “Initial recovery attempt” commands. These will remove all of the NVIDIA Sync SSH configuration, including the NVIDIA Sync private key. You then go on to detail some manual commands you ran to test. These commands include reference to the NVIDIA Sync “ssh_config” and “nvsync.key” files, which if the “Initial recovery” commands were run would no longer exist. NVIDIA Sync will regenerate the private key and “ssh_config” file when you add a new device, but you don’t mention doing this. Can you confirm if the test commands were run before or after removing the files under “NVIDIA/Sync/config/”.

In your workaround follow up comment you run “ssh -G SparkLAN” and the output looks like what I would expect to see if the ssh command could not “Include” the NVIDIA Sync “ssh_config” file. Adding the config entry from the NVIDIA Sync “ssh_config” file into the “~/.ssh/config” file and things functioning again points to a problem with including the NVIDIA Sync “ssh_config” file.

In your additional update comment the need to authorize the NVIDIA Sync private key on the remote machine points to either the remote machine forgetting the authorization or the local private key being regenerated and no longer matching the previously authorized key. If you ran the “Initial recovery” commands the local NVIDIA Sync private key was removed. It is unclear to me if or when you added a new device to NVIDIA Sync, triggering it to regenerate it’s private key. (NVIDIA Sync doesn’t save the public key version because it loads it directly from the private key).

If you include the NVIDIA Sync log files (in “~/Library/Application Support/NVIDIA/Sync/logs/”) I’ll take a look and see if there is more details about the problems you are seeing.

I am tracking down the issue with NVIDIA Sync not recognizing that the remote machine was enrolled in Tailscale and will post an update when I have more information.

Thanks for the detailed explanation. To clarify the sequence of events and current state:

After NVIDIA Sync 0.97.6 stopped connecting, I initially ran:

rm -rf ~/Library/Application\ Support/NVIDIA/Sync/config/*
ssh-keygen -R 192.168.x.x
ssh <dgx-user>@192.168.x.x

I now understand this removed NVIDIA Sync’s generated ssh_config and nvsync.key.

After that, I re-added a fresh NVIDIA Sync device profile, which regenerated:

~/Library/Application Support/NVIDIA/Sync/config/ssh_config
~/Library/Application Support/NVIDIA/Sync/config/nvsync.key

The regenerated NVIDIA Sync ssh_config had a valid entry for the fresh SparkLAN profile, and this worked:

ssh -F "$HOME/Library/Application Support/NVIDIA/Sync/config/ssh_config" SparkLAN 'hostname && whoami'

However, before my workaround, normal OpenSSH resolution:

ssh -G SparkLAN

resolved as if SparkLAN were a literal hostname. I then added an explicit Host SparkLAN block directly to ~/.ssh/config, and NVIDIA Sync was able to connect.

Current ~/.ssh/config is now modified by that workaround, so it is not a clean reproduction of the original failure anymore. The manual block is now masking the original include behavior.

Your explanation about the regenerated nvsync.key also matches what I observed. Since I deleted the NVIDIA Sync config directory early in the process, the regenerated nvsync.key no longer matched what the Spark had previously authorized. That explains why the Tailscale enrollment flow later failed public-key SSH.

I fixed that by deriving the public key from the regenerated private key:

ssh-keygen -y \
  -f "$HOME/Library/Application Support/NVIDIA/Sync/config/nvsync.key" \
  > "$HOME/Library/Application Support/NVIDIA/Sync/config/nvsync.key.pub"

Then I installed it on the Spark:

cat "$HOME/Library/Application Support/NVIDIA/Sync/config/nvsync.key.pub" | \
ssh <dgx-user>@192.168.x.x \
'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'

After that, key-based SSH worked, and NVIDIA Sync’s Add to Tailscale script progressed and reported:

Confirmed: 192.168.x.x joined tailnet <tailnet-account>.
Setup complete.

Current state after reboot:

  • SparkLAN connects successfully through NVIDIA Sync.

  • DGX Dashboard works through the local tunnel at localhost:11000.

  • nvsync.key public-key SSH works.

  • The Tailscale enrollment script reported success on the Spark side.

  • NVIDIA Sync still shows tailscaleEnrolled: False.

  • The Tailscale tab remains blank.

  • Trying the Tailscale IP profile directly currently gives dial tcp 100.x.x.x:22: i/o timeout.

Normal macOS Terminal also cannot reach that 100.x.x.x address. I’m not sure whether NVIDIA Sync’s embedded Tailscale is intended to expose that route to the OS, or whether that path is intended to be internal to NVIDIA Sync only.

Based on the current state, I think there are two separate areas:

  1. The initial “no Hostname defined” issue may have involved NVIDIA Sync SSH config/include resolution, but my later manual Host SparkLAN workaround means I no longer have a clean reproduction of that original state.

  2. The Tailscale enrollment SSH-auth issue was caused by the regenerated nvsync.key not being authorized on the Spark. After fixing that, the Spark-side enrollment script reported success, but NVIDIA Sync local UI/state still does not mark the device as Tailscale-enrolled.

I’m attaching a filtered/redacted log excerpt with local usernames, account identifiers, auth keys, exact LAN IPs, exact Tailscale IPs, hostnames, and UUIDs redacted.

nvidia-sync-public-forum-log-excerpt-redacted.txt (273.2 KB)