6 Commits

Author SHA1 Message Date
52a9d5e43d ci: add set -ex and ls verification to source tarball step
All checks were successful
CI / Format, lint, build, test (push) Successful in 5m59s
CI / Build SRPM (push) Successful in 1m27s
CI / Publish to COPR (push) Successful in 18m55s
Debug why dist/index.html isn't in the tarball despite being built
successfully in the previous step.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:29:27 +03:00
f7f97d084a fix: approve esbuild build script in package.json, remove || true
Some checks failed
CI / Format, lint, build, test (push) Successful in 6m2s
CI / Build SRPM (push) Failing after 34s
CI / Publish to COPR (push) Has been skipped
Use pnpm.onlyBuiltDependencies in both package.json files to
explicitly allow esbuild's postinstall script. This is the proper
declarative mechanism -- no runtime hacks needed in CI.

Remove all || true patterns from the build pipeline.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:19:31 +03:00
95c1164366 ci: debug frontend pre-build in rpm job
Add set -ex, fallback pnpm install, esbuild approval, and ls to
diagnose why dist/ is missing from the source tarball.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:19:31 +03:00
ca89ba18f1 ci: debug frontend pre-build in rpm job
Some checks failed
CI / Format, lint, build, test (push) Successful in 5m57s
CI / Build SRPM (push) Failing after 27s
CI / Publish to COPR (push) Has been skipped
Add set -ex, fallback pnpm install, esbuild approval, and ls to
diagnose why dist/ is missing from the source tarball.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:08:25 +03:00
81a837de99 ci: verify frontend assets are included in source tarball
Some checks failed
CI / Format, lint, build, test (push) Successful in 5m59s
CI / Build SRPM (push) Failing after 24s
CI / Publish to COPR (push) Has been skipped
Add a check that dist/index.html exists in the tarball after
generation. Fails fast if the pre-built frontend wasn't included,
which would cause the desktop app to show "Connection refused".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:00:00 +03:00
f63a8d7647 docs: add COPR badge, install instructions, and systemd section
All checks were successful
CI / Format, lint, build, test (push) Successful in 6m2s
CI / Build SRPM (push) Successful in 1m30s
CI / Publish to COPR (push) Has been skipped
- Add COPR build status badge at the top
- Add "Install from COPR" as the first section
- Add systemd service install instructions for headless server
- Add listen_addr to server config example
- Consolidate build instructions (no tauri-cli needed for release)
- Add monsoon-server to manual install section

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:21:48 +03:00
4 changed files with 54 additions and 31 deletions

View File

@@ -78,13 +78,23 @@ jobs:
- name: Pre-build frontends
run: |
set -ex
pnpm install --frozen-lockfile
pnpm build
cd monsoon-web && pnpm install --frozen-lockfile && pnpm build && cd ..
ls -la dist/
cd monsoon-web
pnpm install --frozen-lockfile
pnpm build
ls -la dist/
cd ..
- name: Generate source tarball
run: |
set -ex
VERSION="${{ steps.version.outputs.VERSION }}"
# Verify dist/ exists before tarring
ls -la dist/index.html
ls -la monsoon-web/dist/index.html
# Include pre-built dist/ and monsoon-web/dist/ so the RPM build
# doesn't need Node.js/pnpm. Write to /tmp to avoid "file changed
# as we read it" from tar writing into the directory it's reading.
@@ -99,6 +109,8 @@ jobs:
--exclude='*.src.rpm' \
.
mv /tmp/monsoon-${VERSION}.tar.gz .
# Verify frontend assets are in the tarball
tar tzf monsoon-${VERSION}.tar.gz | grep "dist/index.html"
- name: Vendor Rust dependencies
run: |

View File

@@ -1,11 +1,21 @@
# Monsoon
[![Copr build status](https://copr.fedorainfracloud.org/coprs/grenade/monsoon/package/monsoon/status_image/last_build.png)](https://copr.fedorainfracloud.org/coprs/grenade/monsoon/package/monsoon/)
A fast BitTorrent client for the GNOME desktop and headless servers, built on the [Vortex](https://github.com/Nehliin/vortex) io-uring engine.
Two interfaces:
- **Desktop app** -- Tauri + Svelte GUI with GNOME integration
- **Headless server** -- REST API + WebSocket + web GUI for remote/LAN deployment
## Install from COPR (Fedora)
```bash
sudo dnf copr enable grenade/monsoon
sudo dnf install monsoon # desktop app
sudo dnf install monsoon-server # headless server
```
## Screenshots
### Torrent List
@@ -20,46 +30,39 @@ Two interfaces:
### Files
![File listing](data/screenshot/torrent-files.png)
## Dependencies
## Building from Source
### Fedora
### Dependencies (Fedora)
```bash
sudo dnf install gtk3-devel webkit2gtk4.1-devel libsoup3-devel \
sudo dnf install rust cargo gcc nodejs pnpm \
gtk3-devel webkit2gtk4.1-devel libsoup3-devel \
pango-devel gdk-pixbuf2-devel glib2-devel libappindicator-gtk3-devel
```
The GTK dependencies are only needed for the desktop app. The headless server has no system library requirements beyond a working Rust toolchain.
The GTK dependencies are only needed for the desktop app. The headless server only requires `rust`, `cargo`, and `gcc`.
### Toolchain
- Rust 1.85+ (edition 2024)
- Node.js 18+
- [pnpm](https://pnpm.io)
- [Tauri CLI](https://tauri.app): `cargo install tauri-cli` (desktop app only)
## Desktop App
### Development
### Desktop App
```bash
pnpm install
cargo tauri dev
pnpm install && pnpm build # build frontend
cargo build --release -p monsoon # build desktop binary (embeds frontend)
```
### Release
For development with hot-reload: `cargo install tauri-cli && cargo tauri dev`
### Headless Server
```bash
pnpm install
cargo tauri build
cd monsoon-web && pnpm install && pnpm build && cd ..
cargo build --release -p monsoon-server
```
The release binary is at `target/release/monsoon` with the frontend assets embedded.
### Install
### Manual Install
```bash
sudo install -Dm755 target/release/monsoon /usr/local/bin/monsoon
sudo install -Dm755 target/release/monsoon-server /usr/local/bin/monsoon-server
sudo install -Dm644 data/cafe.lair.monsoon.desktop /usr/share/applications/cafe.lair.monsoon.desktop
sudo install -Dm644 data/cafe.lair.monsoon.metainfo.xml /usr/share/metainfo/cafe.lair.monsoon.metainfo.xml
sudo install -Dm644 src-tauri/icons/icon.png /usr/share/icons/hicolor/256x256/apps/cafe.lair.monsoon.png
@@ -70,18 +73,11 @@ sudo gtk-update-icon-cache /usr/share/icons/hicolor/
## Headless Server
### Building
```bash
cd monsoon-web && pnpm install && pnpm build && cd ..
cargo build --release -p monsoon-server
```
### Running
```bash
# With web GUI (run from the repo root, or set MONSOON_WEB_DIR)
cargo run --bin monsoon-server
monsoon-server
# Or with explicit web asset path
MONSOON_WEB_DIR=/path/to/monsoon-web/dist monsoon-server
@@ -89,6 +85,13 @@ MONSOON_WEB_DIR=/path/to/monsoon-web/dist monsoon-server
The server listens on `0.0.0.0:3000` by default. Open `http://server-ip:3000` in a browser for the web GUI.
### Systemd
```bash
sudo install -Dm644 data/monsoon-server.service /usr/lib/systemd/system/monsoon-server.service
sudo systemctl enable --now monsoon-server
```
### REST API
| Method | Endpoint | Description |
@@ -138,12 +141,14 @@ Configure in `~/.config/monsoon/config.toml`:
```toml
[server]
listen_addr = "0.0.0.0:3000"
max_concurrent_downloads = 3
min_peers_before_queue = 2
seed_completed_by_default = true
webhook_url = "http://localhost:8080/hook"
```
- **listen_addr** -- HTTP API and web GUI listen address (default `0.0.0.0:3000`)
- **max_concurrent_downloads** -- new torrents are queued when all slots are full; the next queued torrent auto-starts when a slot frees up
- **min_peers_before_queue** -- if a torrent has fewer peers than this and download speed is below 1 KiB/s for 30 consecutive seconds, it rotates to the back of the queue
- **seed_completed_by_default** -- when `false`, completed torrents are paused instead of seeding

View File

@@ -8,6 +8,9 @@
"build": "vite build",
"preview": "vite preview"
},
"pnpm": {
"onlyBuiltDependencies": ["esbuild"]
},
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^5.0.0",
"svelte": "^5.0.0",

View File

@@ -9,6 +9,9 @@
"preview": "vite preview",
"tauri": "tauri"
},
"pnpm": {
"onlyBuiltDependencies": ["esbuild"]
},
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^5.0.0",
"@tauri-apps/api": "^2.5.0",