Symlink do not sync from Linux to Termux but works the other way

Hi,

I am experiencing a problem syncing symlinks from Linux or FreeBSD to Termux.

To test I create on each platform, in a synced folder, a folder per os with a symlink:

Linux

❯ uname -a
Linux linuxbox 6.6.83 #1-NixOS SMP PREEMPT_DYNAMIC Thu Mar 13 11:58:41 UTC 2025 x86_64 GNU/Linux
❯ syncthing -version
syncthing v1.28.0 "Gold Grasshopper" (go1.23.7 linux-amd64) nix@nix 1980-01-01 00:00:00 UTC [noupgrade]
❯ mkdir created-on-linux
❯ touch created-on-linux/target
❯ ln -s created-on-linux/target created-on-linux/symlink
❯ ls -al created-on-linux/
total 8
drwxr-xr-x 2 xx users 4096 abr 14 10:04 .
drwxr-xr-x 3 xx users 4096 abr 14 09:56 ..
lrwxrwxrwx 1 xx users   23 abr 14 10:04 symlink -> created-on-linux/target
-rw-r--r-- 1 xx users    0 abr 14 10:04 target

FreeBSD

❯ uname -a
FreeBSD freebsdbox 14.2-RELEASE FreeBSD 14.2-RELEASE releng/14.2-n269506-c8918d6c7412 GENERIC amd64
❯ syncthing -version
syncthing v1.28.1 "Gold Grasshopper" (go1.22.11 freebsd-amd64) ports@freebsd 2025-01-31 14:28:28 UTC [noupgrade]
❯ mkdir created-on-freebsd
❯ touch created-on-freebsd/target
❯ ln -s created-on-freebsd/target created-on-freebsd/symlink
❯ ls -al ./created-on-freebsd
total 18
drwxr-xr-x  2 root wheel  4 Apr 14 10:07 .
drwxr-xr-x  4 983  wheel  4 Apr 14 10:06 ..
lrwxr-xr-x  1 root wheel 25 Apr 14 10:07 symlink -> created-on-freebsd/target
-rw-r--r--  1 root wheel  0 Apr 14 10:07 target

Termux

❯ uname -a
Linux localhost 6.1.131-android14-11-gedc743c140b3 #1 SMP PREEMPT Fri Apr  4 04:56:18 UTC 2025 aarch64 Android
❯ syncthing -version
syncthing v1.29.3 "Gold Grasshopper" (go1.24.1 android-arm64) builder@24fe6cf991b2 2025-03-12 13:18:33 UTC [noupgrade]
❯ pwd
/data/data/com.termux/files/home/shell/tmp/
❯ mkdir created-on-termux
❯ touch created-on-termux/target
❯ ln -s created-on-termux/target created-on-termux/symlink
❯ ls -al ./created-on-termux
total 7
drwx------. 2 u0_a165 u0_a165 3452 Apr 14 13:54 .
drwxr-xr-x. 5 u0_a165 u0_a165 3452 Apr 14 13:53 ..
lrwxrwxrwx. 1 u0_a165 u0_a165   24 Apr 14 13:54 symlink -> created-on-termux/target
-rw-------. 1 u0_a165 u0_a165    0 Apr 14 13:54 target

Now after sync, I see the symlinks being synchronized but the ones from Linux or FreeBSD to Termux. Termux to Linux or FreeBSD works fine. I do not see any error in the logs or the UI.

Linux

❯ tree
.
├── created-on-freebsd
│   ├── symlink -> created-on-freebsd/target
│   └── target
├── created-on-linux
│   ├── symlink -> created-on-linux/target
│   └── target
└── created-on-termux
    ├── symlink -> created-on-termux/target
    └── target

4 directories, 6 files

FreeBSD

❯ tree
.
├── created-on-freebsd
│   ├── symlink -> created-on-freebsd/target
│   └── target
├── created-on-linux
│   ├── symlink -> created-on-linux/target
│   └── target
└── created-on-termux
    ├── symlink -> created-on-termux/target
    └── target

4 directories, 6 files

Termux (this is where the problem is)

❯ tree
.
├── created-on-freebsd
│   └── target
├── created-on-linux
│   └── target
└── created-on-termux
    ├── symlink -> created-on-termux/target
    └── target

4 directories, 4 files

I searched for a reason both at the Termux and Syncthing levels. The only similar unresolved issue I could find is this one

I can confirm Termux support symlinks and I am on the main storage (no mounted, external or FAT fs)

❯ pwd
/data/data/com.termux/files/shell/tmp/

Any idea what could cause this? Could it be a bug? How can I investigate further?

Many thanks for your help

If it can help I added relevant debugging facilities on Termux and created a new symlink on FreeBSD

❯ mkdir created-on-freebsd-2
❯ touch created-on-freebsd-2/target
❯ ln -s created-on-freebsd-2/target created-on-freebsd-2/symlink

Those are some DEBUG logs on Termux (still no errors):

 ❯ cat log/syncthing.log | grep "created-on-freebsd-2/target"
[XXXXX] 2025/04/14 15:22:09.540753 events.go:335: DEBUG: log 176 ItemStarted map[action:update folder:xxxxx-xxxxx item:tmp/symlinks/created-on-freebsd-2/target type:file]
[XXXXX] 2025/04/14 15:22:09.562119 basicfs_watch.go:113: DEBUG: basic /data/data/com.termux/files/home/shell Watch: Sending tmp/symlinks/created-on-freebsd-2/target non-remove
[XXXXX] 2025/04/14 15:22:09.565576 events.go:335: DEBUG: log 178 ItemFinished map[action:update error:<nil> folder:xxxxx-xxxxx item:tmp/symlinks/created-on-freebsd-2/target type:file]
[XXXXX] 2025/04/14 15:22:09.566202 aggregator.go:188: DEBUG: aggregator/"shell" (xxxxx-xxxxx): Skipping path we modified: tmp/symlinks/created-on-freebsd-2/target
[XXXXX] 2025/04/14 15:22:09.567952 aggregator.go:296: DEBUG: aggregator/"shell" (xxxxx-xxxxx): Tracking (type non-remove): tmp/symlinks/created-on-freebsd-2/target
[XXXXX] 2025/04/14 15:22:09.568277 basicfs_watch.go:113: DEBUG: basic /data/data/com.termux/files/home/shell Watch: Sending tmp/symlinks/created-on-freebsd-2/target non-remove
[XXXXX] 2025/04/14 15:22:09.592558 folder.go:63: DEBUG: stats.FolderStatisticsReference.ReceivedFile: xxxxx-xxxxx tmp/symlinks/created-on-freebsd-2/target
[XXXXX] 2025/04/14 15:22:09.593234 events.go:335: DEBUG: log 179 LocalIndexUpdated map[filenames:[tmp/symlinks/created-on-freebsd-2/target] folder:xxxxx-xxxxx items:1 sequence:2932 version:2932]
[XXXXX] 2025/04/14 15:22:09.593633 events.go:335: DEBUG: log 180 RemoteChangeDetected map[action:modified folder:xxxxx-xxxxx folderID:xxxxx-xxxxx label:shell modifiedBy:YYYYYYY path:tmp/symlinks/created-on-freebsd-2/target type:file]
[XXXXX] 2025/04/14 15:22:09.633823 walkfs.go:84: DEBUG: walk: path=tmp/symlinks/created-on-freebsd-2/target
[XXXXX] 2025/04/14 15:22:09.634351 walk.go:457: DEBUG: walker/xxxxx-xxxxx@0x4000e891e0 checking: File{Name:"tmp/symlinks/created-on-freebsd-2/target", Sequence:0, Permissions:0644, ModTime:2025-04-14 15:21:59.868036702 +0100 WEST, Version:{[{XXXXXXX 1744640529} {YYYYYYY 1744640529}]}, VersionHash:, Length:0, Deleted:false, Invalid:false, LocalFlags:0x0, NoPermissions:false, BlockSize:131072, NumBlocks:0, BlocksHash:, Platform:{<nil> <nil> <nil> <nil> <nil> <nil>}, InodeChangeTime:1970-01-01 01:00:00 +0100 CET}
[XXXXX] 2025/04/14 15:22:09.634679 walk.go:468: DEBUG: walker/xxxxx-xxxxx@0x4000e891e0 unchanged: File{Name:"tmp/symlinks/created-on-freebsd-2/target", Sequence:2932, Permissions:0644, ModTime:2025-04-14 15:21:59.868036702 +0100 WEST, Version:{[{YYYYYYY 1744640529}]}, VersionHash:, Length:0, Deleted:false, Invalid:false, LocalFlags:0x0, NoPermissions:false, BlockSize:131072, NumBlocks:1, BlocksHash:d3bfe98e8f1ce891614854569a20f5f4508d6ab4025b872b7b3a8282ef75b12a, Platform:{<nil> <nil> <nil> <nil> <nil> <nil>}, InodeChangeTime:1970-01-01 01:00:00 +0100 CET}
[XXXXX] 2025/04/14 15:22:19.622081 walk.go:125: DEBUG: walker/xxxxx-xxxxx@0x400087e0b0 Walk [tmp/symlinks/created-on-freebsd-2/target] Matcher/[]@0x40003bf7a0
[XXXXX] 2025/04/14 15:22:19.624904 walkfs.go:84: DEBUG: walk: path=tmp/symlinks/created-on-freebsd-2/target
[XXXXX] 2025/04/14 15:22:19.625457 walk.go:457: DEBUG: walker/xxxxx-xxxxx@0x400087e0b0 checking: File{Name:"tmp/symlinks/created-on-freebsd-2/target", Sequence:0, Permissions:0644, ModTime:2025-04-14 15:21:59.868036702 +0100 WEST, Version:{[{XXXXXXX 1744640539} {YYYYYYY 1744640529}]}, VersionHash:, Length:0, Deleted:false, Invalid:false, LocalFlags:0x0, NoPermissions:false, BlockSize:131072, NumBlocks:0, BlocksHash:, Platform:{<nil> <nil> <nil> <nil> <nil> <nil>}, InodeChangeTime:1970-01-01 01:00:00 +0100 CET}
[XXXXX] 2025/04/14 15:22:19.625694 walk.go:468: DEBUG: walker/xxxxx-xxxxx@0x400087e0b0 unchanged: File{Name:"tmp/symlinks/created-on-freebsd-2/target", Sequence:2932, Permissions:0644, ModTime:2025-04-14 15:21:59.868036702 +0100 WEST, Version:{[{YYYYYYY 1744640529}]}, VersionHash:, Length:0, Deleted:false, Invalid:false, LocalFlags:0x0, NoPermissions:false, BlockSize:131072, NumBlocks:1, BlocksHash:d3bfe98e8f1ce891614854569a20f5f4508d6ab4025b872b7b3a8282ef75b12a, Platform:{<nil> <nil> <nil> <nil> <nil> <nil>}, InodeChangeTime:1970-01-01 01:00:00 +0100 CET}
localhost /data/data/com.termux/files/home
 ❯ cat log/syncthing.log | grep "created-on-freebsd-2/symlink"
[XXXXX] 2025/04/14 15:22:30.229925 events.go:335: DEBUG: log 196 LocalIndexUpdated map[filenames:[tmp/symlinks/created-on-freebsd-2/symlink] folder:xxxxx-xxxxx items:1 sequence:2933 version:2933]

I can only see there is a log of chat regarding the target file but only one regarding the symlink