Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
1361392
feat(tui): shared styles, keymap, and inter-component messages
nixrajput May 29, 2026
f1947d1
feat(tui): Panel interface
nixrajput May 29, 2026
036b456
feat(tui/panels): profiles panel using bubbles/list
nixrajput May 29, 2026
636fb9d
chore: add indirect deps for bubbles/list (fuzzy, clipboard)
nixrajput May 29, 2026
523a85a
feat(tui/panels): dumps panel using bubbles/table
nixrajput May 29, 2026
70c93ef
feat(tui/panels): jobs panel with live Event subscription pump
nixrajput May 29, 2026
784b51d
feat(tui/modals): backup form scaffold
nixrajput May 29, 2026
d5ad35a
feat(tui/modals): restore form + error modal
nixrajput May 29, 2026
df6799d
feat(tui): real Bubble Tea dashboard with three panels + key routing
nixrajput May 29, 2026
e6bdfab
test(tui): snapshot tests via teatest (initial, focus)
nixrajput May 29, 2026
426c64e
chore: go mod tidy — promote huh/teatest/termenv to direct deps
nixrajput May 29, 2026
019d788
fix(tui/modals): correct ErrorModel docstring + inert Update
nixrajput May 29, 2026
deac420
docs: mark Phase C (TUI dashboard) complete in README
nixrajput May 29, 2026
1bfb99a
fix(tui): surface job failures + refresh dumps on completion; disable…
nixrajput May 29, 2026
a27ca14
fix(tui): esc cancels modal forms + sequence restore form fields into…
nixrajput May 29, 2026
70d68f7
fix(tui): single command row on forms + adaptive restore dump-id (sel…
nixrajput May 29, 2026
58b9d58
fix(tui): richer formKind-aware command row (select/type/enter/esc)
nixrajput May 29, 2026
082e7cb
fix(tui): filterable dump-id select (/ to filter) + honest command-ro…
nixrajput May 29, 2026
52b387a
test(tui): assert focus moved in FocusDumps snapshot test
nixrajput May 31, 2026
95e4c58
fix(tui/modals): guard nil error + clamp width in ErrorModel.View
nixrajput May 31, 2026
ec5cc43
fix(tui/panels): render jobs in first-seen order (deterministic)
nixrajput May 31, 2026
c35b08b
fix(tui/panels): skip profile on Get error instead of zero-value row
nixrajput May 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ A single binary that turns the painful, error-prone sprawl of `pg_dump` → `pg_
---

> [!WARNING]
> **Pre-1.0 — active development.** Postgres backup/restore/sync/verify/inspect work end-to-end today (Phase B). MySQL/MariaDB, the interactive dashboard, incremental backups, and ops features are on the [roadmap](#roadmap). APIs, flags, and the on-disk dump format may change before 1.0. Track progress via the milestone tags (`phase-a`, `phase-b`, …).
> **Pre-1.0 — active development.** Postgres backup/restore/sync/verify/inspect work end-to-end today (Phase B), and bare `siphon` opens an interactive multi-panel dashboard (Phase C). MySQL/MariaDB, incremental backups, and ops features are on the [roadmap](#roadmap). APIs, flags, and the on-disk dump format may change before 1.0. Track progress via the milestone tags (`phase-a`, `phase-b`, `phase-c`, …).

## Table of contents

Expand All @@ -41,7 +41,7 @@ A single binary that turns the painful, error-prone sprawl of `pg_dump` → `pg_
- **One CLI, many databases.** Postgres works today; MySQL and MariaDB land in v1.0 (sharing a common backend). The driver interface is engine-agnostic, so SQLite, MongoDB, SQL Server, and ClickHouse can follow.
- **Native, not reimplemented.** siphon shells out to `pg_dump`/`pg_restore` (and `mysqldump`/`mariadb-dump` in v1.0) for the actual data movement — you inherit 20+ years of correctness from the official tools, wrapped in a consistent UX.
- **Integrity by default.** Every dump is checksummed (SHA-256) and recorded in a sidecar metadata file. `siphon verify` re-hashes the dump and flags corruption or tampering — and fails with a distinct exit code so CI can catch it.
- **Built for scripts and humans.** A Cobra command tree with predictable flags and POSIX exit codes for automation; a Bubble Tea dashboard (Phase C) when you invoke `siphon` bare.
- **Built for scripts and humans.** A Cobra command tree with predictable flags and POSIX exit codes for automation; an interactive Bubble Tea dashboard when you invoke `siphon` bare.
- **Named profiles + secret refs.** Store connection details once; reference secrets as `env:VAR` today, with OS keychain / Vault / 1Password / AWS Secrets Manager backends on the roadmap. Plaintext passwords never have to live in your config.
- **Streaming sync.** `siphon sync src dst` pipes a backup straight into a restore with no intermediate file on disk.

Expand All @@ -51,7 +51,7 @@ A single binary that turns the painful, error-prone sprawl of `pg_dump` → `pg_
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| **A** — Skeleton | Go module, Cobra CLI, TUI placeholder, `Driver` interface + registry, `errs`/`config`/`secrets`/`profile` packages, golangci-lint + depguard, cross-platform CI | ✅ Complete |
| **B** — Postgres walking skeleton | `backup`, `restore`, `sync`, `verify`, `inspect`, `dumps`, `config`, `profile` working end-to-end against PostgreSQL | ✅ Complete |
| **C** — TUI dashboard | Multi-panel Bubble Tea dashboard with live job progress | ⏳ Planned |
| **C** — TUI dashboard | Multi-panel Bubble Tea dashboard (profiles · dumps · jobs) with live job progress, backup/restore modal forms, and snapshot tests | ✅ Complete |
| **D** — Driver hardening | Shared cross-driver test harness, capability gating, retry policy | ⏳ Planned |
| **E** — MySQL + MariaDB | Both drivers via a shared `_mysqlcommon` package | ⏳ Planned |
| **F** — Advanced transfer | Incremental backups, bounded-buffer streaming, cross-engine sync, CDC | ⏳ Planned |
Expand Down Expand Up @@ -133,7 +133,7 @@ Exit codes follow a POSIX-friendly taxonomy (`0` ok, `1` user error, `2` system
| `siphon config path\|edit` | Show or edit the config file |
| `siphon schedule` | Cron-managed recurring backups _(Phase G)_ |
| `siphon tunnel` | SSH tunnel helper _(Phase G)_ |
| `siphon` _(bare)_ | Launch the interactive dashboard _(real dashboard in Phase C)_ |
| `siphon` _(bare)_ | Launch the interactive multi-panel dashboard |

Run `siphon <command> --help` for full flags.

Expand Down
29 changes: 22 additions & 7 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@ module github.com/nixrajput/siphon
go 1.26.3

require (
github.com/charmbracelet/bubbles v1.0.0
github.com/charmbracelet/bubbletea v1.3.10
github.com/charmbracelet/huh v1.0.0
github.com/charmbracelet/lipgloss v1.1.0
github.com/charmbracelet/x/exp/teatest v0.0.0-20260527151214-009e6338d40d
github.com/jackc/pgx/v5 v5.9.2
github.com/muesli/termenv v0.16.0
github.com/oklog/ulid/v2 v2.1.1
github.com/spf13/cobra v1.10.2
github.com/testcontainers/testcontainers-go/modules/postgres v0.42.0
Expand All @@ -16,13 +20,22 @@ require (
dario.cat/mergo v1.0.2 // indirect
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/atotto/clipboard v0.1.4 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/aymanbagabas/go-udiff v0.3.1 // indirect
github.com/catppuccin/go v0.3.0 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
github.com/charmbracelet/x/ansi v0.10.1 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/charmbracelet/colorprofile v0.4.1 // indirect
github.com/charmbracelet/harmonica v0.2.0 // indirect
github.com/charmbracelet/x/ansi v0.11.6 // indirect
github.com/charmbracelet/x/cellbuf v0.0.15 // indirect
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 // indirect
github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 // indirect
github.com/charmbracelet/x/term v0.2.2 // indirect
github.com/clipperhouse/displaywidth v0.9.0 // indirect
github.com/clipperhouse/stringish v0.1.1 // indirect
github.com/clipperhouse/uax29/v2 v2.5.0 // indirect
github.com/containerd/errdefs v1.0.0 // indirect
github.com/containerd/errdefs/pkg v0.3.0 // indirect
github.com/containerd/log v0.1.0 // indirect
Expand All @@ -32,6 +45,7 @@ require (
github.com/distribution/reference v0.6.0 // indirect
github.com/docker/go-connections v0.6.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/ebitengine/purego v0.10.0 // indirect
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
Expand All @@ -44,12 +58,13 @@ require (
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/puddle/v2 v2.2.2 // indirect
github.com/klauspost/compress v1.18.5 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/magiconair/properties v1.8.10 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-localereader v0.0.1 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/mattn/go-runewidth v0.0.19 // indirect
github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect
github.com/moby/docker-image-spec v1.3.1 // indirect
github.com/moby/go-archive v0.2.0 // indirect
github.com/moby/moby/api v1.54.1 // indirect
Expand All @@ -61,13 +76,13 @@ require (
github.com/moby/term v0.5.2 // indirect
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
github.com/muesli/cancelreader v0.2.2 // indirect
github.com/muesli/termenv v0.16.0 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.15.0 // indirect
github.com/sahilm/fuzzy v0.1.1 // indirect
github.com/shirou/gopsutil/v4 v4.26.3 // indirect
github.com/sirupsen/logrus v1.9.4 // indirect
github.com/spf13/pflag v1.0.9 // indirect
Expand Down
Loading
Loading