ShareOS is a free, open source alternative firmware for the D-Link DNS-320L, DNS-320 (rev A/B) and DNS-325 (later perhaps more, e.g. the DNS-327L).
It is a fork of Alt-F by João Cardoso. All credit for the original design, the hardware support and years of work goes to the Alt-F project — see LICENSE and COPYING for the GPLv2 terms.
Built by an AI. Apart from importing Alt-F, ShareOS was developed by Claude (Anthropic): architecture, all code, builds, tests and docs. Jan started the project, made the decisions and tested on the real box. Timeline with timestamps and screenshots: docs/DEVELOPMENT.md (Deutsch).
Testing and installing: docs/TESTING.md (Deutsch). First sign-in:
http://<box-IP>/, user root, password shareos – the box asks you to set your own password right away (also for SSH). Translating the web interface: docs/TRANSLATING.md.
DNS-320L: the main device, tested on hardware with every release. More models from 0.2.0-beta.3: DNS-320 rev B, DNS-325 rev A, DNS-320 rev A – built; the DNS-325 rev A1 boots from flash (from 0.2.0-beta.9) and its buttons work (from 0.2.0-beta.10), the DNS-320 rev A/B are not tested yet; testers wanted: docs/DEVICES.md.
ShareOS runs from flash on the DNS-320L (kernel, initramfs and the system in
UBI with a persistent overlay for settings and packages). Test releases
(v0.2.0-beta.x, before that v0.1.0-beta.x; pre-releases, for test devices
only) are published on
GitHub Releases; a running
ShareOS updates itself from there.
ShareOS is built on a current, maintainable base while keeping what made Alt-F easy to use: the stock U-Boot and the stock flash layout.
No serial console, no soldering; the data on the disks is not touched. Details and troubleshooting: docs/SWITCHING.md (Deutsch).
- From the latest release download the two files with your model's name (DNS-320L:
DNS-320L-rev-Ax; other models: docs/DEVICES.md):ShareOS-<version>-<model>.binandShareOS-<version>-<model>.sysupgrade.tar. - Keep the
.binof your current firmware (e.g. Alt-F) for the way back. - Copy the
.sysupgrade.tarto a USB stick (FAT32, exFAT or ext4) and plug it into the box. Without a stick the box downloads it from GitHub (network cable, DHCP). - Flash the ShareOS
.binon the firmware page of Alt-F or of the D-Link interface. Do not cut the power. - The box restarts and installs the system from the stick (orange USB LED blinks fast, a few minutes), then restarts once more into ShareOS.
- Open
http://<box-IP>/(orhttp://<device-name>.local/), sign in as root / shareos and follow the setup wizard; add your disks under Storage – the data stays.
Updates afterwards: System → Firmware (from GitHub, or the .sysupgrade.tar as a file).
- In ShareOS: System → Firmware → Install firmware file → choose the Alt-F
.bin→ Install. ShareOS checks the file (format, checksums, device) and reads it back after writing. - Restart: Alt-F starts, at the same IP address.
- Flash the same Alt-F
.binonce more on Alt-F's firmware page to get its add-on packages back. - To the D-Link firmware: from Alt-F, as with Alt-F itself (docs/SWITCHING.md).
If ShareOS does not start, U-Boot starts the D-Link rescue system ("mini firmware"), from which Alt-F can be flashed.
Version in brackets = first release with the feature.
Storage
- Setup wizard: one disk, two separate disks, a mirror (RAID 1), RAID 0 or JBOD (mdadm; RAID 0/JBOD from beta.9), optional swap partition per disk
- Take over disks with data from Alt-F or the D-Link firmware as they are, nothing erased (Speicher → Laufwerke → übernehmen, 0.2.0-beta.17)
- File system per volume: ext4 (recommended: owners, storage limit per user, personal folders, apps), Btrfs, exFAT, NTFS (beta.7), ext3, ext2, FAT32 (beta.9)
- Share rights are also set as POSIX ACLs on the share folders (ext4, Btrfs), so every program of a user is held to them, not only SMB (0.2.0-beta.6)
- Snapshots: dated states of shares, personal folders or whole drives on another drive (hourly to weekly, hard links like rsnapshot, keep the last N plus days/weeks/months), restore with the file browser (0.2.0-beta.6)
- SMART values and health, disk standby, RAID status with sync progress, repair a mirror with a new disk (beta.9), mount/unmount/remove volumes
- Disk health page: rating with reasons, SSD life left, all SMART attributes, short/long self-tests by hand or by schedule (0.2.0-beta.12)
- USB sticks and disks: mounted at
/mnt/usb-<name>when plugged in (FAT32, exFAT, NTFS, ext4, Btrfs), Safely remove, Format with exFAT, FAT32, NTFS or ext4 (beta.7)
Shares, users, files
- USB printers in the network: current printers without a driver (IPP over USB: AirPrint, Mopria, Windows), scanning over the network (eSCL), older printers over port 9100 (system app "printer", 0.2.0-beta.18)
- UPS over USB: charge and runtime, messages on a power failure, clean shutdown on battery (low battery, a percentage or minutes), other computers over the network (system app "nut", 0.2.0-beta.18)
- SMB 2/3 (ksmbd) and NFS v4 shares with read/write permissions per user and group, guest access optional; the crypto engine of the SoC computes the SMB 3 signatures (about three times as fast, 0.2.0-beta.17); compatibility mode up to SMB 2.1 for difficult clients (0.2.0-beta.17)
- Users and groups; one account for shares, web interface and apps; storage limit per user (ext4); import of Alt-F users with their passwords
- "My ShareOS": users with web access manage their own password, look, shares, storage, cloud and Paperless
- File browser in the web interface: admins for all drives and USB drives, users for their personal folder and the shares they have rights to (enabled per user; read-only shares stay read-only, also for apps); upload/download with progress, drag and drop, large files; trash per folder with restore and automatic emptying (0.2.0-beta.12)
Apps and integrations
- APPS area with a store from ShareOS-Apps – 38 web apps for files and office, media, network, security, development and everyday life: one-click install/update with SHA-256 check, own
.sapppackages, more catalogs, visibility per user/group; apps run on their own port (8081/8444) (beta.6) - App permissions: scheduled tasks (
cron) as a restricted app user, schedule editable in the interface (beta.7) - Open files from the file browser in apps (e.g. Webpad), save back; app SDK and ShareOS look for apps (
/_shareos/theme.css,/_shareos/app.js), apps inside the interface (permissionembed) (beta.9) - App permission
files: apps work with the folders of the box with the user's rights – ShareCommander (two-pane file manager), Webpad saves on the box; music and videos stream with seeking (beta.11) - System apps: native programs for the terminal from the store – nano, htop (0.2.0-beta.1); strace, iperf3 (0.2.0-beta.2); bash (0.2.0-beta.5); store in sections with search (0.2.0-beta.5)
- Feature lock 0.2.0-beta.2: faster interface (results kept between requests, store refresh in the background), smaller system without OpenSSL, GIO and unused tools
- App data per account in the browser, file dialog of the box for apps (WinWeb Player plays music from the box) (0.2.0-beta.1)
- Cloud sync with rclone (Nextcloud/WebDAV, S3, SFTP, Google Drive …) for the device and per user, with schedule and bandwidth limit (beta.4)
- Paperless-ngx: inbox folders per user or shared (e.g. for a scanner), upload through the Paperless API (beta.4)
- Installable as an app (PWA), status address for widget apps (beta.4)
- "Share with" on Android: the installed app saves shared photos, files and links into
Geteiltin the personal folder (0.2.0-beta.11) - Remote access with Tailscale (system app
tailscaled, starts by itself, admins only, permissiontailscalefor apps): the box in a tailnet without port forwarding, also behind DS-Lite (0.2.0-beta.7) - Monitoring with Zabbix (system app
zabbix-agent): the classic C agent in active mode, a few MB of memory, no open port, encrypted with PSK; SMART of every disk, RAID state, box temperature and fan as items with a Zabbix template – see docs/MONITORING.md (0.2.0-beta.15) - Download automation with autobrr (system app, one for the box, admins only, permission
autobrrfor apps): IRC announces and RSS feeds, matching torrents go to the Transmission of a chosen account (0.2.0-beta.9) - Apps keep their data on the box also for accounts without file access: a private folder per app and account (0.2.0-beta.9)
- Admins get a personal folder for apps too (their home, for root
home/rooton the apps drive), so app data no longer lands at the top of a drive (0.2.0-beta.10) - App permissions
sysinfo,netcheck,dockerandtuya(admins only): SysMon, HomePing, DockerDeck and TuyaPulse show real data – the box's values, checks from the box, Docker hosts of the homelab, Tuya devices locally without the cloud (0.2.0-beta.11) - App permission
notify: apps send messages through the box's notifications (web interface, e-mail, push) – from their scheduled tasks withshareos-app-notify, from the browser withShareOS.notify(admins); at most 20 an hour per app (0.2.0-beta.12) - File dialog of the apps with the personal folder and the user's shares, also for accounts without file access (0.2.0-beta.11)
- System apps declare their service in
app.json("service"), ShareOS starts and stops it through the firmware's controller; how to submit a system app:sysapps/README.md(0.2.0-beta.9) - Large system apps on the apps drive (link in
/opt), the flash stays free (0.2.0-beta.7) - Media server (DLNA/UPnP AV, MiniDLNA as a system app): TVs and players play music, videos and pictures from chosen shares (0.2.0-beta.6)
- VPN for the box in both directions (OpenVPN as a system app, app NetTunnel, admins only): as client with cleaned profiles, as server with its own CA and a ready-made profile per device; status chips of services and apps in the header (0.2.0-beta.6)
- Transmission with own torrents per user: system app
transmission-daemon, app permissiontorrent; apps bring the system apps they need ("requires") (0.2.0-beta.4) - Media jobs: FFmpeg as a system app, app permission
media– convert audio, change the container of videos, cut, in the background with the user's rights (MediaTranscoder) (0.2.0-beta.5)
Firmware and system
- Online updates from GitHub Releases: checked every 6 hours, SHA-256 verified, progress for download, check and installation (beta.1)
- First installation from the Alt-F or D-Link web interface: the
.binfetches the system from a USB stick or from GitHub (beta.7; tested on real hardware, step by step: SWITCHING.md · UMSTIEG.md) - Back to Alt-F (or any D-Link
.bin) from the firmware page, checked and read back (beta.7) - First-run assistant, network settings with automatic rollback, name via mDNS (
<name>.local), fallback address192.168.0.32without DHCP - HTTPS with a self-signed certificate that follows name and IP, own certificate possible; own certificate authority for the home network and Let's Encrypt over DNS (0.2.0-beta.18)
- Dynamic DNS: DuckDNS, dynv6, Cloudflare, No-IP or any dyndns2 address, IPv4 and IPv6 (0.2.0-beta.18)
- Power schedule: switch off and on per weekday (switching on through the wake-up alarm of the DNS-320L/320 rev B/327L; 0.2.0-beta.15; switching off works from 0.2.0-beta.17, the overview shows the date of the next switch-on)
- Start log: the logs of the last 3 starts are kept on the flash (System → Protokolle → Start-Protokoll), so a box that was unreachable after a start can be looked into afterwards (0.2.0-beta.15)
- Reset button: access reset (5–10 s: network, root password, certificate) or factory reset (≥ 15 s), USB button removes USB drives (beta.9) or copies them into a dated folder (0.2.0-beta.12); the buttons work again on the DNS-320L and DNS-325 (0.2.0-beta.10)
- Messages: RAID, volumes, temperature, SMART, updates, failed cloud jobs and app tasks – in the interface, by e-mail (SMTP) and push (ntfy, Gotify, webhook) (beta.9), Telegram bot (beta.12)
- Terminal in the browser (System → Terminal, root shell, beta.12); Apps, Cloud and Paperless can be switched off (beta.12)
- Services with autostart, fan curve and LEDs, logs, settings backup and restore (JSON, optionally AES-256), messages that can be closed
- Look: light/dark/system, accent colours, tiles or tables, per user; Appearance page in two columns on wide screens (0.2.0-beta.10)
- FAV APPS: favourite apps per account as an icon bar above the overview status, the installed apps and in Mein ShareOS (with names or icons only, 0.2.0-beta.10)
- Mein ShareOS: tab Einstellungen with look and password, storage as a table per drive with own use, limit and free space (0.2.0-beta.11)
- 10 languages: English, German, Chinese, Hindi, Spanish, French, Arabic (right to left), Bengali, Portuguese, Russian (beta.7; more: docs/TRANSLATING.md)
- Time: time zone, NTP on/off with own servers (e.g. the router), sync now, set the clock by hand; the battery clock follows (beta.7)
- SSH/SFTP (Dropbear), rescue system in the initramfs (SSH, flash tools)
| D-Link firmware (ShareCenter) | Alt-F | ShareOS | |
|---|---|---|---|
| Last release | 1.11 (last version listed for CVE-2024-3273); product end of life | 1.0 (Oct 2017); trunk r3935 (basis of ShareOS) | 0.2.0 betas (2026), updated continuously |
| Linux kernel | 2.6.31 ¹ | 3.10.32 (0.1RC4, 2014), 4.4.86 (1.0), 4.14.268 (trunk) | 6.18 LTS |
| Boot loader | Marvell U-Boot 1.1.4 | stock U-Boot (unchanged) | stock U-Boot (unchanged, never written) |
| Build system / toolchain | D-Link GPL sources, uClibc ¹ | buildroot 2009.08 fork, GCC 7.4, uClibc-ng 1.0.44 (trunk) | buildroot 2026.08.1 (BR2_EXTERNAL), GCC 15.3, musl 1.2.6 |
| System layout | own image formats | squashfs/jffs2, packages in the flash or on disk | squashfs in UBI + UBIFS overlay for settings and packages |
| SMB | Samba 3.x, SMB1 ¹ | Samba 3.6.25: SMB1 and SMB2 (1.0); Samba 4.15 as an optional package | ksmbd (in the kernel): SMB 2.1/3 |
| NFS | ¹ | nfs-utils | NFS v4 (nfs-utils 2.8) |
| SSH | none (only via fun_plug workarounds) | Dropbear (OpenSSH as a package) | Dropbear 2026.91, SFTP |
| Web interface | ShareCenter UI | BusyBox httpd + shell CGIs | uhttpd + ubus/rpcd (ucode), new interface, light/dark, per user |
| Configuration | own config files | many scattered files | UCI (OpenWrt style), backup/restore as JSON |
| Updates | manual upload of a .bin |
manual upload of a .bin |
online from GitHub Releases, verified, every 6 h checked |
| File systems | ext3/ext4; FAT32/NTFS via FUSE ¹ | ext2/3/4, FAT, NTFS (ntfs-3g), btrfs, LVM2 | ext4, Btrfs, exFAT, NTFS (kernel ntfs3), FAT32 |
| RAID | own metadata format ¹ | mdadm (RAID 0/1/5, JBOD), LVM | mdadm RAID 1 (mirror), RAID 0, JBOD |
| USB drives | mounted ¹ | mounted on plug-in | mounted on plug-in, safely remove, format (4 file systems) |
| Users and rights | users, groups, quota ¹ | users, groups, quota | users, groups, rights per share, storage limit per user, users with their own web area |
| Extensions | add-ons (discontinued) | ipkg packages with a web page | app store (ShareOS-Apps): web apps on their own port, system apps (nano, htop, strace, iperf3, bash, Transmission, FFmpeg, MiniDLNA, OpenVPN, Tailscale, autobrr) |
| Cloud / documents | – | – (single packages) | rclone cloud sync, Paperless-ngx inbox |
| HTTPS | ¹ | self-signed or Let's Encrypt | self-signed (follows name/IP) or own certificate |
| Security | unpatched remote code execution (CVE-2024-3273, CVE-2024-3274); D-Link advises to retire the devices | last release 2017; old kernel and Samba | current kernel and libraries, updates via GitHub |
| Install | factory | .bin via the D-Link/Alt-F web page |
.bin via the D-Link/Alt-F web page + system from USB stick/GitHub, or serial console; back to Alt-F from the web page |
¹ Details of the D-Link firmware are taken from vendor pages and community
reports and were not checked on a box. Alt-F data from its release notes
(legacy/alt-f/NEWS) and build configuration in this repository. Sources:
CVE-2024-3273,
D-Link storage security notice,
DNS-320L boot loader banners.
Installing: flash the ShareOS .bin from the Alt-F or D-Link firmware
page; ShareOS then installs its system from a USB stick or from GitHub by
itself (since 0.1.0-beta.7, tested on the DNS-320L). The way over the
serial console (TFTP boot) stays available. Back to Alt-F works from the
ShareOS firmware page. Details: docs/TESTING.md,
docs/HARDWARE-DNS320L.md. The backend can be run on
a build host with qemu (tests/run-stack-qemu.sh), the web interface with
sample data via tests/mock-ubus.py.
- Hardware tests of the current betas, then a public beta
- More native apps in the same store: system apps for the terminal (0.2.0-beta.1), Transmission (0.2.0-beta.4), FFmpeg (0.2.0-beta.5), the media server MiniDLNA and OpenVPN (0.2.0-beta.6), Tailscale (0.2.0-beta.7) and autobrr (0.2.0-beta.9) are there; next Syncthing …
- More of the app platform: "open with" defaults per file type
- Storage: LVM2; RAID 5 only makes sense with three or more disks (the DNS-320L has two bays)
- More devices: hardware tests of the DNS-320 rev A/B; the DNS-327L (Armada 370, ARMv7) needs its own kernel configuration and a tester (#61)
configs/ buildroot defconfigs (shareos_<board>_defconfig)
board/dlink/dns320l/ device tree, kernel fragment, rootfs overlay, image scripts
package/ ShareOS buildroot packages
src/alt-f-utils/ Alt-F device tools (MCU daemon, dns323-fw, sysctrl)
patches/ hashes/patches for buildroot packages
src/shareos-core/ backend: rpcd ucode plugin, updater, UCI defaults, init scripts
sysapps/ system apps (native programs and services) for the store
tests/ host and emulator tests (updater, network, users/shares, storage, cloud/Paperless, qemu stack), UI mock
scripts/ helper scripts
legacy/alt-f/ the original Alt-F tree, kept for reference
- Web apps (HTML/JS, run in the browser, use the app SDK) → ShareOS-Apps.
- System apps (native programs for the box, and services/daemons) → here,
in
sysapps/: they are built with the firmware's toolchain, and a service needs its controller in the firmware. The README there has an example of each kind.
See docs/BUILD.md. In short:
make dns320l
# -> output/dns320l/images/ShareOS-<version>-DNS-320L-rev-Ax.bin