What's Changed
Added
- Automatic port forwarding (PCP + UPnP IGD). A LAN device can now open and
renew its own port forwards using the standard PCP and UPnP protocols —
StartOS servers use this to configure themselves automatically behind a
StartWRT router, and game consoles/torrent clients are covered too.
Authorization is per-device and off by default: enable it with the new
"Allow automatic port forwarding" toggle on the device's detail page. A
device can only ever forward ports to itself — and because PCP runs over UDP,
a request is honored only when it actually arrives from the network the
device lives on, so a device on one network can't open forwards on behalf of
a device on another. Requests that would take
over a manually published port are refused (conversely, publishing a port an
automatic forward holds removes the automatic forward — manual rules win).
Ports the router itself answers on from the internet are refused too, so an
automatic forward can never take over your remote access to the router, its
SSH, or a VPN server you've exposed.
Forwards are stored as tagged UCI firewall redirects (so they survive
reboots and never collide with manual published-port rules), renew on an
in-memory lease (no flash writes on renewal), and expire on the lifetime the
device requested when it stops renewing them — at most a week, even for a
device that asks to hold the port indefinitely. A forward is also removed
once the device no longer holds the address it points at — its DHCP lease
lapsed, or it returned on a different address — so a forward can never
quietly deliver Internet traffic to whichever device is given that address
next (devices with a reserved address are unaffected). Turning the toggle
back off — or forgetting the device — closes that device's forwards and
hostname routes immediately.
The Published Ports page gains a read-only "Automatic" section showing each
port use's device, kind (PCP, UPnP, or SNI), and expiry. UPnP clients see a complete gateway:
the router advertises theWANCommonInterfaceConfigservice clients use to
recognize an Internet Gateway Device, answers the status actions they check
before mapping anything, and supports reading mappings back
(GetSpecificPortMappingEntry/GetGenericPortMappingEntry) — a device sees
only its own. The router identifies itself as "StartWRT" to those clients. The
UPnP endpoints refuse browser-shaped requests — DNS-rebinding requests and
blind cross-origin writes alike — so a malicious web page cannot use a LAN
device's browser to read the network's public IP, fingerprint the router, or
open that device's ports. Uses the sharedstart-corePCP/IGD server cores.
Devices can also register SNI hostname routes on a shared external port
(over PCP's HOSTNAME extension or theX_START9_AddHostnameMappingUPnP
vendor action): the router reads each TLS connection's requested hostname
and delivers it to whichever device owns it, so several devices — or several
services on one StartOS server with their own domains — share one port such
as 443. Hostname routes appear in the Automatic section with their hostname,
follow the same per-device permission and lease expiry as plain forwards,
claim their shared port whole (plain forwards on it are refused; ports the
router itself answers on — SSH, an inbound VPN — are refused to hostname
routes for the same reason), and are re-registered by the device within
minutes after a router restart rather than persisted. Remote access to the
router's own web interface is the exception, not a casualty: hostname
routes and remote access share port 443 — connections naming a routed
hostname reach its device, and everything else (such as browsing the
router by IP address) still reaches the router interface, accepted from
exactly the sources your Remote Access setting allows, so enabling one
feature never silently disables the other.
A routed hostname works from inside your own network too — a laptop on your
LAN can open the same public address and reach the device — with one
consequence worth knowing: because the device answers a local client
directly rather than through the router, the router puts its own address on
those connections, so the device cannot tell one local client from another
in its logs. Connections from another Security Profile, and from the
Internet, still carry the original address. - The UI now detects when the running firmware ships a newer interface than
the page is displaying (every RPC response andsystem.inforeport the
firmware's build stamp and the UI compares it to its own). An update
installed from the current tab reloads the page automatically once the
router is back (the "Updated to vX" confirmation follows after login); an
update applied any other way — CLI deploy, another device — shows a
"Refresh Needed" dialog with a Reload button rather than reloading out from
under unsaved work. Detection rides anx-startwrt-git-hashheader on every
RPC response, so an open tab notices within seconds of its next request even
when the update restarted the daemon too quickly to drop a connection; pages
that make no requests while idle re-check every 30 seconds. - Devices that never share a hostname are now identified by operating
system or hardware vendor instead of a meaningless placeholder. Some
devices deliberately withhold their name from the router — Chromebooks
never send one, and many IoT gadgets can't — and previously showed up as an
opaquedevice-3af2b1. The device list now recognizes the operating system
from how the device requests a network address (its DHCP fingerprint), e.g.
Windows device (3af2b1), or failing that the vendor behind its MAC
address, e.g.Apple device (3af2b1)— keeping the short suffix so
identical unnamed devices stay distinguishable. OS recognition works even
for devices using randomized Wi-Fi addresses, survives reboots, and a real
hostname, when one ever appears, still takes over automatically; names you
assign always win. - 6in4 tunnels can now be configured on the router. The
6in4protocol
and the SIT kernel module it needs now ship in the image, so an IPv6 tunnel
from a broker such as Hurricane Electric can be set up over SSH — useful for
reaching IPv6 on an ISP that provides none. There is no UI for this yet.
Previously these packages had to be built and sideloaded by hand after every
update, since a sysupgrade does not preserve separately installed packages. - eMMC boot firmware provisioning. The flash wizard, in-app updates, and a
check on every boot now converge the eMMC hardware boot partitions
(boot0/boot1) to the release's ownbootinfo+ FSBL (u-boot SPL, built from
the pinnedspacemit-com/uboot-2022.10source). Previously only vendor
factory tooling ever wrote boot0, so a DIY BananaPi BPI-F3 whose factory left
it empty (or carrying an incompatible bootloader vintage) completed the setup
wizard but could not boot from eMMC once the microSD card was removed. Writes
are idempotent (byte-compared, skipped when already current), read-back
verified, and ordered for power-cut safety (boot1 mirror first, the
single-sector bootinfo header last); boards already carrying the current
firmware are not touched. The boot-time check makes provisioning effective
from the first boot after installing this release and self-heals damaged or
interrupted boot firmware thereafter. Thebootinfo_emmc.binblob now ships
in the image's bootfs partition to support this. - The firmware image now ships MediaTek MT7915 Wi-Fi firmware alongside the
MT7916 firmware. MT7915-based mini PCIe modules (such as the AsiaRF
AW7915-NP1) previously failed to initialize on DIY builds: the driver was
present but the firmware files were not, so no Wi-Fi radio ever appeared.
Note that MT7915 band-selectable cards operate one band at a time — with the
stock configuration the 2.4 GHz network comes up — unlike the
dual-band-concurrent AW7916-NPD module shipped in Start9 routers. - Hardware documentation. A new Hardware page in the user guide lists the
router's specifications and publishes the SpacemiT K1 reference schematic the
board descends from, noting where the shipped router differs from that
reference design and why. - The StartWRT user guide is now published at
docs.start9.com/start-wrt.
Changed
- Publishing a port the router itself answers on now asks for confirmation.
Ports the router serves from the internet — remote access to its web
interface and SSH (80/443/22, including "When behind NAT" mode while the
router sits behind another router) and an inbound VPN's listen port —
previously could be published to a device without warning, silently cutting
that router service off from outside your network. Saving such a rule now
surfaces the conflict in a confirmation dialog; you can still publish the
port deliberately, and you're asked once per rule — again only if you
change which port that rule publishes, or its protocol. Detection follows
the live configuration (nothing is asked for ports no router service uses) and
matches transports, so e.g. a UDP-only forward on 443 doesn't warn. - The firmware build stamp is now identical everywhere it appears: the
startwrtbinary (UIETag,system.info,startwrt verify) now carries
the same full-hash-modified-suffixed stamp the Settings → General
Build field bakes in viaconfig.json, instead of a separate
short-hash-dirtystamp.
Removed
-
The IPv6 "Reserve" option has been removed — it never worked and never
could. Devices choose their own IPv6 addresses via SLAAC, so a router
cannot reserve one; the toggle wrote a DHCPv6 hint that no mainstream
client ever requests. The device page now shows the IPv6 address read-only
with an explanation, publishing a port no longer claims the IPv6 address
"will be reserved" (the rule follows the device's current address
automatically), and the LAN IPv6
SLAAC toggle now locks while enabled published-port rules use IPv6 rather
than when "reserved" devices exist. Thedevices.updateRPC no longer
acceptsipv6_static/ipv6fields. IPv4 reservations are unchanged. -
The Start9 DDNS provider option has been removed. The Start9 DDNS
service has not launched yet, so selecting it saved a configuration that
could never update a DNS record. Configurations previously saved with the
Start9 provider now read back as Dynamic DNS disabled; pick one of the
supported providers to re-enable. The option will return when the Start9
service goes live.
Fixed
-
The WAN IPv6 "6RD" mode now works. Selecting it wrote a valid
configuration, but the image shipped without the6rdprotocol handler or
the SIT kernel module it depends on, so the WAN interface simply came up
without IPv6 — with nothing in the UI to indicate why. Both now ship. -
Disabled outbound VPNs are no longer offered as a Security Profile's
outbound route. The VPN picker on the profile's WAN / Internet tab listed
every VPN, including disabled ones — and picking one silently cut that
profile off the Internet, since a disabled VPN's tunnel never comes up. The
picker now lists only enabled VPNs, and the router refuses a profile pointed
at a disabled — or nonexistent — VPN, so the command line can't create the
same dead end.The same applied to VPN chaining, where it was quieter and worse: a disabled
VPN could be picked as another VPN's Connects to target, and the chain
then silently collapsed to a single hop. The downstream VPN connected
normally — straight out your Internet connection instead of through the VPN
you chained it to — and every screen reported success. Disabled VPNs are no
longer offered as chain targets, and the router rejects one outright. -
The bottom of the screen is no longer cut off on shorter displays. On
screens shorter than a page's contextual help content, the sidebar's
Collapse button and the bottom of the page — including a form's Cancel/Save
buttons, even when scrolled all the way down — were clipped, whether or not
the help panel was open. The layout now always fits the screen exactly, and
long help content scrolls within its panel. -
A narrow window no longer cuts off the right side of the page. Below
the mobile-layout width, page content is laid out at the width the collapsed
sidebar leaves free; with the sidebar still expanded, that layout ran under
the window's right edge — hiding a form's Cancel/Save buttons and other
right-edge content — with no way to scroll to it. The sidebar now collapses
automatically when the window becomes that narrow (and re-collapses after
navigating on a phone), and expanding it by hand at that width now shows a
horizontal scrollbar, so everything stays reachable either way. -
Changing a published port no longer briefly drops the firewall. Applying
a port-forward change restarted the firewall, which tears the whole ruleset
down and rebuilds it as two separate steps — for a moment in between, the
router had no firewall and no NAT, and connections started in that window
were unfiltered. It now reloads instead, applying the new ruleset in a single
atomic step with no gap, and a ruleset that failed to build leaves the
running one untouched rather than leaving nothing in place. -
Enabling LAN IPv6 no longer silently fails when the Admin profile routes
through an IPv4-only VPN. Saving the LAN IPv6 settings reported success
but immediately reverted to disabled: the save re-derived the admin LAN's
router advertisements from whether its outbound VPN carries IPv6, undoing
the change in the same write. Editing the Admin profile onto an IPv4-only
VPN likewise switched LAN IPv6 off behind your back — and kept it off even
after switching the outbound back. The LAN IPv6 toggle is now the sole
owner of that setting; with an IPv4-only VPN outbound, LAN devices still
get local (ULA) IPv6 addresses while internet-bound IPv6 remains blocked
by the VPN kill switch, so nothing leaks around the tunnel. That same
fault could also leave a router where the LAN IPv6 page read "Disabled"
while individual Security Profiles carried on handing out IPv6 addresses —
the page and the network disagreeing, with no way to bring them back into
line. Routers left in that state are now repaired automatically on the
first start after updating, which turns IPv6 off for those profiles too;
turn it back on from the LAN IPv6 page if you want it, and this time it
applies everywhere at once. -
Turning IPv6 off now tells your devices to drop their IPv6 addresses.
Devices choose their own IPv6 addresses from a prefix the router advertises,
and the only way to take one back is to advertise it one last time as
expired. The router was restarting its advertisement service instead of
reloading it, which skips that goodbye entirely — so after disabling IPv6
(on the LAN, on a Security Profile, or on the WAN) devices carried on using
addresses that no longer worked, for up to 90 minutes, until the addresses
timed out on their own. The notice is now sent while the prefix is still
live. A device that is asleep or misses the notice still falls back to the
timeout. -
The Devices list no longer shows IPv6 addresses a device has given up.
The router remembers a neighbouring address long after the device stops
using it, so a device could keep displaying an IPv6 address for hours after
it dropped it — most visibly after turning IPv6 off, where the address on
screen suggested nothing had changed. The router now confirms the device
still answers on an address before showing it, and leaves the field empty
when it does not. -
Published ports no longer reshuffle their order on every refresh. The
list is auto-refreshed every few seconds, and each refresh returned the
rows in an arbitrary order, so the table visibly jumped around. Published
ports now appear in a stable order, sorted by label. -
A device that missed its one chance to share its name over mDNS/Bonjour is
no longer stuck with a generic label until the router reboots. The name
lookup was attempted exactly once per device, and it usually fired at the
worst moment — the instant the device first appeared (before its Bonjour
service finished starting), or during the reconnection rush right after a
router reboot — and sleeping phones and laptops don't answer at all. The
router now retries silent devices on a backoff schedule (about a minute
after the first miss, stretching to a day) before concluding the device has
no name to share; a device that answers is remembered permanently. -
IPv6 published-port rules now follow the target device when it changes
its address. Devices assign their own IPv6 addresses and change them
routinely — privacy addresses rotate daily, and most operating systems
derive new addresses whenever the ISP rotates the delegated prefix — but
rules were only re-resolved on a prefix change, so a device-side change
silently broke the forward. The router now watches the network for
neighbor changes and retargets affected rules within seconds. Rules also
now pin the device's long-lived (stable) address instead of whichever
address happened to be observed first, which could be a short-lived
privacy address that expired within days. The Endpoints column shows
that same stable address, so the endpoint you copy always matches the rule. -
Browsers could keep serving a stale, cached copy of the web UI after a
firmware update — the router previously sent no cache headers, leaving cache
behavior to per-browser heuristics (Firefox/Safari could silently run an old
UI against the new backend). The embedded UI is now served with explicit
headers: stable-named files (index.html,assets/) revalidate on every
load against a per-buildETag(a cheap304 Not Modifiedwhen unchanged),
while Angular's content-hashed bundles are cached asimmutable. Requests
for assets from an older build now get a404instead of a mis-typed
index.htmlfallback. -
The "Updated to vX" confirmation shown after a firmware update is now
translated instead of always appearing in English. -
Documentation corrected against the code in a full docs-vs-code audit. The
user guide no longer misstates product behavior: backups do preserve assigned
device names and data-usage history; a Fresh Start reflash sets a new admin
password rather than clearing it; published-port statuses do not detect CGNAT;
Ethernet profile changes apply immediately (there is no Save button); inbound
VPN client configs must be captured when the client is created (the private
key is never stored). Also refreshed drifted UI labels throughout the guide,
correctedAPI_CONTRACT.mdwire types and documented the previously missing
endpoints, and fixed stale paths, commands, and structure descriptions across
the developer docs. -
Cloudflare Dynamic DNS now saves a working configuration. The saved
config was missing fields the update client requires (the Bearer-token
marker and the zone), so Cloudflare updates could never succeed. The form
now asks for the Zone — the domain registered with Cloudflare, e.g.
example.com— instead of a Zone ID. Previously saved Cloudflare
configurations must be re-saved with the zone filled in. Note that the
DNS record must already exist in Cloudflare (the client updates records,
it does not create them), and the API token needs Zone:Read and DNS:Edit
permissions. Proxied (orange-cloud) records are supported: the client
reads the registered IP through the Cloudflare API rather than DNS, which
would only ever see the proxy's address. -
Dynamic DNS now actually updates your provider. The image was missing
theddns-scriptsupdate client (and its Cloudflare and No-IP extensions),
so DDNS settings were saved but no DNS record was ever updated. The FreeDNS
provider also pointed at a service name (freedns.afraid.org) that modern
ddns-scriptsno longer recognizes; it now uses the afraid.org update-key
service (afraid.org-keyauth), and configurations saved with the old name
are still read back correctly. DDNS configurations are also bound to the
WAN interface, so an update fires the moment the connection comes back up
(e.g. after a modem reboot or PPPoE reconnect) instead of waiting for the
next scheduled check. -
Published Ports endpoints no longer disappear when a WAN setting can't be
read. A network interface hand-configured with a protocol StartWRT doesn't
manage (e.g. a6in4tunnel onwan6) made the WAN/LAN IPv6 settings
endpoints error, and the Published Ports page treated that one failure as
fatal — every port's IPv4 endpoint showed—even though the forwards were
active. Unmanaged protocols now read back gracefully (reported as IPv6
disabled) and are preserved untouched on disk, and the page now loads each
WAN setting independently, so one failure can no longer blank out the
endpoint list. -
A published port is now reachable from your other Security Profiles at the
router's public address. Reaching a published port by the router's public
address — or a domain name pointing at it — rather than the device's LAN
address only worked from the target device's own profile. From any other
profile the router answered instead of the published service, so an app or
bookmark holding a public address worked on one network and not another. A
published port is a public resource, so those connections are now delivered
to the device from every profile that could reach it from the Internet and
from every profile with Access to the device's profile — and from those only.
A profile could reach it from the Internet when its WAN Access is All, a
Blacklist that does not block the router's public address, or a Whitelist
that includes it, outside any blackout window. The routes follow your
Security Profile settings and your public address as they change, apply to
the device's global IPv6 address as well (where a Whitelist or Blacklist
entry counts by the device's address), and cover ports opened through
automatic port forwarding (UPnP/PCP) the same way. Nothing else on the device
is opened: a profile without Access still cannot reach it at its LAN address
or on any other port.
Security
- A published port restricted by Source is no longer reachable from your own
network at the router's public address. The restriction applied to
connections arriving from the Internet, but a device on your own network
could reach the port through the router's public address regardless of it.
Restricted rules are no longer served that way; reach them from inside your
network at the device's own LAN address.
Image Downloads
StartWRT Checksums
SHA-256
98c11d0d7890b795c2942bec25b352d4e103226e2aebc8478589a4f2f1452e9e startwrt-1.1.0-88e5752_spacemit-k1-sdcard.img.gz
3791b4a6ec5dc07aed17e6520341d875e377ce6556f3e9d32c43c8e37d87a5d1 startwrt-1.1.0-88e5752_spacemit-k1-sysupgrade.img.gz
BLAKE-3
3bcf31a86f9df4c8d3293e19fd9e63c0dcf01b57e457b6a9b25f9991ae5195fa startwrt-1.1.0-88e5752_spacemit-k1-sdcard.img.gz
d2242ae3a49151bc243dc1aa276172e970619d9cbc482a3ec48855a32e975924 startwrt-1.1.0-88e5752_spacemit-k1-sysupgrade.img.gz