Skip to content
This repository was archived by the owner on Oct 17, 2026. It is now read-only.
murdawkmediaPublic archive

About

Desktop file browser and resumable transfer manager for DigitalOcean Spaces, powered by rclone.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Murdawk Uplink

Murdawk Uplink is a desktop file browser and resumable transfer manager for DigitalOcean Spaces, powered by rclone. It uploads, downloads, verifies, and recovers large media transfers through a Drive-style interface.

Features

  • Browse multiple DigitalOcean Spaces from one desktop app.
  • Drag files and folders into the current remote folder.
  • Pre-check every upload, transfer it with retries, and verify the remote result.
  • Download mixed selections of files and folders into one local destination.
  • Pause supported transfers and recover interrupted work after a restart or power loss.
  • Opt into automatic recovery of interrupted uploads when the app opens again.
  • Preview PNG, JPEG, WebP, GIF, and AVIF images without exposing storage credentials to the renderer.
  • Import and export connection packages, with optional password-encrypted credentials.
  • Reconcile manifest-driven event folders and queue only missing files.
  • Inspect durable activity, local redacted logs, progress, speed, and practical ETAs.
  • Choose Balanced or Fast for new upload batches, with frozen settings and sustained-speed guidance.
  • Expose a narrow local API and MCP adapter for browsing and queue preparation.

The standalone desktop’s local API, MCP, and event reconcile screen only prepare jobs. A person reviews and starts transfer work in the app.

Requirements

  • Windows 10 or later, or Linux (x64 desktop package)
  • Node.js 22 or later for development
  • rclone available on PATH
  • A DigitalOcean Spaces account and an rclone S3 profile

Install

Download the desktop package from GitHub Releases. On Windows, extract the ZIP and run Murdawk Uplink.exe. On Linux, mark the AppImage executable and open it. Install rclone separately and make it available on PATH. Releases include checksums; no account credentials or saved connections are bundled.

To run from source, clone the repository, install dependencies, and start the development build:

git clone https://github.com/murdawkmedia/murdawk-uplink.git
Set-Location .\murdawk-uplink\app
npm ci
npm start

To create a desktop shortcut for the installed app or development checkout:

Set-Location ..
powershell -ExecutionPolicy Bypass -File .\scripts\install-desktop-shortcut.ps1

The installer script prefers an installed per-user build and otherwise uses the repository-relative launcher. It does not embed the checkout location in source control.

Connections

Open Connections to add an existing rclone profile or create a DigitalOcean Spaces profile. Uplink stores only non-secret connection metadata such as the profile name, Space name, endpoint, and display name. Credentials stay in the user's local rclone configuration.

For a new connection, enter your own Space name and region, then expand Create the rclone profile with Spaces keys and supply your Spaces access key and secret key. These are Spaces credentials, rather than a general DigitalOcean API token. The setup saves them into your local rclone profile; it does not send them to Murdawk Media or bundle them with the app. Existing rclone profiles can be selected without entering keys again.

Connection exports omit credentials by default. A user may explicitly include credentials in a password-encrypted package after acknowledging the warning. Import shows a connection preview and requires confirmation before saving anything locally.

Fictional example values used by the project are:

Connection name: Media Archive
rclone profile: media
Space: media-archive
Endpoint: nyc3.digitaloceanspaces.com

Transfers And Recovery

Choose Upload preset for new batches in Advanced or Transfers > Options. Balanced keeps the default settings. Fast increases parallelism and uses about 2 GiB of multipart buffers, compared with about 1 GiB for Balanced. Very large files can use more memory. Speed also depends on the network, local disk and storage service. These estimates follow rclone's memory formula.

Each batch captures its preset when added. Choosing another preset affects newly added batches; current, queued and resumed batches retain their original settings. The choice is saved for the next app launch. Older batches use Balanced. A slow Balanced upload can offer Use Fast for new batches after two minutes of fresh speed observations below 10 MiB/s. The action saves a preference without starting or restarting work.

CLI dry-runs accept --performance-preset balanced|fast. Public API/MCP preparation accepts options.performancePreset; context lists preset details and estimated buffer memory.

Open a destination folder, then drag files or folders into the Explorer or use Upload files and Upload folder. The transfer shelf shows each job moving through clear stages:

Checking -> Ready -> Uploading -> Verifying -> Complete

Folders upload as a package by default, so a local assets folder becomes destination/assets/.... Empty leaf folders are represented by verified .keep objects.

Use Transfers to watch live work. Each row represents one batch of selected files or folders. New batches appear immediately as Saving queue, then move through checking, transfer, and verification. Active work appears before batches that need attention, waiting work, and finished history. Clear finished removes verified batches from this view. Advanced provides manual queue controls and detailed diagnostics in panels that stay steady during progress updates.

While a transfer runs, keep browsing, create new destination folders, and add more batches with drag-and-drop or the file and folder pickers. Each batch keeps the destination chosen when it was added and waits behind the active transfer. New folder markers use an independent command so they do not interrupt upload progress or verification.

Queue state and run history survive restarts. By default, interrupted or paused batches wait for Check and resume. Every resume performs a fresh remote pre-check, skips matching objects, and transfers what is still needed. A full progress bar is not treated as completion until verification succeeds.

To recover interrupted uploads automatically, open Transfers > Options and enable Resume interrupted uploads on launch. When closing during an upload, choose Close and resume on launch. Uplink saves the batch, pauses safely, and checks its saved destination when you next open the app. Unexpected interruptions also qualify. Batches paused with the regular Pause button, cancelled work, and failed jobs stay held. Completed files are skipped; an unfinished file may upload again from the beginning. This option does not launch Uplink when Windows starts. See Restart recovery.

Downloads use the same transfer shelf and recovery model. Select files and folders together, choose Download, and select a local destination.

Event Manifests

Event manifests describe an event prefix, recording stages, days, local roots, and non-secret transfer defaults. Open Advanced, choose Open manifest, select local roots, and run Reconcile. Reconcile is read-only and separates matched, missing, size-mismatched, and ambiguous files. Queue Missing prepares guarded jobs without starting an upload.

A fictional example is available at examples/sample-event-manifest.json. Private manifests and local media paths should remain outside the repository.

The CLI can also create and use a generic manifest:

Set-Location .\app
npm run cli -- event manifest --output '..\sample-event.json'
npm run cli -- event reconcile --manifest '..\sample-event.json' --local-root '<local event root>' --output '.runs\sample-event-reconcile'
npm run cli -- event queue-missing --manifest '..\sample-event.json' --reconcile '.runs\sample-event-reconcile\reconcile.json' --dry-run

See Event Workspace Reconcile for the manifest shape and safety rules.

Local API And MCP

The app can create a revocable local API key and one-time MCP configuration from Connections > Automation access. The service binds only to 127.0.0.1 and exposes an allowlisted set of read and queue-preparation capabilities. It does not expose credentials or destructive remote operations.

Keys are shown once. Revoke and replace a lost key rather than trying to recover it.

CLI

The local CLI shares the app's rclone credential boundary:

Set-Location .\app
npm run cli -- check
npm run cli -- list 'sample-event/recordings' --json
npm run cli -- inventory 'sample-event/recordings/raw'
npm run cli -- dry-run --source '<local path>' --prefix 'sample-event/recordings/raw' --filter all --folder-mode package
npm run cli -- upload --source '<local path>' --prefix 'sample-event/recordings/raw' --json
npm run cli -- status --job '<job-id>' --json

The CLI intentionally omits delete, purge, move, and rename operations.

Security

Never commit credentials, connection packages, private manifests, local logs, or personal paths. See SECURITY.md for the credential boundary, connection-package behavior, and private vulnerability reporting process.

Building

From app/:

npm ci
npm run pack

npm run pack creates an unpacked Windows build under the ignored dist/ directory. npm run dist creates installer and portable artifacts.

Testing

From app/:

npm test
npm run ui:smoke
npm audit --audit-level=low

The UI smoke test runs against a mocked local Electron environment. It does not configure rclone or access a remote Space.

Contributing

Read CONTRIBUTING.md before opening a pull request. Transfer safety, credential handling, and fictional test data are release requirements.

License

Murdawk Uplink is licensed under the Apache License 2.0.

Optional team service

Version 0.2.0 adds an optional background API and MCP service, named scoped team keys, public OAuth, resumable file intake and a desktop service workspace. The common Node service runs on Windows and Linux; native desktop packages share the same source and version. See Optional API and MCP service for installation, permissions, recovery and client setup. The standalone desktop remains the default.

About

Desktop file browser and resumable transfer manager for DigitalOcean Spaces, powered by rclone.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages