Installing under /root left systemd failing with 203/EXEC and empty logs.
The installer now checks that the service user can enter the program and
data dirs; blocked parents are granted traverse-only access (setfacl
u:netx:x, else chmod o+x) with --grant-access or after asking, otherwise
it stops with the exact command. Start failures show the supervisor log
or journalctl when api.log is empty. README: /root installs and UME with
self-signed certificates (NETX_ALLOW_INSECURE_DEFAULTS).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An entry like "all" made every port probe fail and the installer said
"port in use" forever. Aliases (all/*, local) are normalized, other
values must be an IPv4 address of this host, and port-free now tells a
busy port (exit 1) from a bad address (exit 3). Same check for set-bind.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Forgejo can hand out /attachments/<uuid> links; the release API's own
names stay authoritative. (The v0.4.19 updater already works against
releases/latest, which returns named download URLs.)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- packaging/linux: netx-<ver>-linux-x86_64.tar.gz with bundled Python 3.12,
PostgreSQL 16 and web/dist (glibc >= 2.17). install.sh (install/update/
reinstall), netxctl (start/stop/status/logs, set-port, set-bind,
set-pg-port, reconfigure-db, check-update/update/auto-update, backup,
uninstall), systemd units, nohup fallback without systemd. Privilege
drop, detaching and tar go through the bundled Python, so bare images
without su/runuser/setsid/tar work.
- Updates: same GitHub/Forgejo/manifest sources as Windows, sha256
verified, pre-update pg_dump, automatic rollback when the new version
does not come up.
- Non-loopback bind: generated bootstrap admin password and
NETX_UME_VERIFY_TLS=true, as security_bootstrap requires.
- Build in manylinux2014 + check_bundle.sh (GLIBC <= 2.17, no missing
libs); release-linux.yml builds on v* tags and smoke-tests offline on
CentOS 7, Rocky 9, Ubuntu 18.04/24.04, Debian 12, openSUSE Leap 15 and
openEuler 22.03 before attaching to the release.
- Windows: Setup DB page gets a bundled PG port field and
/BundledPgPort=; set_pg_port.ps1 + tray "Built-in database port";
reconfigure keeps the configured port; postgresql.conf is written
without a BOM (PS 5.1 Set-Content -Encoding utf8 broke postgres).
- Forgejo/GitHub publish scripts include the Linux package.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The GitHub runner's toolcache keeps python-3.12.x-amd64.exe (~25MB) and
_test*.pyd next to python.exe; exclude them so CI Setups match local
ones (0.4.18 CI build was 70MB vs 44MB local).
- publish_forgejo_release.ps1: curl --noproxy for the Forgejo host; a
desktop HTTP(S)_PROXY returned 502 for the LAN address.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Start: WinSW's NetX.out.log/err.log in data\runtime are the same files as
start_netx.ps1's netx.out.log (case-insensitive) and stay open, so NetX
could not truncate its log and every start failed. WinSW logs now go to
data\runtime\service.
- Stop: nothing told the service_run.ps1 supervisor to exit, so it kept
restarting NetX and WinSW waited forever. stop_netx_app.ps1 writes the
service.stop flag (-KeepSupervisor for the supervisor's own restarts),
service_run checks it every second, and runtime_ctl / service_lifecycle
write it before stopping the service.
- WinSW launched powershell.exe as stop hook never reached the script
(stuck on inherited std handles); run it via cmd with NUL stdin and output
to data\runtime\service\stopexec.log. stop_netx_app.ps1 keeps a
timestamped trace there.
Offline Windows Sandbox: service install -> healthy in 28s, stop in 20s.
Existing service installs need "install service" re-run to pick this up.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Windows PowerShell 5.1 Start-Process -Wait (and `& exe` with captured
output) waits for every descendant / until the stdout pipe closes. The
postgres and NetX processes a start leaves running made runtime_ctl.ps1
never return: tray stuck on "Starting", Start Menu "Start NetX" never
opened the UI. Start-NetxPowerShell -Wait, the UAC relaunch and the Setup
wait in check_update now wait for the process itself (WaitForExit).
Service mode in runtime_ctl: start via sc.exe without blocking on
SERVICE_RUNNING; stop writes the supervisor stop flag, polls up to 120s,
then kills the WinSW tree as a last resort.
Verified in an offline Windows Sandbox (no VC++ redist, no Python).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The EDB binaries link vcruntime140 (and msvcp140 via ICU), which a clean
Windows install lacks, so the built-in DB and the wizard's external-DB
connection test (psql) failed on fresh/offline PCs without the VC++
2015-2022 redistributable. Copy vcruntime140(_1)/msvcp140(_1,_2) into
postgres\pgsql\bin at build time and extract vcruntime140 with psql.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Settings -> Update source writes NETX_UPDATE_SOURCES to ProgramData .env:
empty keeps the default (GitHub first, git.avelo.top mirror as fallback),
"forgejo" pins updates to git.avelo.top.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
NetX runs headless; these were ~70MB of the runtime (107MB -> 34MB) and made
CI Setups ~30MB larger than local ones. Setup: 105MB (CI) / 75MB -> 67MB.
ensurepip stays for venv creation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Prefer Python 3.12 (py -3.12 / Python312) even when another version is
first on PATH, matching the CI pin.
- Skip npm ci when node_modules already matches package-lock.json: npm ci
wipes node_modules first and a running Vite dev server leaves it
half-deleted.
- pip --no-warn-script-location: its PATH check realpath()s every entry
and aborts on a broken reparse point.
- README: local release / Forgejo / offline steps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Installer: dynamic light/dark Win11 style, new brand wizard images, auto
language, exclusive run mode (tray / Windows service) plus autostart and
auto-update on the Tasks page (pre-selected from what is installed on
upgrades, untouched by silent updates), 5 localized Start Menu entries.
Tray: theme-aware rounded menu with live status, icons and status-dot tray
icon; health polled off the UI thread; Settings submenu toggles autostart
and daily updates; browser opened de-elevated via explorer.
Fixes:
- tray Stop/Start was ignored in service mode (service_run restarted the
children) - all start/stop now goes through runtime_ctl.ps1
- logon tray task and SYSTEM service task were killed after 72h (default
ExecutionTimeLimit); autostart was registered for the elevating account
and opened a browser on every logon
- uninstall left the NetXTray/NetXUpdate tasks behind
- silent auto-update killed the tray without restarting it
- repair_venv.ps1 was never staged into the release
- wildcard NETX_HOST (0.0.0.0) broke health checks
- ICO frames were PNG, which System.Drawing decodes as noise; icons now
use the current brand mark
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
theme.css squashes every animation to 0.01ms x1 when the OS asks for reduced
motion, so the login earth jumped once and snapped back (position stuck at 0%).
The login stylesheet already intends the ambient spin to stay; restore it with a
class selector that outranks the universal rule.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Interactive Setup asks update vs reinstall; elevated install relinks .venv so tray start works under Program Files.
Co-authored-by: Cursor <cursoragent@cursor.com>
Use pwsh -File with UTF-8 BOM scripts, and default Forgejo uploads to the public domain when LAN IP is unreachable.
Co-authored-by: Cursor <cursoragent@cursor.com>
Offline Setup and check_update now upgrade in place without the database wizard; zip packages are no longer published.
Co-authored-by: Cursor <cursoragent@cursor.com>
Poll external processes instead of Start-Process -Wait on the UI thread, and restart the tray after a successful update.
Co-authored-by: Cursor <cursoragent@cursor.com>
Apply updates as Administrator for Program Files, copy portable python with .venv, and wait for tray apply to finish.
Co-authored-by: Cursor <cursoragent@cursor.com>
Allow non-admin reconfigure of .env, harden setup/tray flows, and refresh the context menu with hover selection.
Co-authored-by: Cursor <cursoragent@cursor.com>
0.4.5 venv pointed at the build machine user profile; other PCs failed to start API.
Bundle stdlib under python/runtime, repair pyvenv.cfg, and health-check before start.
Co-authored-by: Cursor <cursoragent@cursor.com>
Selecting built-in PostgreSQL now always applies setup_first_run after files copy;
failed config shows a clear error instead of a misleading first-time tip.
Co-authored-by: Cursor <cursoragent@cursor.com>
Choose bundled or external PostgreSQL in the Setup wizard with connection
validation; optional NETX_CREDENTIAL_SECRET_KEY; single desktop shortcut;
faster uninstall and tray startup for offline Windows packages.
Co-authored-by: Cursor <cursoragent@cursor.com>
Chinese packaging scripts without BOM were misread as ANSI and failed at first-run.
Document that bundled Python 3.13+ needs Server 2016+ / Win10+.
Co-authored-by: Cursor <cursoragent@cursor.com>