- Delete all lib/ui_*.sh files (gum-based TUI)
- Remove gum download from install script
- Remove gum fallback and show_logo from bin/gniza
- Update README to reference Textual TUI and web GUI
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds an input field and button to create a new folder inside the
currently selected directory, then refreshes the tree.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace `is Select.BLANK` / `is not Select.BLANK` with isinstance
checks, as the sentinel identity varies across Textual versions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove leading blank line from logo markup and add top margin
to menu so both start at the same visual row.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove verify screen, CLI subcommand, and all related functions.
Fix logo/menu height alignment on main menu screen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the Load Snapshots button. Snapshots are fetched
automatically when both target and remote have values,
triggered by Select.Changed events.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The worker starts streaming output before the modal screen finishes
composing. Buffer writes until on_mount fires, then flush.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use Text.from_markup() for strings containing Rich tags
so [red]...[/red] renders as colored text instead of raw tags.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
public_url="" caused IndexError in textual-serve URL builder.
Now auto-detects the machine's LAN IP when binding to 0.0.0.0
so the browser can connect to the correct WebSocket endpoint.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Setting public_url="" makes textual-serve generate relative
WebSocket URLs so the browser connects to the correct host
regardless of whether accessed via localhost or remote IP.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Install script now copies tui/ directory to install location
- Installs textual and textual-serve via pip after file copy
- __main__.py uses GNIZA_DIR env var for correct path resolution
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
textual-serve shows the command string as the app title.
Set PYTHONPATH and GNIZA_DIR as real env vars so the spawned
subprocess inherits them. Add title="gniza" for clean display.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
textual-serve spawns the app as a subprocess which doesn't
inherit PYTHONPATH. Bake the project root into the command.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run `gniza web` or `gniza --web` to serve the TUI as a web app
on port 8080. Use --port to change. Requires textual-serve.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Switch widget was not rendering visibly. Use a Yes/No Select
dropdown instead which works reliably.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use full block-character logo from bin/gniza, place logo Static
and OptionList directly in Horizontal container without extra
nesting. Style with proper widths.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use Horizontal container with logo-panel and menu-panel side by side,
centered vertically in the terminal.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
OptionList supports up/down arrow keys and Enter to select,
giving a proper menu feel instead of Tab-through buttons.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use 1fr width with max-width, reduce button height/margins,
and enable overflow scroll so all items fit smaller terminals.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Give the switch Horizontal container an explicit ID and CSS
with height:auto and proper alignment.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SSH: tests ssh connection before saving, option to save anyway on failure
- Local: checks if directory exists
- S3: tests rclone connection if rclone is available
- GDrive: tests rclone connection if rclone is available
- All tests are optional and can be skipped
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Changed condition from AND to OR: wizard runs if remotes OR targets
are not configured (not only when both are empty)
- Wizard skips steps that are already done (e.g. if remote exists,
jumps straight to target creation)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- First gum file browser opens right after target name entry
- Shows selected folders list, then offers Add/Remove/Done
- No extra menu step before the first folder selection
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
gum file returns paths relative to the start directory.
Prepend / to ensure absolute paths for backup targets.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace manual path input with gum file --directory for browsing
and selecting folders. Adds duplicate detection. Shows selected
count in menu header.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Install script auto-downloads gum from GitHub releases into
$INSTALL_DIR/bin/gum (supports x86_64, arm64, armv7, i386)
- Skips download if gum is already installed system-wide
- bin/gniza adds $GNIZA_DIR/bin to PATH so bundled gum is found
- No system package installation required
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rewrite ui_common.sh wrappers to use gum choose, gum input,
gum confirm, gum style, gum pager
- Menu items display as "TAG Description" for reliable tag extraction
(handles duplicate descriptions safely)
- Replace whiptail --gauge with text-based progress bar
- Use printf %b instead of echo -e to avoid escape injection
- Read msgbox keypress from /dev/tty to work in piped contexts
- Update bin/gniza, install.sh, README.md references
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Guides users through creating their first remote and target when gniza
launches with no configuration. Optionally runs a first backup.
Triggers only when both remotes.d/ and targets.d/ are empty.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Switch REPO_URL to HTTPS for machines without SSH keys
- Handle piped execution (curl | bash) where BASH_SOURCE is unavailable
- Add one-liner install commands to README (root and user mode)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Complete Linux backup manager with Whiptail TUI and CLI interface.
Adapted from gniza4cp (cPanel backup tool) with target/profile-based
system replacing cPanel-specific features.
- 14 core engine modules (backup, restore, targets, remotes, transfer, etc.)
- 11 Whiptail TUI screens (full CRUD for targets/remotes/schedules)
- CLI entrypoint with subcommands for scripting/cron
- Support for SSH, local, S3, and Google Drive remotes
- rsync --link-dest incremental snapshots
- Root and user mode (XDG paths)
- 70 passing tests
- Config templates, installer, uninstaller
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>