chore: update BACKLOG with v1.1.0 progress and restated roadmap

This commit is contained in:
2026-06-29 12:30:28 +02:00
parent f915299fa4
commit 1672698936
+149 -80
View File
@@ -9,35 +9,37 @@ move to `CHANGELOG.md` when the version ships.
## v1.1.0 — Protocol completeness ## v1.1.0 — Protocol completeness
Finish the protocol layer so every supported protocol handles Finish the protocol layer so every supported protocol handles
recursive, parallel, resume, and shutdown correctly. recursive, parallel, resume, and shutdown correctly. Also bring
certificate pinning and metadata debugging to all TLS protocols.
### 🔴 Supreme Priority ### 🔴 Supreme Priority
- [ ] **Graceful shutdown for all protocols** — persist `.goget.meta` on - [x] **Graceful shutdown for all protocols** — persist `.goget.meta` on
SIGINT for FTP single-file and SFTP parallel recursive paths. SIGINT for FTP single-file and SFTP parallel recursive paths.
- [ ] **WebDAV connection pooling**shared `http.Transport` across WebDAV - [ ] **`--pinned-cert` for all TLS protocols** — extend certificate
requests instead of a fresh transport per request (currently defeats HTTP pinning to FTPS, Gemini, and WebDAVS (currently HTTP/HTTPS only).
keep-alive, TLS session resumption, and HTTP/2 multiplexing). Also add SSH host-key pinning for SFTP as `--pinned-host-key`.
- [ ] **Unified worker pool** — a single protocol-agnostic worker pool
used by FTP, SFTP, and WebDAV recursive-parallel paths. Removes
the three near-identical semaphore+WaitGroup implementations.
### 🟡 High Priority ### 🟡 High Priority
- [ ] **WebDAV recursive parallel downloads** — extend `--recursive-parallel` - [ ] **Gemini resume & metadata** — persist `.goget.meta` during Gemini
to WebDAV using the shared transport. downloads; `--resume` support. Currently Gemini has `Features: []`
- [ ] **SFTP recursive parallel downloads** — parallel SFTP recursive with it doesn't advertise resume, and the download loop doesn't save
session pooling. progress.
- [ ] **FTP recursive parallel** — connection pool for independent control - [ ] **Gopher resume & metadata** — same as Gemini. Gopher `typeHTML`
connections in FTP recursive mode. and `typeTextFile` responses should save `.goget.meta` for resume.
- [ ] **`--dry-run` for WebDAV recursive** — list matched entries without
downloading.
### 🟢 Medium Priority ### 🟢 Medium Priority
- [ ] **`--adjust-extension` for non-HTML protocols** — apply `.html` - [x] **`--adjust-extension` for non-HTML protocols** — apply `.html`
extension to text/html files from WebDAV, Gopher. extension to text/html files from WebDAV, Gopher.
- [ ] **`--backup-converted` for WebDAV mirrors** — keep `.orig` backups - [x] **`--backup-converted` for WebDAV mirrors** — keep `.orig` backups
before link conversion. before link conversion.
- [ ] **Parallel recursive across all protocols**unified worker pool - [ ] **`--show-metadata`** — display `.goget.meta` contents for debugging
independent of protocol handler. interrupted/resumed downloads.
--- ---
@@ -45,15 +47,6 @@ recursive, parallel, resume, and shutdown correctly.
Close the gap with curl and wget, and improve scripting/automation UX. Close the gap with curl and wget, and improve scripting/automation UX.
### 🟡 High Priority
- [ ] **`--create-dirs`** — auto-create parent directories for `--output`
paths (curl `--create-dirs` / wget `--directory-prefix` equivalent).
- [ ] **Short flags**`-O`, `-o`, `-s`, `-v` aliases for curl/wget
muscle memory. `--output-document` alias for `--output`.
- [ ] **Brotli decompression** — RFC 7932, written from scratch.
Currently only gzip/deflate/bzip2/LZW.
### 🟢 Medium Priority ### 🟢 Medium Priority
- [ ] **`--progress=bar:force:noscroll`** — curl-compatible progress options. - [ ] **`--progress=bar:force:noscroll`** — curl-compatible progress options.
@@ -61,21 +54,16 @@ Close the gap with curl and wget, and improve scripting/automation UX.
of writing to disk. of writing to disk.
- [ ] **Bandwidth throttling per-domain** — global rate limit only at present. - [ ] **Bandwidth throttling per-domain** — global rate limit only at present.
- [ ] **MIME type detection for local files** — determine Content-Type from - [ ] **MIME type detection for local files** — determine Content-Type from
file extension when uploading. file extension when uploading (`mime.TypeByExtension` from stdlib covers this).
- [ ] **`--cut-dirs` for recursive mode** — strip directory components from
output paths.
- [ ] **Notification hooks**`--on-error` with richer environment variables - [ ] **Notification hooks**`--on-error` with richer environment variables
(exit code, error type, checksum). (exit code, error type, checksum).
- [ ] **Retry with backoff visualization** — show retry attempts in progress - [ ] **Retry with backoff visualization** — show retry attempts in progress
bar (attempt 2/3, waiting 4s...). bar (attempt 2/3, waiting 4s).
- [ ] **Idempotent `--resume`** — auto-detect whether resume is possible
without manual flag.
- [ ] **`--show-metadata`** — display `.goget.meta` contents for debugging.
### 🔵 Lower Priority ### 🔵 Lower Priority
- [ ] **URL glob expansion (`--glob`)** — expand `[1-3]` and `{a,b}` patterns - [ ] **URL glob expansion (`--glob`)** — expand `[1-3]` and `{a,b}` patterns
in URLs. in URLs (flag exists, logic not implemented).
--- ---
@@ -85,18 +73,20 @@ TLS, authentication, and verification improvements.
### 🔴 Supreme Priority ### 🔴 Supreme Priority
- [ ] **PGP replacement**`golang.org/x/crypto/openpgp` is frozen (archived - [ ] **PGP replacement**`golang.org/x/crypto/openpgp` is frozen
by Go team). Evaluate: inline a minimal subset, or wait for a community (archived by Go team). Use `github.com/ProtonMail/go-crypto`
`golang.org/x/` successor. (BSD-3-Clause) as the replacement — the only permitted third-party
dependency exception for the Go codebase.
### 🟡 High Priority ### 🟡 High Priority
- [ ] **`--pinned-cert` for all TLS protocols** — extend certificate pinning
to FTPS, SFTP, Gemini, and WebDAVS (currently HTTP/HTTPS only).
- [ ] **SOCKS5 proxy for non-HTTP protocols** — FTP and SFTP through SOCKS5 - [ ] **SOCKS5 proxy for non-HTTP protocols** — FTP and SFTP through SOCKS5
proxy (currently HTTP/HTTPS only). proxy (currently HTTP/HTTPS and WebDAV only). `golang.org/x/net/proxy`
- [ ] **DNS-over-HTTPS (DoH)** — optional DoH resolver. Must use only provides the SOCKS5 dialer; SFTP is straightforward, FTP needs
`golang.org/x/` libraries. dual-connection handling.
- [ ] **DNS-over-HTTPS (DoH)** — optional DoH resolver. Uses
`golang.org/x/net/dns/dnsmessage` for DNS wire format and `net/http`
for the HTTPS transport.
### 🟢 Medium Priority ### 🟢 Medium Priority
@@ -105,64 +95,146 @@ TLS, authentication, and verification improvements.
--- ---
## v2.0.0 — New protocols ## v2.0.0 — Package registries & CAS cache
Cloud providers, additional network protocols, and long-lived services. Turn goget from a file-in-URL-out downloader into a language-aware
package fetcher. The content-addressable cache deduplicates downloads
across protocols and projects — a file is never downloaded twice.
### 🔵 Lower Priority ### 🔴 Supreme Priority
- [ ] **S3** — generic S3-compatible protocol with signature v4 auth - [ ] **Content-addressable cache (CAS)** — every downloaded file is stored
(covers AWS S3, MinIO, and any S3-compatible storage). under its SHA-256 digest. `goget` before hitting the network consults
- [ ] **Huawei OBS** — Huawei Cloud Object Storage. the cache. Identical content from different URLs, protocols, or
- [ ] **Alibaba OSS** — Alibaba Cloud Object Storage Service. projects hits the cache exactly once.
- [ ] **Tencent COS**Tencent Cloud Object Storage. - [ ] **`crate://` protocol** — `crate://serde@1.0.0` → fetches `.crate`
- [ ] **Rsync** — incremental file transfer. Written from scratch from crates.io API. `crate://serde@latest` → resolves latest version.
(rolling checksum, delta transfer, rsync wire protocol). - [ ] **`gem://` protocol** — `gem://rails@7.2` → fetches `.gem` from
- [ ] **TFTP** — trivial file transfer, useful for embedded devices and PXE. RubyGems.org.
- [ ] **NFS**NFS v3/v4 client. Written from scratch - [ ] **`npm://` protocol** — `npm://react@19` → fetches tarball from
(ONC RPC/XDR, portmapper, mount protocol, NFS protocol). registry.npmjs.org.
- [ ] **goget-as-a-service**daemon mode with REST API for remote download - [ ] **`git://` protocol** — `git://github.com/user/repo@v1.0` → archive
management. download via provider API. `@tag`, `@branch`, `@commit` resolution.
### 🟡 High Priority
- [ ] **`oci://` protocol** — `oci://alpine:3.20` → pulls OCI
image layers via registry v2 API, stores in CAS. No daemon required —
goget acts as a standalone OCI image fetcher. Works against any
OCI-compatible registry (Docker Hub, Quay.io, GHCR, …). Complex
protocol, but purely HTTP + JSON — stdlib covers it.
- [ ] **Lockfile import**`goget crate:// --from-lock Cargo.lock`
downloads and caches every dependency in one shot. Same for
`Gemfile.lock` and `package-lock.json`.
--- ---
## v2.1.0 — Extensibility & UI ## v2.1.0 — Plugin system & extensibility
### 🔵 Lower Priority ### 🔴 Supreme Priority
- [ ] **Plugin system** — protocol handlers as external plugins. - [ ] **Plugin system** — protocol handlers as external binaries.
- [ ] **TUI (Terminal User Interface)** — interactive download manager with Discovered from `~/.config/goget/plugins/`. Line-based protocol
live queue, progress, and log views. Keyboard navigation, color-coded over stdin/stdout or Unix socket.
status, inline log viewer. - [ ] **`plugin://` protocol** — transparent proxy to external handlers.
- [ ] **Web GUI** — browser-based download manager (Vue 3 frontend, REST API,
live progress via SSE). ### 🟡 High Priority
- [ ] **Download speed test / benchmark mode** — measure maximum throughput
against a target server without saving the file. - [ ] **Plugin SDK** — Go library (`golang.org/x/` only) for writing plugins.
- [ ] **Plugin registry** — community-maintained index of known plugins.
---
## v2.2.0 — Distributed download mesh
Goget instances on the same LAN discover each other and share cached files.
mDNS/DNS-SD written from scratch on top of `golang.org/x/net/dns/dnsmessage`
and stdlib multicast UDP.
### 🔴 Supreme Priority
- [ ] **`ggtp://` protocol (goget transfer protocol)** — simple
single-round-trip request for a file by SHA-256 from a peer.
- [ ] **LAN discovery (mDNS / DNS-SD)**`_goget._tcp` announcements.
Written from scratch using `golang.org/x/net/dns/dnsmessage` for
message encoding and stdlib `net` for multicast UDP.
### 🟡 High Priority
- [ ] **Mesh-aware CAS** — query LAN peers for SHA-256 before downloading
from the internet.
- [ ] **Peer authentication** — optional shared secret or mTLS between
trusted nodes.
---
## v3.0.0 — goget-as-a-service
Long-lived daemon with REST API, TUI, and Web GUI.
### 🔴 Supreme Priority
- [ ] **Daemon mode**`goget daemon` + REST API (localhost-only).
- [ ] **REST API**`POST /downloads`, `GET /downloads/:id`, SSE progress.
### 🟡 High Priority
- [ ] **Web GUI** — Vue 3 + Vite + Tailwind CSS, daemon REST API + SSE.
- [ ] **Queue pause/resume/reorder** — full download queue management.
### 🟢 Medium Priority
- [ ] **S3 protocol** — as a plugin (see v2.1.0). Signature v4 auth
(HMAC-SHA256, all in stdlib).
- [ ] **Huawei OBS, Alibaba OSS, Tencent COS** — cloud storage plugins.
- [ ] **systemd unit** — for daemon / scheduled mode.
- [ ] **Download speed test / benchmark mode**.
---
## v3.1.0 — Streaming & real-time protocols
### 🟢 Medium Priority
- [ ] **HLS / MPEG-DASH** — download streamed video.
- [ ] **Icecast / SHOUTcast** — capture internet radio.
- [ ] **WebSocket capture** — record WebSocket messages (RFC 6455 framing
from scratch on top of `net/http` hijack).
--- ---
## 💡 Backlog (unscheduled) ## 💡 Backlog (unscheduled)
Items that need more design, depend on external factors, or are Items needing more design, dependent on external factors, or deferred
lower priority than the versioned roadmap. until foundational libraries are written.
### Deferred — waiting for custom libraries
- [ ] **Brotli decompression** — RFC 7932. Will be built as a standalone
Go library first, then integrated into goget. No third-party
dependency — pure Go from scratch.
- [ ] **TUI (Terminal User Interface)** — interactive download manager.
Will be built as a standalone Go TUI toolkit on top of `golang.org/x/term`,
then integrated. Layout engine, widgets, and event loop written from
scratch.
### Performance ### Performance
- [ ] **Memory-mapped I/O for large files**`mmap` for checksum - [ ] **Memory-mapped I/O for large files**`mmap` for checksum
verification of multi-gigabyte downloads. verification.
- [ ] **Zero-copy for `file://` and `data:` protocols**`sendfile(2)` / - [ ] **Zero-copy for `file://` and `data:` protocols**`sendfile(2)` /
`splice(2)` where available on Linux. `splice(2)` where available on Linux.
- [ ] **HTTP/3 (QUIC)** — when Go stdlib gains QUIC support. - [ ] **HTTP/3 (QUIC)** — when Go stdlib gains QUIC support.
### Advanced UX ### Protocols (rare / niche)
- [ ] **Scheduling — pause/resume queued downloads** — ability to pause the - [ ] **Rsync** — rolling checksum, delta transfer, wire protocol from scratch.
queue, reorder items, and resume later. - [ ] **TFTP** — trivial file transfer, embedded devices and PXE.
- [ ] **NFS** — NFS v3/v4 client from scratch (ONC RPC/XDR, portmapper).
### Code Quality & Testing ### Code Quality & Testing
- [ ] **Integration test matrix** — CI against real FTP, SFTP, and WebDAV - [ ] **Integration test matrix** — CI against real FTP, SFTP, WebDAV servers.
servers.
- [ ] **Coverage threshold increase** — raise from 40% to 60%. - [ ] **Coverage threshold increase** — raise from 40% to 60%.
- [ ] **Benchmark suite**`go test -bench` in CI. - [ ] **Benchmark suite**`go test -bench` in CI.
- [ ] **Fuzzing corpus in CI** — store and replay past crashes automatically. - [ ] **Fuzzing corpus in CI** — store and replay past crashes automatically.
@@ -175,13 +247,10 @@ lower priority than the versioned roadmap.
- [ ] **RPM spec file** — Fedora / RHEL / openEuler packaging. - [ ] **RPM spec file** — Fedora / RHEL / openEuler packaging.
- [ ] **FreeBSD port** — official FreeBSD ports tree entry. - [ ] **FreeBSD port** — official FreeBSD ports tree entry.
- [ ] **systemd unit** — for daemon / scheduled mode.
### Documentation ### Documentation
- [ ] **Man page packaging** — already generated by `--generate-man-page`, - [ ] **Man page packaging** — already generated, needs installation via packaging.
needs installation via packaging. - [ ] **Architecture decision records** — document design choices.
- [ ] **Architecture decision records** — document why specific choices were
made (no short flags, IPv6-first, long flags only, no global state).
- [ ] **Protocol-specific guides** — one doc per protocol with examples. - [ ] **Protocol-specific guides** — one doc per protocol with examples.
- [ ] **Troubleshooting guide** — common errors and solutions. - [ ] **Troubleshooting guide** — common errors and solutions.