downloader

byunknown

i have atttached the details in notepad file build as per requested

Landing
Landing

Comments (0)

No comments yet. Be the first!

System Requirements

System Requirement Document
Page 1 of 30

System Requirements Document

1. Introduction

This document specifies the requirements for FluxGet, a production-quality, cross-platform desktop download manager. FluxGet reproduces the useful functional capabilities expected of a modern high-performance download manager — parallel multi-connection transfer, pause/resume, crash recovery, queueing, scheduling, categorization, browser integration, media detection, authentication, bandwidth control, and integrity verification — while remaining an entirely original implementation built on standard, documented networking protocols, documented browser APIs, and original engineering.

FluxGet MUST be installable and usable locally on Windows without requiring a hosted service or external cloud account for download management.

The system MUST NOT copy proprietary source code, binaries, private algorithms, branding, icons, or reverse-engineered implementation details from any existing download manager. All architecture, UI, branding, codebase, and assets are original. FluxGet is a general-purpose download manager that downloads only resources a user is authorized to access, and it explicitly excludes DRM removal, paywall bypass, credential theft, session hijacking, CAPTCHA bypass, and access-control circumvention.

The document provides canonical requirements for architecture, functional behavior, UI, security, privacy, performance, testing, delivery phases, and technical boundaries.

Page 2 of 30

Source Content Inventory

  • Identity: User-attached notepad file chat_media/64e0f427-c865-48a4-84ab-27b1846f0b5a/f4891c9a_You_are_a_senior_systems_engineer_.txt containing the authoritative FluxGet requirements.
  • Verbatim local-runtime requirement: “also make app such that it can be used locally on windows”
Page 3 of 30

2. System Overview

FluxGet is a desktop application composed of a Rust download engine, a modern desktop UI shell, and companion browser extensions. It is organized as a modular architecture comprising:

  1. Desktop UI
  2. Download Engine
  3. Network Layer
  4. Segment Manager
  5. Queue Manager
  6. Scheduler
  7. Browser Integration Service
  8. Browser Extension
  9. Clipboard Monitor
  10. Persistence Layer
  11. Authentication/Cookie Handler
  12. Media Detection Layer
  13. File Manager
  14. Settings Manager
  15. Notification System
  16. Update System
  17. Logging/Diagnostics Layer

The core download engine is asynchronous and streams network data directly to disk across multiple parallel Range-request segments. Persistent state is maintained in SQLite with a fully defined download state machine. A browser extension (Manifest V3) communicates with the desktop application over Native Messaging (preferred) or a secure authenticated local service. The UI subscribes to an internal event bus and renders a compact, high-density productivity interface with live per-connection progress visualization.

The application works locally by default and does not transmit download history, URLs, cookies, filenames, clipboard data, or credentials to external analytics servers.

Page 4 of 30

3. Functional Requirements

Page 5 of 30

3.1 Project Goal Capabilities

  • FR-1.1 — As a user, I want to intercept downloads from supported browsers so that browser-initiated downloads are handed to FluxGet automatically.
  • FR-1.2 — As a user, I want files downloaded using multiple parallel connections so that transfers are accelerated where the server permits it.
  • FR-1.3 — As a user, I want to pause and resume downloads so that I can interrupt and continue transfers without losing progress.
  • FR-1.4 — As a user, I want interrupted downloads to be recovered so that progress is not lost after failures.
  • FR-1.5 — As a user, I want to download large files reliably so that multi-gigabyte transfers complete without corruption.
  • FR-1.6 — As a user, I want to manage download queues so that I can control order and concurrency of transfers.
  • FR-1.7 — As a user, I want to schedule downloads so that transfers run at chosen times.
  • FR-1.8 — As a user, I want downloaded files categorized so that they are organized automatically.
  • FR-1.9 — As a user, I want downloadable media detected where legally and technically accessible so that exposed media URLs can be downloaded.
  • FR-1.10 — As a user, I want clipboard URLs monitored so that copied download links are offered for download.
  • FR-1.11 — As a user, I want authenticated downloads performed when credentials or cookies are available through legitimate browser APIs.
  • FR-1.12 — As a user, I want to limit bandwidth so that downloads do not saturate my connection.
  • FR-1.13 — As a user, I want to prioritize downloads so that important transfers complete first.
  • FR-1.14 — As a user, I want failed connections automatically retried so that transient errors resolve themselves.
  • FR-1.15 — As a user, I want browser integration so that my browser and FluxGet work together.
  • FR-1.16 — As a user, I want detailed download statistics so that I can monitor transfer performance.
  • FR-1.17 — As a user, I want persistent download history so that past downloads remain recorded.
  • FR-1.18 — As a user, I want proxy configuration support so that downloads route through my network proxy.
  • FR-1.19 — As a user, I want HTTP/HTTPS/FTP support where feasible so that common protocols work.
  • FR-1.20 — As a user, I want redirects supported so that redirected URLs resolve correctly.
  • FR-1.21 — As a user, I want temporary and expiring links handled gracefully so that expired links are detected and managed.
  • FR-1.22 — As a user, I want server resume capability checked so that I know whether a transfer can resume.
  • FR-1.23 — As a user, I want checksum verification so that I can confirm file integrity.
  • FR-1.24 — As a user, I want a polished desktop interface so that the application is efficient and pleasant to use.
  • FR-1.25 — As a user, I want FluxGet to be installable and usable locally on Windows without requiring a hosted service or external cloud account for download management.
Page 6 of 30

3.2 Download Engine — Protocol & Header Handling

  • FR-2.1 — As the download engine, I want to support HTTP so that standard unencrypted transfers work.
  • FR-2.2 — As the download engine, I want to support HTTPS so that encrypted transfers work.
  • FR-2.3 — As the download engine, I want to support HTTP redirects so that redirected resources follow correctly.
  • FR-2.4 — As the download engine, I want to handle the Content-Disposition header so that server-suggested filenames are used.
  • FR-2.5 — As the download engine, I want to handle Content-Length so that expected size is known.
  • FR-2.6 — As the download engine, I want to handle Content-Type so that MIME type is determined.
  • FR-2.7 — As the download engine, I want to handle ETag so that remote file identity is validated.
  • FR-2.8 — As the download engine, I want to handle Last-Modified so that remote change detection is possible.
  • FR-2.9 — As the download engine, I want to handle Accept-Ranges so that resume support is detected.
  • FR-2.10 — As the download engine, I want to issue Range requests so that segmented downloads are possible.
  • FR-2.11 — As the download engine, I want to handle Transfer-Encoding so that transfer framing is respected.
  • FR-2.12 — As the download engine, I want to handle chunked responses so that chunked transfers download correctly.
  • FR-2.13 — As the download engine, I want to issue HEAD requests when appropriate so that metadata is retrieved efficiently.
  • FR-2.14 — As the download engine, I want to perform GET probing when HEAD is unsupported so that metadata can still be determined.

3.3 Download Analysis

  • FR-3.1 — As the download engine, I want to determine the final resolved URL so that redirect chains are resolved.
  • FR-3.2 — As the download engine, I want to determine the filename so that a sensible name is chosen.
  • FR-3.3 — As the download engine, I want to determine the MIME type so that the file can be categorized.
  • FR-3.4 — As the download engine, I want to determine the expected size so that progress and space checks are accurate.
  • FR-3.5 — As the download engine, I want to determine whether the server supports byte ranges so that segmentation decisions are informed.
  • FR-3.6 — As the download engine, I want to determine the ETag so that file identity can be revalidated.
  • FR-3.7 — As the download engine, I want to determine Last-Modified so that file identity can be revalidated.
  • FR-3.8 — As the download engine, I want to determine the disposition filename so that the server-preferred name is honored.
  • FR-3.9 — As the download engine, I want to suggest a destination so that files land in an appropriate directory.
  • FR-3.10 — As the download engine, I want to determine authentication requirements so that credentialed downloads are handled.
Page 7 of 30

3.4 Download State Machine

  • FR-4.1 — As the download engine, I want a CREATED state so that new downloads begin lifecycle tracking.
  • FR-4.2 — As the download engine, I want an ANALYZING state so that metadata probing is represented.
  • FR-4.3 — As the download engine, I want a QUEUED state so that waiting downloads are represented.
  • FR-4.4 — As the download engine, I want a CONNECTING state so that connection establishment is represented.
  • FR-4.5 — As the download engine, I want a DOWNLOADING state so that active transfer is represented.
  • FR-4.6 — As the download engine, I want a PAUSED state so that suspended downloads are represented.
  • FR-4.7 — As the download engine, I want a RETRYING state so that retry activity is represented.
  • FR-4.8 — As the download engine, I want a VERIFYING state so that integrity checking is represented.
  • FR-4.9 — As the download engine, I want a COMPLETED state so that finished downloads are represented.
  • FR-4.10 — As the download engine, I want a FAILED state so that failed downloads are represented.
  • FR-4.11 — As the download engine, I want a CANCELLED state so that cancelled downloads are represented.
  • FR-4.12 — As the download engine, I want state transitions persisted so that lifecycle survives restarts.
Page 8 of 30

3.5 Multi-Connection Download Acceleration

  • FR-5.1 — As the download engine, I want to implement segmented downloading using HTTP Range requests so that large files download in parallel.
  • FR-5.2 — As the download engine, I want configurable connection counts of 1, 2, 4, 8, 16, and 32 so that users and defaults control parallelism.
  • FR-5.3 — As the download engine, I want a conservative default connection count so that servers are not over-requested.
  • FR-5.4 — As the download engine, I want to determine file size before segmentation so that ranges can be computed.
  • FR-5.5 — As the download engine, I want to check Accept-Ranges before segmentation so that ranges are only used when supported.
  • FR-5.6 — As the download engine, I want to test a range request before segmentation so that support is confirmed, not assumed.
  • FR-5.7 — As the download engine, I want to verify the Content-Range response so that returned ranges are validated.
  • FR-5.8 — As the download engine, I want to verify a stable ETag or Last-Modified before segmentation so that segments belong to the same file version.
  • FR-5.9 — As the download engine, I want the segment manager to dynamically choose connection counts so that parallelism matches server behavior.
  • FR-5.10 — As the download engine, I want to measure throughput so that adaptive segmentation responds to real speed.
  • FR-5.11 — As the download engine, I want to measure server latency so that slow servers reduce parallelism.
  • FR-5.12 — As the download engine, I want to measure connection failures so that unstable servers downgrade connections.
  • FR-5.13 — As the download engine, I want to detect throttling so that concurrency adjusts accordingly.
  • FR-5.14 — As the download engine, I want to detect HTTP 429 responses so that rate limiting is respected.
  • FR-5.15 — As the download engine, I want to detect HTTP 503 responses so that temporary unavailability is respected.
  • FR-5.16 — As the download engine, I want to detect segment speed imbalance so that slow segments can be split.
  • FR-5.17 — As the download engine, I want to dynamically split segments so that idle workers take over unfinished ranges.
  • FR-5.18 — As the download engine, I want to avoid unnecessary excessive connections so that servers are not overloaded.
  • FR-5.19 — As the download engine, I want to respect server rate limits so that downloads do not violate server policies.
Page 9 of 30

3.6 Partial File Storage

  • FR-6.1 — As the download engine, I want to use a temporary working file format (e.g. filename.iso.part) so that partial downloads are isolated.
  • FR-6.2 — As the download engine, I want to maintain metadata separately (JSON or preferably SQLite records) so that segment state is durable.
  • FR-6.3 — As the download engine, I want to store the download ID so that records are uniquely identified.
  • FR-6.4 — As the download engine, I want to store the source URL so that the origin is recorded.
  • FR-6.5 — As the download engine, I want to store the resolved URL so that the final location is recorded.
  • FR-6.6 — As the download engine, I want to store the destination so that final placement is known.
  • FR-6.7 — As the download engine, I want to store the temporary path so that partial data is located.
  • FR-6.8 — As the download engine, I want to store the file size so that completion can be validated.
  • FR-6.9 — As the download engine, I want to store downloaded bytes so that progress is tracked.
  • FR-6.10 — As the download engine, I want to store segment start, end, and current position so that each segment is recoverable.
  • FR-6.11 — As the download engine, I want to store the ETag so that file identity can be revalidated.
  • FR-6.12 — As the download engine, I want to store Last-Modified so that file identity can be revalidated.
  • FR-6.13 — As the download engine, I want to store a cookies reference so that authentication can be re-attached.
  • FR-6.14 — As the download engine, I want to store headers so that request context is preserved.
  • FR-6.15 — As the download engine, I want to store creation time and last update so that lifecycle is recorded.
  • FR-6.16 — As the download engine, I want to store retry count so that retry policy is enforced.
  • FR-6.17 — As the download engine, I want to store status so that state survives restarts.
  • FR-6.18 — As the download engine, I want each segment recoverable after application restart so that progress is not lost.
  • FR-6.19 — As the download engine, I want to never re-download completed segments so that recovery is efficient.
Page 10 of 30

3.7 Pause and Resume

  • FR-7.1 — As the download engine, I want pause to stop active network operations safely so that no data is corrupted.
  • FR-7.2 — As the download engine, I want pause to flush file buffers so that written data is durable.
  • FR-7.3 — As the download engine, I want pause to save segment offsets so that resume positions are accurate.
  • FR-7.4 — As the download engine, I want pause to persist current state so that pause survives restart.
  • FR-7.5 — As the download engine, I want resume to revalidate the remote file so that the same file is resumed.
  • FR-7.6 — As the download engine, I want resume to compare ETag so that changes are detected.
  • FR-7.7 — As the download engine, I want resume to compare Last-Modified so that changes are detected.
  • FR-7.8 — As the download engine, I want resume to compare Content-Length so that changes are detected.
  • FR-7.9 — As the download engine, I want resume to determine whether the remote file changed so that the user is informed.
  • FR-7.10 — As the download engine, I want to resume existing ranges when the file is unchanged so that progress is preserved.
  • FR-7.11 — As the download engine, I want to warn the user when the remote file changed so that a mismatched resume is avoided.
  • FR-7.12 — As the download engine, I want to restart from zero only after informing the user when resume is unsupported so that the user consents.

3.8 Crash Recovery

  • FR-8.1 — As the download engine, I want downloads to survive application crashes so that partial data is retained.
  • FR-8.2 — As the download engine, I want downloads to survive system restart so that recovery occurs on next launch.
  • FR-8.3 — As the download engine, I want downloads to survive network loss so that they can resume when connectivity returns.
  • FR-8.4 — As the download engine, I want downloads to survive sleep so that wake does not lose progress.
  • FR-8.5 — As the download engine, I want downloads to survive hibernate so that resume is complete.
  • FR-8.6 — As the download engine, I want to scan unfinished downloads on startup so that recoverable items are found.
  • FR-8.7 — As the download engine, I want to validate temporary files during recovery so that state matches disk.
  • FR-8.8 — As the download engine, I want to validate database metadata during recovery so that records are consistent.
  • FR-8.9 — As the download engine, I want to validate segment offsets during recovery so that ranges are correct.
  • FR-8.10 — As the download engine, I want to restore state after validation so that downloads continue.
  • FR-8.11 — As the download engine, I want possible recovery states of Paused, Interrupted, Queued, Recoverable, and Invalid so that outcomes are explicit.
  • FR-8.12 — As the download engine, I want to never silently discard partial downloads so that user data is protected.
Page 11 of 30

3.9 Retry System

  • FR-9.1 — As the download engine, I want to retry on DNS failure so that transient resolution errors recover.
  • FR-9.2 — As the download engine, I want to retry on connection reset so that dropped connections recover.
  • FR-9.3 — As the download engine, I want to retry on timeout so that slow responses recover.
  • FR-9.4 — As the download engine, I want to retry on TLS interruption so that secure-connection failures recover.
  • FR-9.5 — As the download engine, I want to retry on HTTP 408 so that request timeouts recover.
  • FR-9.6 — As the download engine, I want to retry on HTTP 429 so that rate-limited requests back off.
  • FR-9.7 — As the download engine, I want to retry on HTTP 500, 502, 503, and 504 so that server errors recover.
  • FR-9.8 — As the download engine, I want to use exponential backoff (e.g. 1s, 2s, 4s, 8s, 16s, 30s, 60s) so that retries are paced.
  • FR-9.9 — As the download engine, I want to add randomized jitter so that retries are de-synchronized.
  • FR-9.10 — As the download engine, I want to respect Retry-After so that server guidance is honored.
  • FR-9.11 — As the download engine, I want to not aggressively retry permanent errors (400, 401, 403, 404, 410) so that futile retries are avoided.
  • FR-9.12 — As the download engine, I want permanent errors treated appropriately so that users receive meaningful outcomes.

3.10 Bandwidth Management

  • FR-10.1 — As a user, I want a global bandwidth limiter so that downloads do not saturate my connection.
  • FR-10.2 — As the download engine, I want to use a token bucket or equivalent algorithm so that rate limiting is smooth.
  • FR-10.3 — As a user, I want an Unlimited mode so that no limit is applied.
  • FR-10.4 — As a user, I want preset modes Slow, Medium, and Fast so that I can choose quickly.
  • FR-10.5 — As a user, I want a custom limit in KB/s or MB/s so that I can set a precise rate.
  • FR-10.6 — As a user, I want a global speed limit so that all downloads share a cap.
  • FR-10.7 — As a user, I want a per-download speed limit so that individual transfers can be capped.
  • FR-10.8 — As a user, I want a scheduled speed limit (e.g. 09:00–17:00 at 2 MB/s, 17:00–09:00 unlimited) so that limits follow a timetable.
Page 12 of 30

3.11 Download Queues

  • FR-11.1 — As a user, I want to create queues such as Main Downloads, Large Files, Night Queue, Videos, Software, and Documents so that downloads are grouped.
  • FR-11.2 — As a user, I want each queue to define maximum concurrent downloads so that concurrency is controlled per group.
  • FR-11.3 — As a user, I want each queue to define priority so that queue order is controlled.
  • FR-11.4 — As a user, I want each queue to define start time and stop time so that transfers run within windows.
  • FR-11.5 — As a user, I want each queue to define a bandwidth limit so that queues can throttle independently.
  • FR-11.6 — As a user, I want each queue to define a retry policy so that retry behavior is per queue.
  • FR-11.7 — As a user, I want drag-and-drop ordering of downloads so that I can reprioritize visually.
  • FR-11.8 — As a user, I want priority levels High, Normal, and Low so that I can rank downloads.

3.12 Scheduler

  • FR-12.1 — As a user, I want to start downloads at a specific time (e.g. 01:00 AM) so that transfers run on my schedule.
  • FR-12.2 — As a user, I want to stop downloads at a specific time (e.g. 06:00 AM) so that transfers end predictably.
  • FR-12.3 — As a user, I want recurring schedules on selected Days (e.g. Monday–Friday) so that downloads repeat automatically.
  • FR-12.4 — As a user, I want an optional post-completion action of "Do nothing" so that the system is left untouched.
  • FR-12.5 — As a user, I want an optional post-completion action of "Close application" so that the app shuts down after completion.
  • FR-12.6 — As a user, I want an optional post-completion action of "Sleep system" so that the machine sleeps after completion.
  • FR-12.7 — As a user, I want an optional post-completion action of "Hibernate system" so that the machine hibernates after completion.
  • FR-12.8 — As a user, I want an optional post-completion action of "Shutdown system" so that the machine shuts down after completion.
  • FR-12.9 — As a user, I want explicit confirmation required before any power-management action so that I never lose work unintentionally.
Page 13 of 30

3.13 Download Categories

  • FR-13.1 — As a user, I want files automatically categorized so that downloads are organized without manual effort.
  • FR-13.2 — As a user, I want a Compressed category for archives such as .zip, .rar, .7z, .tar, and .gz.
  • FR-13.3 — As a user, I want a Documents category for files such as .pdf, .docx, .xlsx, and .pptx.
  • FR-13.4 — As a user, I want a Music category for files such as .mp3, .flac, and .wav.
  • FR-13.5 — As a user, I want a Videos category for files such as .mp4, .mkv, .webm, and .mov.
  • FR-13.6 — As a user, I want a Programs category for files such as .exe, .msi, .dmg, .pkg, and .AppImage.
  • FR-13.7 — As a user, I want an Images category for image files.
  • FR-13.8 — As a user, I want a Disk Images category for files such as .iso and .img.
  • FR-13.9 — As a user, I want an Other category as a catch-all.
  • FR-13.10 — As a user, I want to create custom categories so that categorization matches my needs.
  • FR-13.11 — As a user, I want category rules based on extension so that file types route correctly.
  • FR-13.12 — As a user, I want category rules based on MIME type so that ambiguous extensions route correctly.
  • FR-13.13 — As a user, I want category rules based on hostname so that downloads from specific hosts route correctly.
  • FR-13.14 — As a user, I want category rules based on URL pattern so that routing is flexible.
  • FR-13.15 — As a user, I want each category to have a default destination directory so that files land in the right place.

3.14 File Naming

  • FR-14.1 — As the download engine, I want filename determination in order: Content-Disposition filename*, Content-Disposition filename, URL filename, MIME-derived fallback, generated filename, so that naming is deterministic.
  • FR-14.2 — As the download engine, I want filenames sanitized for Windows so that invalid characters are removed.
  • FR-14.3 — As the download engine, I want filenames sanitized for macOS so that invalid characters are removed.
  • FR-14.4 — As the download engine, I want filenames sanitized for Linux so that invalid characters are removed.
  • FR-14.5 — As a user, I want a duplicate-file option "Ask" so that I decide each conflict.
  • FR-14.6 — As a user, I want a duplicate-file option "Overwrite" so that existing files are replaced.
  • FR-14.7 — As a user, I want a duplicate-file option "Rename automatically" so that conflicts resolve automatically.
  • FR-14.8 — As a user, I want a duplicate-file option "Skip" so that existing files are left untouched.
  • FR-14.9 — As a user, I want automatic naming like file.zip, file (1).zip, file (2).zip so that duplicates are distinguished.
Page 14 of 30

3.15 Browser Integration

  • FR-15.1 — As a user, I want a Chrome extension so that Chrome downloads integrate with FluxGet.
  • FR-15.2 — As a user, I want an Edge extension so that Edge downloads integrate with FluxGet.
  • FR-15.3 — As a user, I want a Firefox extension where supported so that Firefox downloads integrate where APIs permit.
  • FR-15.4 — As the extension, I want to use documented browser APIs only so that integration is legitimate and stable.
  • FR-15.5 — As a user, I want download interception in the extension so that browser transfers route to FluxGet.
  • FR-15.6 — As a user, I want context-menu actions in the extension so that I can trigger downloads from the menu.
  • FR-15.7 — As a user, I want a "Download with [App]" action so that links can be sent to FluxGet.
  • FR-15.8 — As a user, I want a "Download all links with [App]" action so that many links can be sent at once.
  • FR-15.9 — As a user, I want to send the current page URL so that page-level downloads are possible.
  • FR-15.10 — As a user, I want to send a selected link so that single-link downloads are possible.
  • FR-15.11 — As a user, I want optional media detection when URLs are directly exposed to the browser so that public media can be downloaded.
  • FR-15.12 — As the extension, I want to communicate with the desktop app via Native Messaging or a secure authenticated local service so that messaging is safe.
  • FR-15.13 — As the extension, I want to prefer Native Messaging where practical so that the most secure channel is used.

3.16 Download Interception

  • FR-16.1 — As the extension, I want to hand the URL to the desktop download manager when browser APIs permit so that transfers are intercepted.
  • FR-16.2 — As the extension, I want to pass the URL so that the download target is known.
  • FR-16.3 — As the extension, I want to pass a filename suggestion so that naming is preserved.
  • FR-16.4 — As the extension, I want to pass the referrer so that referrer-restricted downloads work.
  • FR-16.5 — As the extension, I want to pass the user agent where appropriate so that server expectations are met.
  • FR-16.6 — As the extension, I want to pass cookies where browser APIs and user permission allow so that authenticated downloads work.
  • FR-16.7 — As the extension, I want to pass request headers where permitted so that downloads succeed.
  • FR-16.8 — As a user, I want domain exclusions so that I can prevent interception from specified domains (e.g. example.com, localhost, banking websites).
  • FR-16.9 — As a user, I want file-type exclusions so that I can prevent interception of specified types (e.g. .html, .php).
Page 15 of 30

3.17 Clipboard Monitoring

  • FR-17.1 — As a user, I want clipboard monitoring to be optional and opt-in so that my clipboard is not read without consent.
  • FR-17.2 — As the clipboard monitor, I want to monitor the clipboard for HTTP/HTTPS URLs when enabled so that copy-paste downloads are offered.
  • FR-17.3 — As the clipboard monitor, I want to detect when copied text looks like a downloadable file URL so that offers are relevant.
  • FR-17.4 — As a user, I want a "Download detected" offer with Download and Ignore actions so that I control the outcome.
  • FR-17.5 — As the clipboard monitor, I want to never upload clipboard contents anywhere so that privacy is preserved.

3.18 Authentication

  • FR-18.1 — As a user, I want Basic Auth support so that credentialed downloads work.
  • FR-18.2 — As a user, I want Bearer token support when explicitly supplied so that token-authenticated downloads work.
  • FR-18.3 — As a user, I want session cookie support when available through browser integration and permitted APIs so that session downloads work.
  • FR-18.4 — As a user, I want custom request header support so that unusual auth schemes work.
  • FR-18.5 — As a user, I want credentials stored using OS credential facilities (Windows Credential Manager, macOS Keychain, Linux Secret Service) so that secrets are protected.
  • FR-18.6 — As the system, I want to never store passwords in plaintext SQLite fields so that credential leakage is prevented.

3.19 Cookie Handling

  • FR-19.1 — As the cookie handler, I want cookies provided by browser integration to be associated only with appropriate domains so that cookies are not misdirected.
  • FR-19.2 — As the cookie handler, I want to honor the domain attribute so that cookies apply correctly.
  • FR-19.3 — As the cookie handler, I want to honor the path attribute so that cookies apply correctly.
  • FR-19.4 — As the cookie handler, I want to honor the expiry attribute so that cookie lifetime is respected.
  • FR-19.5 — As the cookie handler, I want to honor the secure attribute so that secure cookies are only sent over secure channels.
  • FR-19.6 — As the cookie handler, I want to honor SameSite semantics where relevant so that cookie behavior matches browser expectations.
  • FR-19.7 — As the system, I want sensitive cookie values to never be logged so that secrets are not leaked.
  • FR-19.8 — As a user, I want a "Do not persist authentication cookies" option so that I can keep cookies session-only.
Page 16 of 30

3.20 Referrer and Headers

  • FR-20.1 — As a user, I want Referer support so that referrer-restricted downloads work.
  • FR-20.2 — As a user, I want Origin support so that cross-origin-restricted downloads work.
  • FR-20.3 — As a user, I want User-Agent support so that UA-restricted downloads work.
  • FR-20.4 — As a user, I want Authorization support so that auth headers can be supplied.
  • FR-20.5 — As a user, I want Cookie support so that cookie-gated downloads work.
  • FR-20.6 — As a user, I want to support custom headers per download so that specific servers are satisfied.
  • FR-20.7 — As the system, I want sensitive headers redacted from logs so that secrets are not leaked.

3.21 Expiring Download Links

  • FR-21.1 — As the download engine, I want to detect 403 and 410 responses as expired-link symptoms so that expiry is recognized.
  • FR-21.2 — As the download engine, I want to detect "signature expired" and "token expired" symptoms so that signed-URL expiry is recognized.
  • FR-21.3 — As the download engine, I want to mark the download as "URL expired" so that the user is informed.
  • FR-21.4 — As the download engine, I want to allow URL refresh when browser integration can legally obtain a refreshed URL by user reinitiation, so that downloads continue.
  • FR-21.5 — As the download engine, I want to preserve completed segments only if the new file is proven identical, so that mismatched data is never concatenated.
  • FR-21.6 — As the download engine, I want to verify identity using file size so that mismatches are detected.
  • FR-21.7 — As the download engine, I want to verify identity using ETag so that mismatches are detected.
  • FR-21.8 — As the download engine, I want to verify identity using Last-Modified so that mismatches are detected.
  • FR-21.9 — As the download engine, I want to verify identity using a checksum if known so that mismatches are detected.
Page 17 of 30

3.22 Media Detection

  • FR-22.1 — As a user, I want optional detection of downloadable media only where media URLs are actually exposed through supported browser/network APIs so that detection is legitimate.
  • FR-22.2 — As the system, I want no DRM circumvention so that protected content is never extracted.
  • FR-22.3 — As the system, I want no bypass of encrypted media systems so that protected streams are never broken.
  • FR-22.4 — As the system, I want no defeating of access controls so that restrictions are respected.
  • FR-22.5 — As a user, I want direct MP4 support so that ordinary video URLs download.
  • FR-22.6 — As a user, I want WebM support so that ordinary video URLs download.
  • FR-22.7 — As a user, I want audio file support so that ordinary audio URLs download.
  • FR-22.8 — As a user, I want publicly accessible media URL support so that open media downloads.
  • FR-22.9 — As a user, I want HLS/DASH support only for non-DRM streams the user is authorized to download and where permitted.
  • FR-22.10 — As a user, I want .m3u8 manifest parsing so that HLS streams are recognized.
  • FR-22.11 — As a user, I want .mpd manifest parsing so that DASH streams are recognized.
  • FR-22.12 — As a user, I want available quality shown so that I can choose a rendition.
  • FR-22.13 — As a user, I want resolution shown so that I can choose a rendition.
  • FR-22.14 — As a user, I want codec shown so that I can choose a rendition.
  • FR-22.15 — As a user, I want audio track shown so that I can choose a rendition.
  • FR-22.16 — As a user, I want estimated size shown so that I can plan the download.
  • FR-22.17 — As the media layer, I want to use ffmpeg only when legally and technically appropriate for merging separately downloaded media tracks.
  • FR-22.18 — As the media layer, I want to never attempt to remove DRM.
Page 18 of 30

3.23 Batch Downloads

  • FR-23.1 — As a user, I want to add many links at once so that bulk downloads are efficient.
  • FR-23.2 — As a user, I want to paste multiple URLs so that bulk entry is fast.
  • FR-23.3 — As a user, I want to import URLs from a text file so that lists can be loaded.
  • FR-23.4 — As a user, I want to download selected links from a webpage so that page assets can be captured.
  • FR-23.5 — As a user, I want pattern generation (e.g. image[001:100].jpg → image001 … image100) so that numbered URL sets are generated.
  • FR-23.6 — As a user, I want a pattern UI so that patterns can be configured interactively.
  • FR-23.7 — As a user, I want a preview before adding downloads so that I can verify generated URLs.

3.24 Download All Links

  • FR-24.1 — As a user, I want a browser extension "Download all links with [App]" action so that all page links can be captured.
  • FR-24.2 — As the extension, I want to extract links from the current page DOM so that page resources are listed.
  • FR-24.3 — As a user, I want a selection window showing URL, filename, file type, and domain so that I can choose links.
  • FR-24.4 — As a user, I want filters for Images, Documents, Videos, Archives, Programs, and Custom extensions so that listings are narrowed.
  • FR-24.5 — As a user, I want to explicitly select which files to download so that nothing downloads without my choice.

3.25 Proxy Support

  • FR-25.1 — As a user, I want System proxy support so that the OS proxy is used.
  • FR-25.2 — As a user, I want HTTP proxy support so that HTTP traffic can be routed.
  • FR-25.3 — As a user, I want HTTPS proxy support so that HTTPS traffic can be routed.
  • FR-25.4 — As a user, I want SOCKS5 proxy support where the stack permits.
  • FR-25.5 — As a user, I want proxy configuration with host, port, username, and password so that authenticated proxies work.
  • FR-25.6 — As a user, I want a global proxy setting so that all downloads route through one proxy.
  • FR-25.7 — As a user, I want per-domain proxy exclusions so that specific hosts bypass the proxy.
  • FR-25.8 — As the system, I want proxy secrets stored securely so that credentials are not exposed.
Page 19 of 30

3.26 DNS and Connection Handling

  • FR-26.1 — As the download engine, I want IPv4 support so that IPv4-only hosts work.
  • FR-26.2 — As the download engine, I want IPv6 support so that IPv6 hosts work.
  • FR-26.3 — As the download engine, I want DNS failure handling so that resolution errors are reported clearly.
  • FR-26.4 — As the download engine, I want connection timeout handling so that stalled connects fail cleanly.
  • FR-26.5 — As the download engine, I want read timeout handling so that stalled reads fail cleanly.
  • FR-26.6 — As the download engine, I want slow-server handling so that slow responses are tolerated.
  • FR-26.7 — As the download engine, I want TLS error handling so that secure-connection failures are reported.
  • FR-26.8 — As a user, I want a configurable connection timeout so that connect behavior is tunable.
  • FR-26.9 — As a user, I want a configurable read timeout so that read behavior is tunable.
  • FR-26.10 — As the download engine, I want certificate validation never disabled by default so that security is preserved.
  • FR-26.11 — As a user, I want a clear warning when an invalid certificate is encountered so that I make an informed decision.

3.27 File Preallocation

  • FR-27.1 — As a user, I want optional preallocation of destination space for known file sizes so that storage is reserved.
  • FR-27.2 — As the file manager, I want preallocation to reduce fragmentation so that disk performance is preserved.
  • FR-27.3 — As the file manager, I want preallocation to detect insufficient disk space early so that failures are caught up front.
  • FR-27.4 — As the file manager, I want to verify free space before download so that failures are prevented.
  • FR-27.5 — As the file manager, I want to estimate file size plus temporary overhead so that space checks are accurate.
  • FR-27.6 — As the file manager, I want to warn if disk space is insufficient so that the user is informed.
Page 20 of 30

3.28 Disk Write Architecture

  • FR-28.1 — As the download engine, I want to avoid unsafe concurrent writes so that data integrity is preserved.
  • FR-28.2 — As the download engine, I want positioned writes directly into a preallocated file (segment writes at known byte offsets) so that segments do not conflict.
  • FR-28.3 — As the download engine, I want to use platform-specific positioned I/O where appropriate so that performance is optimal.
  • FR-28.4 — As the download engine, I want segment boundaries that cannot overlap so that data is not corrupted.
  • FR-28.5 — As the download engine, I want integrity checks maintained so that corruption is detected.
  • FR-28.6 — As the download engine, I want periodic metadata flushing without excessive fsync operations so that durability and performance are balanced.

3.29 Checksum Verification

  • FR-29.1 — As a user, I want optional checksum verification so that I can confirm file integrity.
  • FR-29.2 — As a user, I want MD5 support for compatibility.
  • FR-29.3 — As a user, I want SHA-1 support for compatibility.
  • FR-29.4 — As a user, I want SHA-256 support (recommended).
  • FR-29.5 — As a user, I want SHA-512 support.
  • FR-29.6 — As a user, I want to paste an expected hash so that verification uses my reference.
  • FR-29.7 — As the download engine, I want to calculate the actual checksum after completion so that results can be compared.
  • FR-29.8 — As a user, I want a "Verified" or "Mismatch" result displayed so that I know the outcome.
  • FR-29.9 — As the system, I want to never claim a file is safe merely because a checksum matches unless the expected checksum came from a trusted source.
Page 21 of 30

3.30 Download Information Window

  • FR-30.1 — As a user, I want to see the URL before starting a download.
  • FR-30.2 — As a user, I want to see the resolved URL before starting a download.
  • FR-30.3 — As a user, I want to see the filename before starting a download.
  • FR-30.4 — As a user, I want to see the file size before starting a download.
  • FR-30.5 — As a user, I want to see the file type before starting a download.
  • FR-30.6 — As a user, I want to see the destination before starting a download.
  • FR-30.7 — As a user, I want to see the category before starting a download.
  • FR-30.8 — As a user, I want to see the server before starting a download.
  • FR-30.9 — As a user, I want to see resume support before starting a download.
  • FR-30.10 — As a user, I want Start, Download Later, and Cancel buttons so that I control initiation.
  • FR-30.11 — As a user, I want to set connection count, queue, category, and speed limit as options so that the download is configured.

3.31 Active Download Window

  • FR-31.1 — As a user, I want to see the filename of active downloads.
  • FR-31.2 — As a user, I want a progress bar for active downloads.
  • FR-31.3 — As a user, I want to see downloaded bytes (e.g. 734 MB / 1.2 GB).
  • FR-31.4 — As a user, I want to see progress percentage (e.g. 61%).
  • FR-31.5 — As a user, I want to see current speed (e.g. 12.4 MB/s).
  • FR-31.6 — As a user, I want to see average speed (e.g. 10.8 MB/s).
  • FR-31.7 — As a user, I want to see time remaining (e.g. 42 sec).
  • FR-31.8 — As a user, I want to see the connection count (e.g. 8).
  • FR-31.9 — As a user, I want to see the status (e.g. Downloading).
  • FR-31.10 — As a user, I want a graphical segment visualization.
  • FR-31.11 — As a user, I want optional visual display of each active connection.
Page 22 of 30

3.32 Main Application UI

  • FR-32.1 — As a user, I want a left navigation with All Downloads, Unfinished, Finished, Queues, and Scheduler.
  • FR-32.2 — As a user, I want categories in the navigation: Compressed, Documents, Music, Videos, Programs, Images, and Other.
  • FR-32.3 — As a user, I want a main table with columns Name, Size, Status, Progress, Speed, Time Left, Added, Completed, URL, and Category.
  • FR-32.4 — As a user, I want a toolbar with Add URL, Resume, Stop, Stop All, Delete, Delete Completed, Options, and Scheduler.
  • FR-32.5 — As a user, I want search so that I can find downloads.
  • FR-32.6 — As a user, I want sorting so that I can order the list.
  • FR-32.7 — As a user, I want column customization so that I can tailor the table.
  • FR-32.8 — As a user, I want keyboard shortcuts so that I can operate quickly.
  • FR-32.9 — As a user, I want a context menu so that common actions are accessible.

3.33 Add URL Window

  • FR-33.1 — As a user, I want a URL input field so that I can enter a download target.
  • FR-33.2 — As a user, I want an optional Referrer advanced field.
  • FR-33.3 — As a user, I want an optional User Agent advanced field.
  • FR-33.4 — As a user, I want an optional Username advanced field.
  • FR-33.5 — As a user, I want an optional Password advanced field.
  • FR-33.6 — As a user, I want an optional Headers advanced field.
  • FR-33.7 — As a user, I want Analyze, Download, and Download Later buttons.
  • FR-33.8 — As a user, I want to see filename, size, resume capability, MIME, and server information after Analyze.
Page 23 of 30

3.34 Download History

  • FR-34.1 — As a user, I want history stored in SQLite so that records persist.
  • FR-34.2 — As a user, I want history fields: ID, URL, final URL, filename, destination, size, downloaded bytes, created time, completed time, status, category, queue, average speed, and checksum.
  • FR-34.3 — As a user, I want to search history so that records are findable.
  • FR-34.4 — As a user, I want to clear selected history entries.
  • FR-34.5 — As a user, I want to clear completed history entries.
  • FR-34.6 — As a user, I want to export history so that records can be archived.

3.35 Database Design

  • FR-35.1 — As the system, I want normalized SQLite tables so that data is structured.
  • FR-35.2 — As the system, I want a downloads table.
  • FR-35.3 — As the system, I want a segments table.
  • FR-35.4 — As the system, I want a queues table.
  • FR-35.5 — As the system, I want a queue_items table.
  • FR-35.6 — As the system, I want a categories table.
  • FR-35.7 — As the system, I want a scheduler_rules table.
  • FR-35.8 — As the system, I want a settings table.
  • FR-35.9 — As the system, I want a host_rules table.
  • FR-35.10 — As the system, I want a history_events table.
  • FR-35.11 — As the system, I want downloads fields: id, url, resolved_url, filename, temp_path, destination_path, file_size, downloaded_bytes, status, etag, last_modified, mime_type, category_id, queue_id, priority, connections, created_at, updated_at, completed_at.
  • FR-35.12 — As the system, I want segments fields: id, download_id, start_byte, end_byte, current_byte, status, retry_count.
  • FR-35.13 — As the system, I want database migrations so that schema changes are managed.
Page 24 of 30

3.36 Settings

  • FR-36.1 — As a user, I want "Start with operating system" so that the app launches on login.
  • FR-36.2 — As a user, I want "Minimize to tray" so that the app can collapse to tray.
  • FR-36.3 — As a user, I want "Close to tray" so that closing hides to tray.
  • FR-36.4 — As a user, I want "Confirm deletion" so that destructive actions are confirmed.
  • FR-36.5 — As a user, I want "Remember last download directory" so that recent folders are reused.
  • FR-36.6 — As a user, I want a default directory setting so that downloads land in a chosen folder.
  • FR-36.7 — As a user, I want a temporary directory setting so that partial files are placed where I choose.
  • FR-36.8 — As a user, I want a default connections setting so that parallelism is personalized.
  • FR-36.9 — As a user, I want an automatic start setting so that new downloads begin automatically.
  • FR-36.10 — As a user, I want a retry attempts setting so that retry aggressiveness is controlled.
  • FR-36.11 — As a user, I want a timeout setting so that connection behavior is controlled.
  • FR-36.12 — As a user, I want "Enable Chrome", "Enable Edge", and "Enable Firefox" browser integration toggles.
  • FR-36.13 — As a user, I want an "Intercept downloads" toggle so that interception can be disabled.
  • FR-36.14 — As a user, I want "Ignored sites" so that interception is skipped for chosen domains.
  • FR-36.15 — As a user, I want "Ignored extensions" so that interception is skipped for chosen file types.
  • FR-36.16 — As a user, I want a Proxy network setting so that routing is configured.
  • FR-36.17 — As a user, I want a Speed limit network setting so that bandwidth is configured.
  • FR-36.18 — As a user, I want a "Maximum simultaneous downloads" network setting so that concurrency is capped.
  • FR-36.19 — As a user, I want Appearance options Light, Dark, and System.
  • FR-36.20 — As a user, I want notification toggles for Download completed, Download failed, and Queue completed.
Page 25 of 30

3.37 Security

  • FR-37.1 — As the system, I want to never disable TLS validation globally so that transport security is preserved.
  • FR-37.2 — As the system, I want to never log credentials so that secrets stay private.
  • FR-37.3 — As the system, I want to never log cookies so that session material stays private.
  • FR-37.4 — As the system, I want to never store plaintext passwords so that credentials are protected.
  • FR-37.5 — As the system, I want to never execute downloaded files automatically without user action so that malware does not run.
  • FR-37.6 — As the system, I want to never trust file names returned by servers without sanitization so that malicious names are neutralized.
  • FR-37.7 — As the system, I want to disallow path traversal and protect against filenames such as ../../evil.exe so that files cannot escape the destination.
  • FR-37.8 — As the system, I want to use canonical destination paths so that path confusion is prevented.
  • FR-37.9 — As the system, I want to sanitize filenames so that invalid or dangerous names are corrected.
  • FR-37.10 — As the system, I want to validate browser-extension messages so that spoofed messages are rejected.
  • FR-37.11 — As the system, I want to authenticate any local IPC connection so that only trusted clients control downloads.
  • FR-37.12 — As the system, I want any local HTTP/WebSocket service to bind to localhost only so that remote access is impossible.
  • FR-37.13 — As the system, I want a random authentication token for local services so that unauthorized callers are blocked.
  • FR-37.14 — As the system, I want to rotate the local token when appropriate so that token exposure is limited.
  • FR-37.15 — As the system, I want to verify Origin when possible so that cross-origin abuse is prevented.
  • FR-37.16 — As the system, I want to never expose download-control endpoints publicly so that remote control is impossible.
Page 26 of 30

3.38 Privacy

  • FR-38.1 — As a user, I want the application to work locally by default so that my data stays on my machine.
  • FR-38.2 — As a user, I want download history never sent to external analytics servers.
  • FR-38.3 — As a user, I want URLs never sent to external analytics servers.
  • FR-38.4 — As a user, I want cookies never sent to external analytics servers.
  • FR-38.5 — As a user, I want filenames never sent to external analytics servers.
  • FR-38.6 — As a user, I want clipboard data never sent to external analytics servers.
  • FR-38.7 — As a user, I want credentials never sent to external analytics servers.
  • FR-38.8 — As a user, I want any telemetry, if ever implemented, to be strictly opt-in and transparent.

3.39 Network Performance

  • FR-39.1 — As the download engine, I want to build around asynchronous I/O so that many downloads scale efficiently.
  • FR-39.2 — As the download engine, I want to avoid one OS thread per connection so that resource use stays low.
  • FR-39.3 — As the download engine, I want to use an async runtime so that concurrency is efficient.
  • FR-39.4 — As the download engine, I want to support many active downloads while maintaining a responsive UI.
  • FR-39.5 — As the download engine, I want backpressure between network reads, disk writes, and UI event updates so that no stage is overwhelmed.
  • FR-39.6 — As the download engine, I want to not send UI progress events for every received packet so that the UI is not flooded.
  • FR-39.7 — As the download engine, I want to throttle progress updates (e.g. 5–10 UI updates per second) so that updates are smooth and cheap.

3.40 Memory Management

  • FR-40.1 — As the download engine, I want to never load full downloads into memory so that memory stays bounded.
  • FR-40.2 — As the download engine, I want to stream network chunks directly to disk so that large files do not consume RAM.
  • FR-40.3 — As the download engine, I want tunable chunk sizes (e.g. 64 KB, 256 KB, 1 MB) so that performance can be benchmarked and tuned.
  • FR-40.4 — As the download engine, I want bounded buffers so that memory use is predictable.
  • FR-40.5 — As the download engine, I want a 100 GB file to use roughly the same RAM scale as a 1 GB file so that scaling is flat.
Page 27 of 30

3.41 Large File Support

  • FR-41.1 — As a user, I want support for files larger than 4 GB.
  • FR-41.2 — As a user, I want support for files larger than 100 GB.
  • FR-41.3 — As the download engine, I want to use 64-bit offsets so that large files are addressed correctly.
  • FR-41.4 — As the download engine, I want to correctly handle filesystems with size constraints so that limits are respected.
  • FR-41.5 — As a user, I want a warning when the destination filesystem cannot hold the target file.

3.42 Download Completion

  • FR-42.1 — As the download engine, I want to ensure every expected byte range exists before completion.
  • FR-42.2 — As the download engine, I want to validate total file size before completion.
  • FR-42.3 — As the download engine, I want to flush the file before completion.
  • FR-42.4 — As the download engine, I want to optionally verify the checksum before completion.
  • FR-42.5 — As the download engine, I want to atomically move the .part file into the final filename where possible.
  • FR-42.6 — As the download engine, I want to mark the database record completed.
  • FR-42.7 — As the download engine, I want to trigger a notification on completion.
  • FR-42.8 — As the download engine, I want to never mark a download complete before file integrity checks pass.

3.43 Download Deletion

  • FR-43.1 — As a user, I want a "Remove from list" action so that entries can be removed without deleting files.
  • FR-43.2 — As a user, I want a "Delete downloaded file" action so that completed files can be removed.
  • FR-43.3 — As a user, I want a "Delete partial file" action so that partial data can be removed.
  • FR-43.4 — As a user, I want a "Remove completed items" action so that finished entries can be cleared in bulk.
  • FR-43.5 — As a user, I want destructive file deletion to always be confirmed unless I have disabled confirmations.
Page 28 of 30

3.44 Event System

  • FR-44.1 — As the system, I want an internal event bus so that components communicate loosely.
  • FR-44.2 — As the system, I want a DownloadAdded event.
  • FR-44.3 — As the system, I want a DownloadStarted event.
  • FR-44.4 — As the system, I want a DownloadProgress event.
  • FR-44.5 — As the system, I want a DownloadPaused event.
  • FR-44.6 — As the system, I want a DownloadResumed event.
  • FR-44.7 — As the system, I want a DownloadFailed event.
  • FR-44.8 — As the system, I want a DownloadCompleted event.
  • FR-44.9 — As the system, I want a QueueStarted event.
  • FR-44.10 — As the system, I want a QueueFinished event.
  • FR-44.11 — As the system, I want a NetworkChanged event.
  • FR-44.12 — As the system, I want a DiskSpaceLow event.
  • FR-44.13 — As the system, I want the UI to subscribe to events rather than coupling directly to downloader internals.

3.45 Network Change Recovery

  • FR-45.1 — As the download engine, I want to detect network disconnects so that recovery can begin.
  • FR-45.2 — As the download engine, I want to detect Wi-Fi changes so that transfers survive network switches.
  • FR-45.3 — As the download engine, I want to detect system resume from sleep so that recovery is triggered.
  • FR-45.4 — As the download engine, I want to retry interrupted downloads according to settings when connectivity returns.
  • FR-45.5 — As the download engine, I want to avoid immediately launching hundreds of simultaneous retry requests.
  • FR-45.6 — As the download engine, I want to use staggered retry so that reconnection is gentle.
Page 29 of 30

3.46 Power-Aware Behavior

  • FR-46.1 — As a user, I want downloads paused when the system enters sleep.
  • FR-46.2 — As a user, I want downloads restored after wake.
  • FR-46.3 — As a user, I want an optional setting to prevent sleep while active downloads are running.
  • FR-46.4 — As a user, I want the sleep-prevention behavior to be user-configurable.

3.47 System Tray

  • FR-47.1 — As a user, I want a tray icon menu with an "Open" action.
  • FR-47.2 — As a user, I want a tray menu "Add URL" action.
  • FR-47.3 — As a user, I want a tray menu "Pause All" action.
  • FR-47.4 — As a user, I want a tray menu "Resume All" action.
  • FR-47.5 — As a user, I want a tray menu "Speed Limit" action.
  • FR-47.6 — As a user, I want a tray menu "Exit" action.
  • FR-47.7 — As a user, I want a tray tooltip showing active download count and current speed (e.g. "3 downloads / 18.4 MB/s").

3.48 Desktop Notifications

  • FR-48.1 — As a user, I want a "Download completed" notification.
  • FR-48.2 — As a user, I want a "Download failed" notification.
  • FR-48.3 — As a user, I want a "Queue completed" notification.
  • FR-48.4 — As a user, I want notifications to include filename, action, and size (e.g. "Ubuntu.iso — Download completed — 3.8 GB").
  • FR-48.5 — As a user, I want clicking a notification to open the containing folder where OS APIs permit.
Page 30 of 30

3.49 Logging

  • FR-49.1 — As the system, I want structured logs so that diagnostics are machine-readable.
  • FR-49.2 — As the system, I want log levels ERROR, WARN, INFO, DEBUG, and TRACE.
  • FR-49.3 — As the system, I want cookies redacted from logs.
  • FR-49.4 — As the system, I want authorization headers redacted from logs.
  • FR-49.5 — As the system, I want passwords redacted from logs.
  • FR-49.6 — As the system, I want signed query parameters redacted from logs where appropriate.
Landing design preview
Landing: Review product overview
Sign Up: Create local account
Login: Sign in
All Downloads: View download list
Queues: Create download queue
Queues: Set concurrency and priority
Queues: Set start and stop windows
Queues: Set bandwidth and retry policy
Queues: Reorder queued downloads
Add URL: Open URL entry
Add URL Window: Enter download URL
Download Information Window: Assign queue and options
Scheduler: Create schedule rule
Scheduler: Set start and stop times
Scheduler: Set recurring days
Scheduler: Choose post-completion action
Scheduler: Confirm power action
Options: Set default connections
Options: Set timeouts and retries
Options: Set maximum simultaneous downloads
Options: Set scheduled speed limits
Options: Configure sleep prevention
All Downloads: Launch scheduled queue
Active Download Window: Monitor unattended progress
Finished: Confirm completion and history
Unfinished: Review interrupted queue state
Landing design preview
Landing: Review product overview
Sign Up: Create local account
Login: Sign in
All Downloads: View download list
Queues: Create download queue
Queues: Set concurrency and priority
Queues: Set start and stop windows
Queues: Set bandwidth and retry policy
Queues: Reorder queued downloads
Add URL: Open URL entry
Add URL Window: Enter download URL
Download Information Window: Assign queue and options
Scheduler: Create schedule rule
Scheduler: Set start and stop times
Scheduler: Set recurring days
Scheduler: Choose post-completion action
Scheduler: Confirm power action
Options: Set default connections
Options: Set timeouts and retries
Options: Set maximum simultaneous downloads
Options: Set scheduled speed limits
Options: Configure sleep prevention
All Downloads: Launch scheduled queue
Active Download Window: Monitor unattended progress
Finished: Confirm completion and history
Unfinished: Review interrupted queue state