9.5 KiB
Backlog — goget
This file tracks planned features and improvements across releases.
Items are grouped by target version and priority. Completed items
move to CHANGELOG.md when the version ships.
v1.1.0 — Protocol completeness
Finish the protocol layer so every supported protocol handles recursive, parallel, resume, and shutdown correctly. Also bring certificate pinning and metadata debugging to all TLS protocols.
🔴 Supreme Priority
- Graceful shutdown for all protocols — persist
.goget.metaon SIGINT for FTP single-file and SFTP parallel recursive paths. --pinned-certfor all TLS protocols — extend certificate pinning to FTPS, Gemini, and WebDAVS (currently HTTP/HTTPS only). 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
- Gemini resume & metadata — persist
.goget.metaduring Gemini downloads;--resumesupport. Currently Gemini hasFeatures: []— it doesn't advertise resume, and the download loop doesn't save progress. - Gopher resume & metadata — same as Gemini. Gopher
typeHTMLandtypeTextFileresponses should save.goget.metafor resume.
🟢 Medium Priority
--adjust-extensionfor non-HTML protocols — apply.htmlextension to text/html files from WebDAV, Gopher.--backup-convertedfor WebDAV mirrors — keep.origbackups before link conversion.--show-metadata— display.goget.metacontents for debugging interrupted/resumed downloads.
v1.2.0 — curl/wget parity & UX
Close the gap with curl and wget, and improve scripting/automation UX.
🟢 Medium Priority
--progress=bar:force:noscroll— curl-compatible progress options.--metalink --follow-metalink=mem— keep Metalink in memory instead of writing to disk.- Bandwidth throttling per-domain — global rate limit only at present.
- MIME type detection for local files — determine Content-Type from
file extension when uploading (
mime.TypeByExtensionfrom stdlib covers this). - Notification hooks —
--on-errorwith richer environment variables (exit code, error type, checksum). - Retry with backoff visualization — show retry attempts in progress bar (attempt 2/3, waiting 4s…).
🔵 Lower Priority
- URL glob expansion (
--glob) — expand[1-3]and{a,b}patterns in URLs (flag exists, logic not implemented).
v1.3.0 — Security hardening
TLS, authentication, and verification improvements.
🔴 Supreme Priority
- PGP replacement —
golang.org/x/crypto/openpgpis frozen (archived by Go team). Usegithub.com/ProtonMail/go-crypto(BSD-3-Clause) as the replacement — the only permitted third-party dependency exception for the Go codebase.
🟡 High Priority
- SOCKS5 proxy for non-HTTP protocols — FTP and SFTP through SOCKS5
proxy (currently HTTP/HTTPS and WebDAV only).
golang.org/x/net/proxyprovides the SOCKS5 dialer; SFTP is straightforward, FTP needs dual-connection handling. - DNS-over-HTTPS (DoH) — optional DoH resolver. Uses
golang.org/x/net/dns/dnsmessagefor DNS wire format andnet/httpfor the HTTPS transport.
🟢 Medium Priority
- Structured error output with
--json— machine-readable error objects with type, message, URL, and hint fields.
v2.0.0 — Package registries & CAS cache
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.
🔴 Supreme Priority
- Content-addressable cache (CAS) — every downloaded file is stored
under its SHA-256 digest.
gogetbefore hitting the network consults the cache. Identical content from different URLs, protocols, or projects hits the cache exactly once. crate://protocol —crate://serde@1.0.0→ fetches.cratefrom crates.io API.crate://serde@latest→ resolves latest version.gem://protocol —gem://rails@7.2→ fetches.gemfrom RubyGems.org.npm://protocol —npm://react@19→ fetches tarball from registry.npmjs.org.git://protocol —git://github.com/user/repo@v1.0→ archive download via provider API.@tag,@branch,@commitresolution.
🟡 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.lockdownloads and caches every dependency in one shot. Same forGemfile.lockandpackage-lock.json.
v2.1.0 — Plugin system & extensibility
🔴 Supreme Priority
- Plugin system — protocol handlers as external binaries.
Discovered from
~/.config/goget/plugins/. Line-based protocol over stdin/stdout or Unix socket. plugin://protocol — transparent proxy to external handlers.
🟡 High Priority
- 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._tcpannouncements. Written from scratch usinggolang.org/x/net/dns/dnsmessagefor message encoding and stdlibnetfor 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/httphijack).
💡 Backlog (unscheduled)
Items needing more design, dependent on external factors, or deferred 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
- Memory-mapped I/O for large files —
mmapfor checksum verification. - Zero-copy for
file://anddata:protocols —sendfile(2)/splice(2)where available on Linux. - HTTP/3 (QUIC) — when Go stdlib gains QUIC support.
Protocols (rare / niche)
- Rsync — rolling checksum, delta transfer, wire protocol from scratch.
- TFTP — trivial file transfer, embedded devices and PXE.
- NFS — NFS v3/v4 client from scratch (ONC RPC/XDR, portmapper).
Code Quality & Testing
- Integration test matrix — CI against real FTP, SFTP, WebDAV servers.
- Coverage threshold increase — raise from 40% to 60%.
- Benchmark suite —
go test -benchin CI. - Fuzzing corpus in CI — store and replay past crashes automatically.
internal/logmigration — migrate remaining ~140fmt.Fprintfandcli.Print*callsites tolog.Infof.unsafeaudit — verify nounsafeusage outside build-tag-gated platform-specific code.
Project Infrastructure
- RPM spec file — Fedora / RHEL / openEuler packaging.
- FreeBSD port — official FreeBSD ports tree entry.
Documentation
- Man page packaging — already generated, needs installation via packaging.
- Architecture decision records — document design choices.
- Protocol-specific guides — one doc per protocol with examples.
- Troubleshooting guide — common errors and solutions.