Sites now survive terminal close and can start automatically on boot:
- subprocess.Popen uses start_new_session=True (Unix) or
CREATE_NEW_PROCESS_GROUP (Windows) so onionshare-cli processes
are fully detached and immune to SIGHUP when the terminal exits
- New `voxvera start-all` / `stop-all` commands for non-interactive
batch control of all configured sites
- New `voxvera autostart` installs platform-appropriate boot service:
- Linux: systemd user service + loginctl enable-linger
- macOS: launchd LaunchAgent
- Windows: schtasks scheduled task on login
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Root cause: user-local werkzeug 2.0.3 in ~/.local/lib/python3.11/
site-packages shadows the system werkzeug 2.2.2, breaking Flask's
LocalProxy.unbound_message for the system onionshare-cli.
The pip3 show-based cleanup was unreliable (shows system package,
skips user-local). Two-pronged fix:
1. Set PYTHONNOUSERSITE=1 in the env passed to onionshare-cli so it
never loads packages from ~/.local — uses only system packages.
2. Install script now directly rm -rf's conflicting packages from
~/.local/lib/python3.*/site-packages/ instead of relying on pip3.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Previous pip --user installs left werkzeug 2.0.3 in ~/.local which
shadows the system werkzeug and breaks the system onionshare-cli
(Flask 2.2.2 requires werkzeug >= 2.2 for LocalProxy.unbound_message).
Changes:
- Remove flask, werkzeug, and onionshare-cli from voxvera's own
dependencies — they are onionshare's transitive deps, not ours
- Install script now cleans up stale user-local packages (werkzeug,
flask, flask-socketio, onionshare-cli, voxvera) before installing
- Prevents pip --user packages from poisoning system Python environment
Co-Authored-By: Claude Opus 4.6 <[email protected]>
The previous fix only used the system binary for non-frozen (pip/pipx)
installs. But the PyInstaller binary also needs this — it downloads
successfully but its bundled onionshare_cli import still crashes on
'No module named pkg_resources'.
Now both serve() and _internal_onionshare() unconditionally prefer the
system onionshare-cli/onionshare binary via shutil.which(), falling
back to the Python import only if no system binary exists.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Major fixes:
- Use system onionshare-cli binary directly (subprocess/execvp) instead of
importing it as a Python module, avoiding pkg_resources crashes in pipx venvs
- get_servers() now only searches DATA_DIR/host (single source of truth);
bundled example sites are seeded on first manage run then fully user-owned
- delete_server() now permanently removes sites (no ghost re-appearance)
- DATA_DIR defaults to ~/ instead of cwd, preventing sites from scattering
across directories
- Fix attachment URL logic that incorrectly overwrote valid onion URLs
Co-Authored-By: Claude Opus 4.6 <[email protected]>
The vendor directory was unconditionally prepended to sys.path, causing
pip/pipx installs to load incomplete vendored setuptools (missing data
files like Lorem ipsum.txt) instead of the system package. Now the
vendor path is only added for PyInstaller frozen builds, and the
force-import block in cli.py is similarly guarded behind sys.frozen.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
pipx can omit setuptools at runtime even when listed as a dependency,
causing onionshare-cli to crash on `from pkg_resources import resource_filename`.
Add explicit `pipx inject` after install and ensure setuptools is in deps.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Separated internal ROOT from persistent DATA_DIR to prevent user sites from being saved to the volatile PyInstaller _MEIPASS temp directory.
- Updated unit tests to correctly mock DATA_DIR and ensure complete isolation between tests.
- Fixed binaries.yml and requirements.txt to correctly bundle the pinned Flask/Werkzeug versions, preventing onionshare-cli import failures in the standalone binary.
- Pinned Flask<2.3.0 and Werkzeug<3.0.0 to fix TypeError in LocalProxy.
- Prepended vendor directory to sys.path for maximum robustness.
- Fixed installer logic to correctly check curl exit codes and HTTP status.
- Standardized binary names across all scripts.
- Remove HTTPS hosting option; flyers are served exclusively over Tor
- Auto-detect Tor SOCKS/control ports (no manual env vars needed)
- Auto-set tear-off links to .onion address from serve; keep content
link user-configurable
- Fix onionshare-cli flags (remove nonexistent --use-running-tor)
- Graceful QR generation when URLs not yet configured
- Add get_tor_ports() with port probing and sensible defaults
- Add e2e test suite including live Tor reachability test
- Add unit tests for port detection, partial URLs, backward compat
- Add site/ directory with VoxVera-generated landing page for voxvera.org
- Rewrite all documentation to reflect simplified workflow
- Add flyer config field reference with char limits and layout diagram